MQTT 5.0 報文解析 05:DISCONNECT

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

在 MQTT 中,客戶端和服務端可以在斷開網絡連接前向對端發送一個 DISCONNECT 報文,來指示連接關閉的原因。客戶端發送的 DISCONNECT 報文還可以影響服務端在連接斷開后的行為,例如是否發送遺囑消息,是否更新會話過期間隔。

DISCONNECT 報文示例

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

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

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

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

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

e0 02 8e 00

這四個十六進制字節,對應著以下報文內容:

DISCONNECT Packet.png

通過下文對 DISCONNECT 報文結構的介紹,你將了解到如何從原始的報文數據中提取你想要的信息。

DISCONNECT 報文結構

固定報頭

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

Fixed Header.png

可變報頭

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

Viriable Header.png

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

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

有效載荷

DISCONNECT 報文不包含有效載荷。

總結

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

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14476.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

手把手教你搭建一個花店小程序商城

如果你是一位花店店主,想要為你的生意搭建一個精美的小程序商城,以下是你將遵循的五個步驟。 步驟1:登錄喬拓云平臺進入后臺 首先,你需要登錄喬拓云平臺的后臺管理頁面。你可以在電腦或移動設備上的瀏覽器中輸入喬拓云的官方網站…

2024.5.26 機器學習周報

目錄 引言 Abstract 文獻閱讀 1、題目 2、引言 3、創新點 4、Motivation 5、naive Lite-HRNet 6、Lite-HRNet 7、實驗 深度學習 解讀SAM(Segment Anything Model) 1、SAM Task 2、SAM Model 2.1、Patch Embedding 2.2、Positiona Embedding 2.3、Transformer …

移動端適配:vw適配方案

vw (Viewport Width) 是一種長度單位,代表視口寬度的百分比。1vw 等于視口寬度的1%。在網頁設計和前端開發中,vw 單位常用于實現響應式設計和屏幕適配,尤其是針對不同尺寸和分辨率的移動設備。 為什么使用vw適配? 響應式: 使用v…

互聯網醫院開發:引領智慧醫療新時代

隨著科技的迅猛發展和互聯網的普及,傳統醫療模式正在迎來一場深刻的變革。互聯網醫院的崛起,打破了時間和空間的限制,為患者和醫療機構帶來了更加便捷、高效、安全的醫療服務體驗。本文將從技術角度深入探討互聯網醫院的開發,包括…

【openpcdet中yaml文件的DATA_AUGMENTOR學習】

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、代碼二、詳細解釋DISABLE_AUG_LISTAUG_CONFIG_LIST1. gt_sampling2. random_world_flip3. random_world_rotation4. random_world_scaling 總結 前言 提示…

多線程(八)

一、wait和notify 等待 通知 機制 和join的用途類似,多個線程之間隨機調度,引入 wait notify 就是為了能夠從應用層面上,干預到多個不同線程代碼的執行順序.( 這里說的干預,不是影響系統的線程調度策略 內核里的線程調度,仍然是無序的. 相當于是在應用程序…

Pod容器資源限制和探針

目錄 一、資源限制 1.Pod和容器的資源請求和限制 2.CPU 資源單位 案例一 案例二 二、健康檢查,又稱為探針(Probe) 1.探針的三種規則 2.Probe支持三種檢查方法 3.探測獲得的三種結果 案例一:exec 案例二:htt…

OneMO同行 心級服務:中移物聯OneMO模組助力客戶終端寒冷環境下的穩定運行

中移物聯OneMO模組以客戶為中心,基于中國移動心級服務要求,開展“OneMO同行 心級服務 標定一流”高標服務主題活動,升級“服務內容““服務方式”和“服務意識”,為行業客戶提供全新的服務體驗。 近日,某車載監控設備…

Hive語法學習總結

Hive SQL語法學習總結 hive參數庫操作1.創建庫2.具體案例3.庫的其他操作 表和庫的路徑演示表的操作創建表插入數據 hive參數 一 hive常用交互命令hive -e sql語句hive -f sql文件 //文件中是sql語句二 參數的設置方式一:在客戶端中設置參數(當次有效)set 參數名參…

ACM實訓第十七天

Is It A Tree? 問題 考試時應該做不出來,果斷放棄 樹是一種眾所周知的數據結構,它要么是空的(null, void, nothing),要么是一個或的集合滿足以下屬性的節點之間有向邊連接的節點較多。 ?只有一個節點,稱為根節點,它…

【Crypto】摩絲

文章目錄 一、摩斯解題感悟 一、摩斯 很明顯莫爾斯密碼 iloveyou還挺浪漫 小小flag,拿下 解題感悟 莫爾斯密碼這種題還是比較明顯的

【董曉算法】競賽常用知識之圖論3(最近公共祖先)

前言: 本系列是學習了董曉老師所講的知識點做的筆記 董曉算法的個人空間-董曉算法個人主頁-嗶哩嗶哩視頻 (bilibili.com) 動態規劃系列(還沒學完) 【董曉算法】動態規劃之線性DP問題-CSDN博客 【董曉算法】動態規劃之背包DP問題&#xff…

智能鎖千千萬,誰是你的NO.1,親身實測凱迪仕傳奇大師K70旗艦新品

智能鎖千千萬,誰是你的NO.1。歡迎來到智哪兒評測室,這次我們為大家帶來了凱迪仕傳奇大師K70系列的一款重磅新品。 在科技的浪潮中,家居安全領域正經歷著前所未有的變革。智能鎖越來越成為家的安全守護神,以及智能生活的得力助手。…

Android 11 Framework實時監聽Activity堆棧變化

核心類 Framework中有一個類SystemActivityMonitoringService專門用于監控Activity堆棧變化,屬于隱藏Api,應用側無法調用。此類位于 packages/services/Car/service/src/com/android/car/SystemActivityMonitoringService.java 方法 void registerTa…

Mysql信息脫敏

類似微信姓名脫敏: SELECT CONCAT( REPEAT(*, CHAR_LENGTH(real_name) -1 ), RIGHT(real_name, 1) ) name from user_info電話號脫敏: SELECT CONCAT(LEFT(mobile_phone, 3), REPEAT(*, 4 ), RIGHT(mobile_phone, 4) ) phone from user_info

大數據Hive中的UDF:自定義數據處理的利器(下)

在上一篇文章中,我們對第一種用戶定義函數(UDF)進行了基礎介紹。接下來,本文將帶您深入了解剩余的兩種UDF函數類型。 文章目錄 1. UDAF1.1 簡單UDAF1.2 通用UDAF 2. UDTF3. 總結 1. UDAF 1.1 簡單UDAF 第一種方式是 Simple(簡單…

每日一題《leetcode--382.鏈表隨機結點》

https://leetcode.cn/problems/linked-list-random-node/ 這道題我們首先看到題目中的要求:在單鏈表中隨機選取一個鏈表中的結點,要使每個結點被選取的概率是一樣的。 當我們看到隨機這兩個字時,應該就會想起rand()這個函數。接著我們把使用這…

[暈事]今天做了件暈事35 VM發送給gateway太多ARP,導致攻擊檢查?

最近遇到一個問題,說網關學不到新起來VM的mac地址,通過tshark抓包發現,VM已經發出去GARP了。而且連續發送了24個GARP。 就認為是網關的問題,為什么沒網關沒有學到?就讓測試同事開網絡設備的ticket。 后來聽同事說&…

自己搭建內網穿透

本文介紹使用最新版frp搭建內網穿透,最新版本的frp在配置上與之前有很大不同,需要使用.toml文件進行配置。其中主要問題出現在toml文件內部。 一、云服務器配置 下載frp sudo apt update sudo apt install wget wget https://github.com/fatedier/frp…

求出這行英文中最后一個單詞的長度

【題目描述】藍寶看到了一行奇怪的英文,這行英文由若干單詞組成,每個單詞前后用一些字符*隔開請幫助藍寶求出這行英文中最后一個單詞的長度。【輸入格式】 輸入一行,就就是藍寶看到的奇怪的英文。 【輸出格式】 輸出一行,是個整數…