理解MQTT協議資料報結構

2021-10-25 03:48:29 字數 3686 閱讀 9508

在本教程中,我們將更詳細地介紹mqtt協議,以及mqtt訊息或資料報的格式。

我們將研究:

mqtt訊息格式。

mqtt訊息頭

訊息欄位和編碼

控制訊息編碼示例

mqtt是基於二進位制的協議,控制元素是二進位制位元組而不是文字字串。

mqtt使用命令和命令確認格式。

這意味著每個命令都有乙個對應的確認。

主題名稱,客戶端id,使用者名稱和密碼被編碼為utf-8字串。

除了mqtt協議資訊(例如客戶端id等)外,有效負載是二進位制資料,內容和格式是特定於應用程式的。

mqtt資料報或訊息格式由2位元組固定報頭(始終存在)+可變報頭(並非始終存在)+有效負載(並非始終存在)組成。

可能的資料報格式為:

固定報頭欄位由控制字段和可變長度資料報長度字段組成。

資料報長度欄位的最小大小為1個位元組,用於總長度小於127個位元組的訊息(不包括控制欄位和長度字段)。

最大資料報大小為256mb。 小於127位元組的小資料報具有1位元組的資料報長度字段。

大於127且小於16383的資料報將使用2個位元組。 等等

注意:只是用7位,第8位用作連續位.

note:7 bits are used with the8th bitbeing acontinuation bit.

最小資料報大小只有2個位元組,其中包含乙個單位元組控制欄位和乙個單位元組資料報長度字段。 例如,斷開連線訊息只有2個位元組。

8位控制欄位是2位元組固定報頭的第乙個位元組。 它分為兩個4位欄位,包含所有協議命令和響應。

前4個最高有效位是命令或訊息型別字段,其他4位用作控制標誌。

下表摘自mqtt 3.1.1規範,並顯示了mqtt命令及其相關**的示例。

因為它們是8位位元組欄位中最重要的部分,所以我也以十進位制顯示了它們的位元組值,就像它們出現在資料報中一樣。

儘管有16種可能的標誌,但實際上只使用其中少部分。

發行訊息充分利用了這些標誌,如下表所示:

當使用qos或1或2重新發布訊息時使用重複標誌

發布訊息時使用qos標誌,並指示qos級別-0,1,2

保留訊息標誌也用於發布。

它的長度在1到4個位元組之間。 每個位元組使用7位作為長度,其中msb用作連續標誌。

剩餘長度是長度字段後面的位元組數,包括可變長度的頭和有效負載,如下所示:

下面說明了長度為64和321位元組的資料報的長度字段

剩餘資料報長度64個位元組僅需要1個位元組:

321個位元組的資料報長度需要2個位元組的剩餘長度字段:

從規範中獲取的下表顯示了資料報大小和資料報長度字段。

如前所述,可變長度頭字段並不總是出現在mqtt訊息中。

某些mqtt訊息型別或命令要求使用此字段來攜帶其他控制資訊。

可變長度報頭欄位是相似的,但對於所有訊息型別而言都不相同。

mqtt連線和斷開連線訊息示例

作為說明,我們現在將檢視連線訊息的資料報詳細資訊。

下面是乙個真實的客戶端連線和斷開連線示例,顯示了已傳送和已接收資料的實際位元組值。

connect控制**= 0x10

connack控制碼= 0x20

mqtt資料報=控制+長度+協議名稱+協議級別+連線標誌+保持活動+有效負載

(mqtt packet=control + length + protocol name + protocol level +connect flags + keep alive +payload)

註解:註解:

control packet

variable header

payload

connect

required

required

connack

none

none

publish

required

optional

puback

required

none

pubrec

required

none

pubrel

required

none

pubcomp

required

none

subscribe

required

required

suback

required

required

unsubscribe

required

required

unsuback

required

required

pingreq

none

none

pingresp

none

none

disconnect

none

none

為了回應讀者有關tcp協議的問題,我建立了這張摘自wireshark的螢幕截圖。

它顯示了乙個mqtt客戶端連線和發布(qos 1)。 您可以清楚地看到總長度為58個位元組的ack資料報。

我們知道ack資料報是2個位元組。

因此,沒有mqtt的tcp資料報約為56個位元組。

還有一點需要注意的有趣的事情是直到我完成資料報捕獲之前我都沒有想到的是,每個mqtt命令或響應都將獲得乙個tcp ack,甚至還有乙個mqtt ack。

如果檢視螢幕截圖,則mqtt連線可以獲取tcp ack響應和mqtt connect ack響應。

mqtt connect ack響應會有乙個tcp ack響應。

參考:mqtt v3.1.1 specification pdf

MQTT 協議理解

mqtt特點 mqtt協議是為大量計算能力有限,且工作在低頻寬 不可靠的網路的遠端感測器和控制裝置通訊而設計的協議,它具有以下主要的幾項特性 1 使用發布 訂閱訊息模式,提供一對多的訊息發布,解除應用程式耦合 2 對負載內容遮蔽的訊息傳輸 3 使用 tcp ip 提供網路連線 4 有三種訊息發布服務...

TCP協議資料報頭結構

tcp頭結構 tcp序列號 序列碼,sequence number 32位的序列號由接收端計算機使用,重新分段的報文成最初形式。當syn出現,序列碼實際上是初始序列碼 isn 而第乙個資料位元組是isn 1。這個序列號 序列碼 是可以補償傳輸中的不一致。tcp應答號 acknowledgment n...

TCP IP協議資料報結構詳解

tcp ip協議中各層的資料報結構是乙個比較抽象的內容,大家在日常學習過程中往往難以理解和掌握,常常是死記硬背把它記住了事。本文首先利用sniffer工具捕獲了ftp命令操作過程中的所有資料報,然後對sniffer工具中捕獲的每一部分資料報的含義進行了詳細的闡述,最後總結歸納出tcp ip協議中網路...