| Fixed header | 固定报头 | 报文的最开始部分,所有报文都包含这个部分 |
| Variable header | 可变报头 | 固定报文的附加部分,有些报文没有这个部分 |
| Payload | 有效载荷 | 需要携带的信息内容,有些报文没有这个部分 |

| Bit(位号) | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|
| Byte1(第一个字节) | 组合代表MQTT控制报文(数据包)的类型 | 控制报文的标志位(Flags),可理解为一种属性参数 |
| Byte2(第二个字节起) | 剩余长度,当前报文剩余部分的字节数,包括可变报头和有效负载 |
| 0000 | 0 | Reserved | 禁止 | 保留,不可用 |
| 0001 | 1 | CONNECT | | 客户端请求连接到服务端的代理服务 |
| 0010 | 2 | CONNACK | | 连接请求的回复确认报文 |
| 0011 | 3 | PUBLISH | 客户端←→服务端 | 发布主题消息 |
| 0100 | 4 | PUBACK | 客户端←→服务端 | 发布确认,是QoS=1时,对 PUBLISH 的响应确认 |
| 0101 | 5 | PUBREC | 客户端←→服务端 | 发布收到,是QoS=2时,对 PUBLISH 的响应确认,是QoS=2实现的第一步 |
| 0110 | 6 | PUBREL | 客户端←→服务端 | 发布释放,是QoS=2时,对 PUBREC 的响应确认,是QoS=2实现的第二步 |
| 0111 | 7 | PUBCOMP | 客户端←→服务端 | 发布完成,是QoS=2时,对 PUBREL 的响应确认,是QoS=2实现的第三步 |
| 1000 | 8 | SUBSCRIBE | | 客户端订阅主题,可一次订阅一个或多个主题(使用通配符) |
| 1001 | 9 | SUBACK | | 订阅完成确认,是对 SUBSCRIBE 的响应确认 |
| 1010 | 10 | UNSUBSCRIBE | | 取消订阅,客户端发起的取消对某个主题的订阅 |
| 1011 | 11 | UNSUBACK | | 取消订阅确认,是对 UNSUBSCRIBE 的响应确认 |
| 1100 | 12 | PINGREQ | | 心跳,表示这个数据包是为通知服务端客户端还在正常连接着 |
| 1101 | 13 | PINGRESP | | 心跳响应,表示服务端已经成功收到了客户端的心跳 |
| 1110 | 14 | DISCONNECT | | 断开连接,客户端通知服务端,需要断开当前网络连接 |
| 1111 | 15 | Reserved | 禁止 | 保留,不可用 |
| CONNECT | 保留 | 0 | 0 | 0 | 0 |
| CONNACK | 保留 | 0 | 0 | 0 | 0 |
| PUBLISH | 使用 | 是否为重复发 | 服务质量高位 | 服务质量低位 | 是否保存消息 |
| PUBACK | 保留 | 0 | 0 | 0 | 0 |
| PUBREC | 保留 | 0 | 0 | 0 | 0 |
| PUBREL | 保留 | 0 | 0 | 1 | 0 |
| PUBCOMP | 保留 | 0 | 0 | 0 | 0 |
| SUBSCRIBE | 保留 | 0 | 0 | 1 | 0 |
| SUBACK | 保留 | 0 | 0 | 0 | 0 |
| UNSUBSCRIBE | 保留 | 0 | 0 | 1 | 0 |
| UNSUBACK | 保留 | 0 | 0 | 0 | 0 |
| PINGREQ | 保留 | 0 | 0 | 0 | 0 |
| PINGRESP | 保留 | 0 | 0 | 0 | 0 |
| DISCONNECT | 保留 | 0 | 0 | 0 | 0 |
| CONNECT | 连接服务端 | 00010000 | 16 | 0x10 |
| CONNACK | 连接成功确认 | 00100000 | 32 | 0x20 |
| PUBLISH | 新发布等级0不保存 | 00110000 | 48 | 0x30 |
| PUBLISH | 新发布等级0需保存 | 00110001 | 49 | 0x31 |
| PUBLISH | 新发布等级1不保存 | 00110010 | 50 | 0x32 |
| PUBLISH | 新发布等级1需保存 | 00110011 | 51 | 0x33 |
| PUBLISH | 新发布等级2不保存 | 00110100 | 52 | 0x34 |
| PUBLISH | 新发布等级2需保存 | 00110001 | 53 | 0x35 |
| PUBLISH | 重发等级2不保存 | 00111000 | 56 | 0x38 |
| PUBLISH | 重发等级2需保存 | 00111001 | 57 | 0x39 |
| PUBACK | 等级1发布成功 | 01000000 | 64 | 0x40 |
| PUBREC | 等级2发布收到 | 01010000 | 80 | 0x50 |
| PUBREL | 等级2发布释放 | 01100010 | 98 | 0x62 |
| PUBCOMP | 等级2发布完成 | 01110000 | 112 | 0x70 |
| SUBSCRIBE | 订阅主题 | 10000010 | 130 | 0x82 |
| SUBACK | 订阅完成确认 | 10010000 | 144 | 0x90 |
| UNSUBSCRIBE | 取消订阅 | 10100010 | 162 | 0xA2 |
| UNSUBACK | 取消完成确认 | 10110000 | 176 | 0xB0 |
| PINGREQ | 心跳包 | 11000000 | 192 | 0xC0 |
| PINGRESP | 心跳回复 | 11010000 | 208 | 0xD0 |
| DISCONNECT | 断开网络连接 | 11100000 | 224 | 0xE0 |
| 0 | 1111001 |
| 接下来没有剩余长度字节了 | 剩余长度是:121 |
| 1 | 1100011 | 0 | 1111100 |
| 后面还有字节描述长度 | 本子节描述长度:99 | 后面没有长度字节了 | 本字节描述长度:124 * 128 = 15872 |
| 1 | 1111110 | 1 | 1111111 | 0 | 1111111 |
| 还有长度字节 | 长度:126 | 还有长度字节 | 长度:127 * 128 = 16256 | 长度最后字节 | 长度:127 * 16384 = 2080768 |
| 1 | 0(0x00) | 00000000 | | 127(0x7F) | 01111111 |
| 2 | 128(0x80,0x01) | 10000000 00000001 | | 16383(0xFF,0x7F) | 11111111 01111111 |
| 3 | 16384(0x80,0x80,0x01) | 10000000 10000000 00000001 | | 2097151(0xFF,0xFF,0x7F) | 11111111 11111111 01111111 |
| 4 | 2097152(0x80,0x80,0x80,0x01) | 10000000 10000000 10000000 00000001 | | 268435455(0xFF,0xFF,0xFF,0x7F) | 11111111 11111111 11111111 01111111 |
在一些需要携带用户自定义的应用消息的MQTT控制报文中,会将这些信息放在报文的最后部分,称之为有效载荷。对于PUBLISH来说有效载荷就是应用消息。不同的控制报文有效载荷内容不同,后面会在分别介绍控制报文时具体讨论。下表列出哪些控制报文有包含有效载荷:
| CONNECT | 需要 |
| CONNACK | 不 需要 |
| PUBLISH | 可选,可以零长度 |
| PUBACK | 不需要 |
| PUBREC | 不需要 |
| PUBREL | 不需要 |
| PUBCOMP | 不需要 |
| SUBSCRIBE | 需要 |
| SUBACK | 需要 |
| UNSUBSCRIBE | 需要 |
| UNSUBACK | 不需要 |
| PINGREQ | 不需要 |
| PINGRESP | 不需要 |
| DISCONNECT | 不需要 |