5.1.1 固定报头(fixed header)
图 5-1 CONNECT 固定报头报文
Connect 名称的值为 1, 低四位保留, 剩余长度保存可变报头 (10 字节) 加上有效载荷的长度.
5.1.2 可变报头(variable header)
Connect 报文的可变报头包含协议名, 协议等级, 连接标志和保持连接
图 5-2 CONNECT 可变报头报文
报文协议名之前有两个字节的报文标识符, 唯一标识这条报文.
连接标志包含用户名标志(username flag), 密码标志(password flag), 遗嘱标志(will flag), 遗嘱服务指令(will Qos), 遗嘱保留标志(will retain), 清除会话标志(clean session), 保留位(reserved).
用户名标志(username flag): 若用户名标志被置为 1, 有效载荷中必须包含用户名字段.
密码标志(password flag): 若密码标志被置为 1, 有效载荷中必须包含密码字段, 当用户标志被置为 0 时, 密码标志必须被置 0..
遗嘱标志 (will flag): 若遗嘱标志被置 1, 遗嘱服务指令(will Qos) 与遗嘱保留标志 (will retain) 会被服务器用到, 遗嘱消息中必须包含 will topic 和 will message.
遗嘱服务指令(will Qos): 如果遗嘱标志被设置为 0, 遗嘱 QoS 也必须设置为 0(0x00), 如果遗嘱标志被设置为 1, 遗嘱 QoS 的值可以等于 0(0x00),1(0x01),2(0x02). 它的值不能等 于 3.
遗嘱保留标志(will retain): 若遗嘱保留标志位被置位, 服务器将保留遗嘱消息(保留发布), 当客户端异常断开连接时将遗嘱发给订阅遗嘱主题的客户.
清除会话标志(clean session): 标志被设置为 1, 客户端和服务端必须丢弃之前的任何会话并开始一个新的会话(之前的订阅与发布消息被删除), 若标志为 0, 恢复与服务器会话连接, 若没有连接 新建一个会话连接(不删除之前与客户端的会话信息并保存断开本次会话之后的 Qos1 与 Qos2 消息).
保留位(reserved): 如果不为 0 必须断开客 户端连接.
报文最后两字节为发送心跳包的间隔时间, 当客户端没有数据发给服务器时, 须发送心跳包 (pingreq) 到服务器, 保证连接不断开.
5.1.3 有效载荷(Payload)
CONNECT 报文的有效载荷 (payload) 包含一个或多个以长度为前缀的字段, 可变报头中的 标志决定是否包含这些字段. 如果包含的话, 必须按这个顺序出现: 客户端标识符, 遗嘱主题, 遗嘱消息, 用户名, 密码.
客户端标识符(client identifier): 服务器通过识别客户标识符, 确定客户端, 识别两者间的 MQTT 会话相关状态, 服务器允许客户端提供一个零字节的标识符, 但 clean session 必须置 1.
图 5-3 CONNECT 消息报文
5.2 连接请求确认(CONNACK)
Connack 为服务器确认客户端连上服务给出的回应.
5.2.1 固定报头(fixed header)
图 5-4 CONNACK 固定报头报文
5.2.2 可变报头(variable header)
图 5-5 CONNACK 可变报头报文
第一字节 1~7 位保留, 第 0 位是当前会话标志(session present), 若清除会话标志被置 1, 该位为 0, 若清除会话标志为 0 且服务器没有与客户端会话保存, 该位置 0, 有保存置 1
第二字节保存连接返回码, 若连接成功返回 0.
图 5-6 连接返回码
图 5-7 CONNECT 响应报文
5.3 发布消息(PUBLISH)
发布消息可由客户端或服务器发出, 被消息订阅者接收.
5.3.1 固定报头(fixed header)
图 5-8 PUBLISH 固定报头报文
固定报头第一字节的低四位分别保存重发标志(DUP), 服务质量(Qos), 保留标志(RETAIN).
重发标志(DUP): 当该位被置 1, 表示该条报文为重发报文, 客户端或服务端请求重发一个 PUBLISH 报文时, 必须将 DUP 标志设置为 1. 对于 QoS 0 的消息, DUP 标志必须设置为 0.
服务质量(Qos): 表示发送质量, 取值有 00 01 10.
保留标志 (RETAIN): 若该位被置 1, 表示服务器必须保存其应用消息和质量等级, 若为 0, 表示该消息不须保存, 如果服务端收到一条保留(RETAIN) 标志为 1 的 QoS 0 消息, 它必须丢弃之前为那个主题保留的任何消息. 它应该将这个新的 QoS0 消息当作那个主题的新保留消息, 但是任何时候都可以选择丢弃它, 保留标志为 1 且有效载荷为零字节的 PUBLISH 报文会被服务端当作正常消息处理, 它会被发送给订阅主题匹配的客户端. 此外, 同一个主题下任何现存的保留消息必须被移除, 因此这个主题之后的任何订阅者都不会收到一个保留消息.
5.3.2 可变报头(variable header)
可变报头按顺序包含主题名和报文标识符.
5.3.3 有效载荷(Payload)
若 Qos 为 0, 无响应, 若 Qos 为 1, 返回 PUBACK 报文, 若 Qos 为 2, 返回 PUBREC 报文.
图 5-9 publish 消息报文
5.4 发布确认(PUBACK)
由服务器或客户端确认已接收到 pub 消息
5.4.1 固定报头(fixed header)
图 5-10 puback 固定报头报文
5.4.2 可变报头(variable header)
只有两字节的报文标识(报文标识为 pub 报文标识)
图 5-11 puback 消息报文
5.5 发布收到 PUBREC(QoS 2, 第一步)
5.5.1 固定报头(fixed header)
图 5-12 pubrec 固定报头报文
5.5.2 可变报头(variable header)
只有两字节的报文标识(报文标识为 pub 报文标识)
图 5-13 pubrec 消息报文
5.6 发布释放 PUBREL(QoS 2, 第二步)
5.6.1 固定报头(fixed header)
图 5-14 pubrel 固定报头报文
5.6.2 可变报头(variable header)
只有两字节的报文标识(报文标识为 pub 报文标识)
图 5-15 pubrel 消息报文
5.7 发布完成 PUBCOMP(QoS 2, 第三步)
5.7.1 固定报头(fixed header)
图 5-16 pubcomp 固定报头报文
5.7.2 可变报头(variable header)
只有两字节的报文标识(报文标识为 pub 报文标识)
图 5-17 pubcomp 消息报文
5.8 订阅主题(SUBSCRIBE)
客户端通过订阅消息的方式来接收服务端下发的消息
5.8.1 固定报头(fixed header)
SUBSCRIBE 控制固定报头的第 3,2,1,0 位是保留位, 必须分别设置为 0,0,1,0. 服务端必须将其它的任何值都当做是不合法的并关闭网络连接
图 5-18 subscribe 固定报头报文
5.8.2 可变报头(variable header)
只有两字节的报文标识
5.8.3 有效载荷(Payload)
图 5-19 subscribe 有效载体报文
消息载体包含若干主题过滤器和服务质量等级
PUB 时指定的 qos 是服务器肯定按此规则接收, 但是最终订阅者不一定.
SUB 时指定的 qos 表示订阅者可以接收的最高消息等级, 也就是可能收到更低等级的消息
图 5-20 subscribe 消息报文
5.9 订阅确认(SUBACK)
SUBACK 报文包含一个返回码清单, 它们指定了 SUBSCRIBE 请求的每个订阅被授予的最大 QoS 等级.
5.9.1 固定报头(fixed header)
图 5-21 suback 固定报头报文
5.9.2 可变报头(variable header)
只有两字节的报文标识
5.9.3 有效载荷(Payload)
图 5-22 suback 有效载体报文
允许的返回码为 0x00 - 最大 Qos0,0x01 - 最大 Qos1,0x02 - 最大 Qos2,0x80 - 失败
图 5-23 suback 消息报文
5.10 取消订阅 (UNSUBSCRIBE)
5.10.1 固定报头(fixed header)
图 5-24 unsubscribe 固定报头报文
5.10.2 可变报头(variable header)
只有两字节的报文标识
5.10.3 有效载荷(Payload)
包含需要取消订阅的主题过滤器的列表.
图 5-25 unsubscribe 消息报文
5.11 取消订阅确认 (UNSUBACK)
5.11.1 固定报头(fixed header)
图 5-26 unsuback 固定报头报文
5.11.2 可变报头(variable header)
只有两字节的报文标识(报文标识为 unsub 报文标识)
图 5-27 unsuback 消息报文
5.12 心跳请求 (PINGREQ)
客户端发送 PINGREQ 报文给服务端的. 用于:
1. 在没有任何其它控制报文从客户端发给服务的时, 告知服务端客户端还活着.
2. 请求服务端发送 响应确认它还活着.
3. 使用网络以确认网络连接没有断开
5.12.1 固定报头(fixed header)
图 5-28 pingreq 固定报头报文
图 5-29 pingreq 消息报文
5.13 心跳响应 (PINGRESP)
5.13.1 固定报头(fixed header)
图 5-30 pingresp 固定报头报文
图 5-31 pingresp 消息报文
5.14 断开连接 (DISCONNECT)
5.14.1 固定报头(fixed header)
图 5-32 disconnect 固定报头报文
图 5-33 disconnect 消息报文
抓包注意: 用标准不加密 MQTT 能抓到便于查看的报文, 加密报文解析时不便于理解
创作不易, 白嫖不好, 各位的支持和认可, 就是我创作的最大动力, 我们下篇文章见!
清风 | 文 [原创]
如果本篇博客有任何错误, 请批评指教, 不胜感激 !
来源: https://www.cnblogs.com/wdg-blog/p/12532836.html