久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

MQTT 5.0 報文解析 05:DISCONNECT

 EMQ映云科技 2024-06-05 發(fā)布于上海

歡迎閱讀 MQTT 5.0 報文系列 的第五篇文章,。在上一篇中,,我們已經(jīng)介紹了 MQTT 5.0 的 PINGREQ 和 PINGRESP 報文。現(xiàn)在,,我們將介紹下一個控制報文:DISCONNECT,。

在 MQTT 中,客戶端和服務端可以在斷開網(wǎng)絡連接前向?qū)Χ税l(fā)送一個 DISCONNECT 報文,,來指示連接關(guān)閉的原因,。客戶端發(fā)送的 DISCONNECT 報文還可以影響服務端在連接斷開后的行為,,例如是否發(fā)送遺囑消息,,是否更新會話過期間隔。

DISCONNECT 報文示例

我們使用 MQTTX CLI 向 公共 MQTT 服務器 發(fā)起一個指定了 Client ID 的客戶端連接,,并將 --reconnect-period  置為 0 來禁用自動重連,然后在另一個終端中運行相同的命令創(chuàng)建一個使用相同 Client ID 的連接,。

整個過程使用 Wireshark 工具來抓取在客戶端與服務器之間往返的 MQTT 報文,,Linux 環(huán)境可以使用 tcpdump 命令抓取報文,然后導入至 Wireshark 分析,。

以下命令將創(chuàng)建一個 Client ID 為 mqtt-892324 的客戶端連接,,為了避免 Client ID 與別人重復,建議將它改為其他隨機字符串:

mqttx conn --hostname broker.emqx.io --mqtt-version 5 --client-id mqtt-892324 \ --reconnect-period 0

在我們發(fā)起第二個連接后,,Wireshark 將捕獲到公共 MQTT 服務器返回給第一個連接的 DISCONNECT 報文:

e0 02 8e 00

這四個十六進制字節(jié),,對應著以下報文內(nèi)容:

DISCONNECT Packet.png

通過下文對 DISCONNECT 報文結(jié)構(gòu)的介紹,你將了解到如何從原始的報文數(shù)據(jù)中提取你想要的信息,。

DISCONNECT 報文結(jié)構(gòu)

固定報頭

固定報頭首字節(jié)的高 4 位,,即報文類型字段的值為 14(0b1110),低 4 位全部為 0,,表示這是一個 DISCONNECT 報文,。

Fixed Header.png

可變報頭

DISCONNECT 報文的可變報頭按順序包含以下字段:

Viriable Header.png

  • 原因碼(Reason Code):一個單字節(jié)的無符號整數(shù),用于向?qū)Χ酥甘具B接斷開的原因,。下表列出了在 DISCONNECT 報文中常見的 Reason Code,,完整列表可參閱 MQTT 5.0 Reason Code 速查表

ValueReason Code NameSent ByDescription
0x00Normal disconnection客戶端,、服務端表示連接正常關(guān)閉,,因此服務端不會發(fā)布遺囑消息,。
0x04Disconnect with Will Message客戶端連接正常關(guān)閉,但客戶端希望服務端仍然發(fā)布遺囑消息,。
0x81Malformed Packet客戶端,、服務端表示收到了無法按照協(xié)議規(guī)范正確解析的控制報文,在 MQTT 中我們將這類報文稱為畸形報文,。
0x82Protocol Error客戶端,、服務端協(xié)議錯誤通常指控制報文在按照協(xié)議規(guī)范解析以后才能發(fā)現(xiàn)的錯誤,包括包含協(xié)議不允許的數(shù)據(jù),、行為與協(xié)議要求不符等等,。比如客戶端在一個連接內(nèi)發(fā)送了兩個 CONNECT 報文。
0x8DKeep Alive timeout服務端服務端在超過 1.5 倍的 Keep Alive 時間內(nèi)沒有收到任何報文,,因此關(guān)閉了連接,。
0x8ESession taken over服務端另一個更新的使用了且相同的 Client ID 的連接被建立,導致服務端關(guān)閉了此連接,。
0x93Receive Maximum exceeded客戶端,、服務端表示對端同時發(fā)送的 QoS > 0 的 PUBLISH 報文數(shù)量超過了連接時設置的接收最大值。
0x94Topic Alias invalid客戶端,、服務端表示主題別名不合法,。比如 PUBLISH 報文中的主題別名值為 0 或者大于連接時約定的最大主題別名。
0x95Packet too large客戶端,、服務端表示報文超過了連接時約定的最大允許長度,。
0x98Administrative action客戶端、服務端表示連接因為管理操作而被關(guān)閉,,比如運維人員在服務端后臺踢除了客戶端連接,。
0x9CUse another server服務端表示客戶端應該臨時切換到另一個服務器。如果另一個服務器不是客戶端已知的,,那么還需要配合 Server Reference 屬性一起使用,,以告知客戶端新的服務端的地址。
0x9DServer moved服務端表示客戶端應該永久切換到另一個服務器,。如果另一個服務器不是客戶端已知的,,那么還需要配合 Server Reference 屬性一起使用,以告知客戶端新的服務端的地址,。
  • 屬性(Properties):下表列出了 DISCONNECT 報文的所有可用屬性,。

IdentifierProperty NameSent ByType
0x11Session Expiry Interval客戶端四字節(jié)整數(shù)
0x1FReason String客戶端、服務端UTF-8 編碼的字符串
0x26User Property客戶端,、服務端UTF-8 字符串對
0x1CServer Reference服務端UTF-8 編碼的字符串

與之前介紹的其他報文不同,,客戶端和服務端在 DISCONNECT 報文中可以使用的原因碼和屬性是不同的,例如 Session Expiry Interval 屬性就只能在客戶端發(fā)送的 DISCONNECT 報文中使用,,所以我們在上面的列表中均列出了它們的可用范圍,。

有效載荷

DISCONNECT 報文不包含有效載荷,。

總結(jié)

客戶端和服務端都可以發(fā)送 DISCONNECT 報文,表示準備斷開網(wǎng)絡連接,,報文中的原因碼可以向接收方指示連接關(guān)閉的原因,。當 MQTT 連接意外斷開時,我們可以優(yōu)先查看是否收到了 DISCONNECT 報文以及報文中原因碼的值,。

雖然客戶端和服務端在 DISCONNECT 報文中可以用的原因碼和屬性存在差異,,但我們并不需要強行去記憶它們。它們通常都和對應的機制與行為相關(guān),,例如遺囑消息只會由服務端發(fā)布,,所以希望連接正常關(guān)閉但對端仍要發(fā)布遺囑消息的原因碼 0x04,也會被客戶端使用,。

以上就是對 DISCONNECT 報文的介紹,,在下一篇文章中我們將介紹 MQTT 5.0 增強認證特性所使用的 AUTH 報文,它也是 MQTT 中最后一個報文類型,。

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多