很多控制报文的可变报头部分包含一个两字节的报文标识符字段。这些报文是 PUBLISH(QoS > 0时), PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE, SUBACK,UNSUBSCIBE,UNSUBACK。
SUBSCRIBE,UNSUBSCRIBE和PUBLISH(QoS大于0)控制报文必须包含一个非零的16 位报文标识符(Packet Identifier)[MQTT-2.3.1-1]。客户端每次发送一个新的这些类型的报文 时都必须分配一个当前未使用的报文标识符 [MQTT-2.3.1-2]。如果一个客户端要重发这个特 殊的控制报文,在随后重发那个报文时,它必须使用相同的标识符。当客户端处理完这个报 文对应的确认后,这个报文标识符就释放可重用。QoS 1的PUBLISH对应的是PUBACK, QoS 2的PUBLISH对应的是PUBCOMP,与SUBSCRIBE或UNSUBSCRIBE对应的分别是 SUBACK或UNSUBACK [MQTT-2.3.1-3]。发送一个QoS 0的PUBLISH报文时,相同的条件也 适用于服务端 [MQTT-2.3.1-4]。
QoS等于0的PUBLISH报文不能包含报文标识符 [MQTT-2.3.1-5]。
PUBACK, PUBREC, PUBREL报文必须包含与最初发送的PUBLISH报文相同的报文标识符 [MQTT-2.3.1-6]。类似地,SUBACK和UNSUBACK必须包含在对应的SUBSCRIBE和 UNSUBSCRIBE报文中使用的报文标识符 [MQTT-2.3.1-7]。
**1.所谓的报文标识符号,我暂且将其理解成ID, 上面各种报文,我可以理解成是信件
假设古代人行军打仗有各种信都是通过不同颜色的鸡毛来确定的。这个鸡毛的颜色就是标识符,这样理解对吗?是每一种的报文有自己单独的ID 还是每一种报文的每一次都要有不同的ID呢?
2. 为什么Qos0的时候不能有标识符号?
3. 我在规范中还看到一句话,“客户端发送标识符为0x1234的PUBLISH报文,它有可能会在收到那个报文的PUBACK之前, 先收到服务端发送的另一个不同的但是报文标识符也为0x1234的PUBLISH报文。” ID居然可以相同?实在是没有办法理解
**