第 2 章 · 01 报文的三个组成部分


文档摘要

第 2 章 · 01 报文的三个组成部分 本节摘要:所有 MQTT 控制报文都遵循同一套"三段式"骨架——固定报头(Fixed Header)、可变报头(Variable Header)、有效载荷(Payload)。固定报头是每报文的身份证,可变报头与有效载荷按报文类型取舍。记住"全有固定报头,其余看类型"这一句,整章的格式图都不会再晕。读完本节,你应当能对着任意一种报文说清它由哪几段组成。 学习目标 阅读完本节,你应当能够: 说出 MQTT 控制报文的三段式结构及每段的作用。 判断任意一种报文是否有可变报头、是否有有效载荷。 理解"剩余长度"字段统计的范围为什么是"可变报头 + 有效载荷"。

第 2 章 · 01 报文的三个组成部分

本节摘要:所有 MQTT 控制报文都遵循同一套"三段式"骨架——固定报头(Fixed Header)可变报头(Variable Header)有效载荷(Payload)。固定报头是每报文的身份证,可变报头与有效载荷按报文类型取舍。记住"全有固定报头,其余看类型"这一句,整章的格式图都不会再晕。读完本节,你应当能对着任意一种报文说清它由哪几段组成。

学习目标

阅读完本节,你应当能够:

  1. 说出 MQTT 控制报文的三段式结构及每段的作用。
  2. 判断任意一种报文是否有可变报头、是否有有效载荷。
  3. 理解"剩余长度"字段统计的范围为什么是"可变报头 + 有效载荷"。

一、三段式骨架

MQTT 协议通过交换控制报文通信,每种控制报文都由三段按顺序拼接而成:

是否必有 作用
固定报头 Fixed Header 所有报文必有 声明报文类型、标志位、以及后面两段的总字节数
可变报头 Variable Header 部分报文有 存放与具体报文类型相关的字段(如报文标识符、协议名、连接标志)
有效载荷 Payload 部分报文有 承载报文的"内容"(如 CONNECT 的客户端标识符、PUBLISH 的应用消息)

一个直观的类比:固定报头是信封上的收件人地址,可变报头是信件主题,有效载荷是信纸内容。三种邮件都有地址;平信有主题和内容,而有的单据只有地址和主题。

二、哪些报文有哪几段

下面把 14 种报文的三段有无情况完整列出(与第 1 章的类型值一一对应):

报文 固定报头 可变报头 有效载荷
CONNECT ✔(协议名之后是客户端标识符等)
CONNACK
PUBLISH ✔(主题名,QoS>0 时含报文标识符) 可选(应用消息可为零字节)
PUBACK / PUBREC / PUBREL / PUBCOMP ✔(仅报文标识符 2 字节)
SUBSCRIBE ✔(仅报文标识符) ✔(主题过滤器列表)
SUBACK ✔(仅报文标识符) ✔(返回码列表)
UNSUBSCRIBE ✔(仅报文标识符) ✔(主题过滤器列表)
UNSUBACK ✔(仅报文标识符)
PINGREQ / PINGRESP
DISCONNECT

💡 规律:
① 凡是"纯控制类"的短报文(PUBACK/PUBREC/PUBREL/PUBCOMP/SUBACK/UNSUBACK)只有"固定报头 + 2 字节报文标识符";
② PINGREQ/PINGRESP/DISCONNECT 最简,连可变报头都没有,只剩固定报头;
③ 只有 CONNECT、PUBLISH、SUBSCRIBE、SUBACK、UNSUBSCRIBE 五种带有效载荷。

三、剩余长度统计的是谁

固定报头的第二个字段——剩余长度(Remaining Length)——表示"当前报文剩余部分的字节数",即可变报头 + 有效载荷的总字节数,且不包括编码剩余长度字段本身的字节数。

例如一个 PUBLISH 报文:主题名编码占 5 字节、报文标识符 2 字节、应用消息 100 字节,则剩余长度 = 5 + 2 + 100 = 107(单字节即可编码)。

这个字段是所有报文都有的,而它最大的坑在于变长编码——同一个长度值,字节数可能不同。下一节专门讲它。

小结

三段式骨架是阅读第 3 章所有格式图的"总纲":先看固定报头确定类型与长度,再按类型决定后面两段怎么解析。PINGREQ 只有 2 个字节(固定报头 1 字节 + 剩余长度 1 字节)就能完成一次心跳,正是骨架极简的体现。


发布者: 作者: 灏天文库 转发
评论区 (0)
U