回答:
報文是網絡中交換和傳輸的數據單元,也是網絡傳輸的單元。報文包含了將要發送的完整的數據信息,其長短不需一致。報文在傳輸過程中會不斷地封裝成分組、包、幀來傳輸,封裝的方式就是添加一些控制信息組成的首部,那就是報文頭。
mqtt協議報文結構
固件報頭Fixed header
最多一次(0), 發出去了就不管了
至少一次(1),發出必須要等接收方回復ack,沒有回復,那么就找時機重發,接收方需要處理去重
準確一次(2),保證只發一次,需要持久化,重復消息自動去重,并且只有當接收方把消息投遞出去,才算完成
控制報文的類型 Control Packet type,14種有效類型: [connect, publish, subscribe,.....]
第一個1個字節前4位,
標志Flags,
第一個1個字節后4位,
DUP 控制報文是否為重復報文,只有PUBLISH才會有DUP為1的情況,其他的報文類型都是0
QoS 控制PUBLISH報文的質量等級,
publish
publish - pubrec
publish - pubrec - pubrel - pubcomp
RETAIN,
每個topic只有唯一的保留消息,每個client訂閱的時候,會立刻讀取到保留消息
如果訂閱者無法與broker連接,可以通過retain消息,讓訂閱者下次連接訂閱成功時一次接受所有的內容
發布者定時發布retain消息,訂閱者可以根據retain消息的變化推測發布者狀態
剩余長度 Remaining Length
從第二個字節開始,最大長度是4個字節,低位在前,高位在后,通過每一個字節第一位[0不需要,1需要]確定是否需要繼續往后繼續計算,也就是最多可以存儲256M, 最大值16進制為:0xFF,0xFF,0xFF,0x7F
可變報頭Variable header
可變報文部分是根據不同的報文類型,這部分的內容也不同
比如: 連接報文會有用戶名密碼標識,遺囑標識,是否清理會話標識等,發布報文會有topic信息
報文標識符 PackageIdentifier [messageId]
標識符作用:
2個字節最大65535
這些報文類型需要:PUBLISH(QoS > 0), PUBACK, PUBREL, PUBCOMP, SUBSCRIBE,SUBACK, UNSUSCRIBE,UNSUBACK
重發使用相同的標識符
確認后釋放標識符
有效載荷Payload
以下這些報文類型才有payload:
CONNECT(用戶名密碼,遺囑消息,遺囑topic,客戶端標識),
PUBLISH(可有可無,根據實際情況),
SUBSCRIBE(訂閱的topic信息集合),
SUBACK(按順序返回的訂閱的topic的報文質量等級集合)
UNSUBSCRIBE(取消訂閱的topic信息集合)
報文類型處理邏輯(接收方的處理邏輯)
CONNECT 連接服務端 客戶端--服務端
報文解析錯誤:
如果報文解析錯誤,連接失敗
如果解析的報文標識符不合法,連接失敗
報文解析成功
重發QoS1的未完成的消息
重發QoS2的未完成的消息
連接成功,保存會話信息
連接成功,回會CONNACK報文給客戶端
如果之前保存的會話信息,cleanSession == true,需要清空保存的session,訂閱信息,需要重發的發布QoS1報文,需要重發的發布的QoS2的報文
關閉之前的保存的會話
如果報文標識符不存在,連接失敗
如果用戶密碼驗證失敗,連接失敗
如果是會話中已經存在該連接,說明是發送重復的連接報文
檢查心跳包,將已經存在的心跳包的間隔時間,更新成客戶端指定的時間
如果連接報文中存在遺囑消息,需要將遺囑消息保存在本次連接的會話對象中
如果本次連接的報文cleanSession == false,也就是不清理會話,如果是客戶端重連的,可能存在服務端有部分信息沒有發送出去,需要重新發送給該客戶端
CONNACK 確認連接請求 服務端--客戶端
客戶端確認連接成功
PUBLISH 發布消息 雙向
客戶端發送給服務端,是為了將報文分發到其他訂閱匹配的客戶端
服務端發送給客戶端,是為了發消息給匹配訂閱的客戶端
根據不同的質量等級進行不同的回復報文
QoS 0 直接publish消息即可
QoS 1 PUBLISH消息之后,還需要回復PUBACK給來源客戶端
Qos 2 PUBLISH消息之后,還需要回復PUBREC給來源客戶端 (后續客戶端端發送PUBREL,再服務端發送PUBCOMP完成整個生命周期)
如果是保留消息,需要覆蓋之前保存的保留消息
PUBACK 發布確認 雙向
帶著messageId回復發布方,通知發布成功
PUBAREC 發布收到 雙向
帶著messageId回復發布方,通知收到了發布報文
PUBREL 發布釋放 雙向
帶著messageId回復接收方,可以釋放報文
PUBCOMP 發布完成 雙向
帶著messageId回復發布方,可以發布完成了
SUBSCRIBE 訂閱主題 客戶端--服務端
根據訂閱的主題列表,
保存訂閱信息
回復SUBACK,按順序返回訂閱報文中的報文質量等級集合
根據訂閱的主題,處理服務端保留信息,立即PUBLISH給客戶端
SUBACK 訂閱確認 服務端-- 客戶端
客戶端確認訂閱成功
UNSUBSCRIBE 取消訂閱 客戶端--服務端
移除掉該客戶端保存的訂閱主題
回復UNSUBACK報文
UNSUBACK 訂閱確認 服務端-- 客戶端
客戶端確認取消訂閱成功
PINGREQ 心跳請求 客戶端--服務端
返回客戶端PINGRESP報文
PINGRESP 心跳響應 服務端--客戶端
收到報文確認服務端正常
免責聲明:本網站部分文章、圖片等信息來源于網絡,版權歸原作者平臺所有,僅用于學術分享,如不慎侵犯了你的權益,請聯系我們,我們將做刪除處理!