# 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字节开始 保留字长
![](https://box.kancloud.cn/2015-11-29_565a948759a03.png)
## 2.2.1 MQTT控制包类型
位置:第一字节,7-4位
表示为4位无符号值,如下表所示:
![](https://box.kancloud.cn/2015-11-29_565a948768e2b.png)
## 2.2.2 标志
固定头部第一字节剩余的4位(Bits[3-0])包含了如下表所示的每个MQTT控制包特殊的规范。当一个标志位被记录成“Reserved”时,表明这是保留给将来协议升级使用,现在必须按照下表所示设置相应的值[MQTT-2.2.2-1]。如果收到不合规的值,接收方必须关闭网络连接[MQTT-2.2.2-2]。更详细的对于错误的处理可以参考4.8节。
![](https://box.kancloud.cn/2015-11-29_565b08602ef4c.png)
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负载