一、消息發布
PUBLISH控制報文不光是客戶端發送給服務端,也能服務端發送給客戶端,就是個傳遞應用消息的。
1.固定頭
推送的固定頭報文類型是3。
DUP是重發標志,如果DUP標志被設置為0,表示這是客戶端或服務端第一次請求發送這個PUBLISH報文。如果DUP標志被設置為1,表示這可能是一個早前報文請求的重發。
Qos是服務質量等級,有三種狀態。
RETAIN是保留位,保留位的意義上一篇已經闡述。值得注意的是如果想清除一個在服務端有保留有效荷載的topic,只要發送一個保留位為1切有效荷載為零字節的publish報文就行,
服務端會把這個空報文轉發給訂閱者,並清除這個topic的保留信息,后續再關注這個topic的客戶端不會再收到消息了。
2.可變頭
可變報頭按順序包含主題名和報文標識符。
主題名就是平時說的topic,推送訂閱都是依靠這個標識,可以理解為其他mq的topic。
報文標識符就是報文的id,服務端用來唯一標識報文的屬性,只有當QoS等級是1或2時,報文標識符(Packet Identifier)字段才能出現在PUBLISH報文中,因為這倆需要服務端答復
客戶端,如果沒有這個標識,服務端不知道要針對哪條報文進行答復。
可變頭示例:
示例中的主題名為 “a/b”,長度等於3,報文標識符為 “10”
3.有效載荷
有效載荷包含將被發布的應用消息。數據的內容和格式是應用特定的。有效載荷的長度這樣計算:用固定報頭中的剩余長度字段的值減去可變報頭的長度。包含零長度有效載荷的PUBLISH報文是合法的。
注意:根據固定頭中的qos等級,接收到publish報文端需要給予響應。
這里補充一下qos:
qos0:最多就發送一次,你別告訴我你收沒收到,你找到訂閱這個主題的你就推就行。
qos1:至少發送一次,發送完你告訴我你收沒收到(PUBACK),如果你不告訴我,我就一直發。
qos2:確保一次送達,我給你發(PUBLISH),你給我回一個你收到了(PUBREC),我再給你發一個你確定你收到了嗎(PUBREL),你再給我回一個收到了別發了求你了(PUBCOMP)
二、發布確認
PUBACK報文是對QoS 1等級的PUBLISH報文的響應。
1.固定頭
沒啥說的,類型4.
2.可變頭
可變頭就倆個字節。就是報文標識符。
3.有效載荷
無
三、發布收到
PUBREC報文是對QoS等級2的PUBLISH報文的響應。它是QoS 2等級協議交換的第二個報文。
1.固定頭
沒啥說的,類型5.
2.可變頭
可變頭就倆個字節。就是報文標識符。
3.有效載荷
無
四、發布釋放
PUBREL報文是對PUBREC報文的響應。它是QoS 2等級協議交換的第三個報文。
1.固定頭
沒啥說的,類型6.
2.可變頭
可變頭就倆個字節。就是報文標識符。
3.有效載荷
無
五、發布完成
PUBCOMP報文是對PUBREL報文的響應。它是QoS 2等級協議交換的第四個也是最后一個報文。
1.固定頭
沒啥說的,類型7.
2.可變頭
可變頭就倆個字節。就是報文標識符。
3.有效載荷
無