# 2.1 MQTT控制包的結構
MQTT協議的工作方式其實就是根據預先定義的方式進行一系列的MQTT控制包交換。這一節我們主要解釋這些包的格式。
一個MQTT控制包最多由3個組成部分,而且必須按照下面這樣的順序。
圖2.1 MQTT控制包的結構
1. 固定頭部,存在于所有MQTT控制包中
2. 可變頭部,存在于一部分MQTT控制包中
3. 有效負載,存在于一部分MQTT控制包中
# 2.2 固定頭部
每個MQTT控制包都包含一個固定頭部。
圖2.2 固定頭部格式
位 7 6 5 4 3 2 1 0
第1字節 MQTT控制封包類型 每個MQTT控制包特有的標志類型
第2字節開始 保留字長

## 2.2.1 MQTT控制包類型
位置:第一字節,7-4位
表示為4位無符號值,如下表所示:

## 2.2.2 標志
固定頭部第一字節剩余的4位(Bits[3-0])包含了如下表所示的每個MQTT控制包特殊的規范。當一個標志位被記錄成“Reserved”時,表明這是保留給將來協議升級使用,現在必須按照下表所示設置相應的值[MQTT-2.2.2-1]。如果收到不合規的值,接收方必須關閉網絡連接[MQTT-2.2.2-2]。更詳細的對于錯誤的處理可以參考4.8節。

DUP1 = 重復發送一個發布控制包
QoS2 = 發布的服務品質級別
RETAIN3 = 發布的保留標志
更詳細的信息可以參考3.3.1章節
## 2.2.3 剩余字長
位置:從第二字節開始
剩余字長表示當前消息的剩余字節數,包括可變頭部和有效負載。剩余字長不包括用來編碼剩余長度的字節。
剩余字長的編碼采用的是可變長編碼方案,用一個單字節可以代表最多127字節。如果更長的話,需要用如下的方式處理:
每個字節的低7位用來編碼數據,而最高一位用來表示后續還有值。因此每個字節編碼128個數值和一個“延續位”。剩余字長中最大的字節數是4。
* 非標準注釋
比如,十進制數64被編碼為一個單字節,十進制64,十六進制0x40。十進制321(也就是65+128*2)被編碼為2個字節,低位在前。所以第一個字節是193(65+128)。注意最高位被設置成至少有一個后續字節。第二個字節是2。
這就允許應用發送控制包最大256M(268,435,455),代表這個數的就是0xFF,0xFF,0xFF,0x7F。
| 數字 | 從 | 到 |
| 1 |0(0x00) | 127(0x7F) |
| 2 |128(0x80, 0x01) | 16 383(0xFF,0x7F) |
| 3 |16 384(0x80,0x80,0x01) | 2 097 151(0xFF,0xFF,0x7F) |
| 4 |2 097 152(0x80,0x80,0x80,0x01) |268 435 455(0xFF,0xFF,0xFF,0x7F) |
# 2.3 可變頭部
## 2.3.1 包標識符
# 2.4負載