MQTT-控制报文

kk3TWT Lv3

简介

报文是网络中交换与传输数据的最小数据单元,即一次性需要发送的数据块。它包含发送的完整数据信息,长度不限且可变。MQTT客户端和服务端就是通过交换控制报文完成工作(如订阅主题、发布信息)的

以MQTT发送的信息为例,在客户端发送的数据中,不仅包含花括号里面的内容(也就是我们发送的信息),也包括一些其他内容,这两部分是一个整体(数据块),作为控制报文进行发送

常见的控制报文类型

MQTT定义了15种报文类型,可按功能分为三类:

  1. 连接类:
报文名称 报文说明
1 CONNECT 用于客户端向服务器发起连接
2 CONNACK 作为响应返回连接的结果
12 PINGREQ 用于连接保持和探测,客户端定期发出 PINGREQ 报文向服务器表示自己仍然活跃
13 PINGRESP 用于连接保持和探测,客户端在发出 PINGREQ 报文后,根据 PINGRESP 报文是否及时返回判断服务器是否活跃。
14 DISCONNECT 想要结束通信,或者遇到了一个必须终止连接的错误,发送该报文关闭网络连接
15 AUTH 是 MQTT 5.0 引入的全新的报文类型,它仅用于增强认证,为客户端和服务端提供更安全的身份验证。
  1. 发布类:
报文名称 报文说明
3 PUBLISH 用于发布消息
4 PUBACK 分别用于 QoS 1 和 QoS 2 消息的确认流程
5 PUBREC 分别用于 QoS 1 和 QoS 2 消息的确认流程
6 PUBREL 分别用于 QoS 1 和 QoS 2 消息的确认流程
7 PUBCOMP 分别用于 QoS 1 和 QoS 2 消息的确认流程
  1. 订阅类:
报文名称 报文说明
8 SUBSCRIBE 用于客户端向服务器发送订阅
9 SUBACK 返回订阅结果
10 UNSUBSCRIBE 用于客户端向服务器发送取消订阅
11 UNSUBACK 返回取消订阅结果

控制报文的格式

报文主要由三部分组成:

  1. 固定报头
  2. 可变报头
  3. 有效载荷

其中固定报头一定存在于所有的报文中,而后两个部分的存在情况取决于控制报文的类型

PINGREQ 类型报文为例,客户端会定期发出 PINGREQ 报文向服务器表示自己仍然活跃,它只包含固定报头,而不包含可变报头和有效载荷

又以 PUBLISH 类型报文为例,客户端使用 PUBLIC 报文发送消息,它包含以上的所有部分(固定报头、可变报头、有效载荷)

固定报头

固定报头由三个字段组成(表格视为整个固定报头):

报文类型 Packet Type(4bit) 标志位 Flag(4bit) 剩余长度 Remain Length(1~4bit)
  1. 报文类型:无符号整数,转换为十进制后,得到的值就对应控制报文的类型(值与报文类型的对应关系见上文表格)
  2. 标识位:仅在 PUBLISH 报文中有明确定义,在其他类型的报文中作为保留位:
    • bit 3(DUP)表示当前报文是否为重传报文
    • bit 2、1(QoS)表示当前报文的质量等级
    • bit 0(Retain)表示当前报文是否为保留信息
  3. 剩余长度:表示报文剩余部分的字节数,即可变报头+有效载荷的总字节数

可变报头

对于不同报文类型,可变报头的内容也不同

CONNECT 报文为例,它的可变报头包括五个字段:协议名称、协议级别、连接标识、保持活跃和属性

又以 PUBLISH 报文为例,它的可变报头包括三个字段:主题名称、报文标识和属性

其中属性字段基本上都是可变报头的最后一部分,在 MQTT 5.0 之后引入,包括如下组成部分:

- 属性长度 Length 属性内容(Property 1 ~ n)

属性通常是为了某个专门的用途而设计的,不同的报文,其支持的属性也不同

属性长度指所有属性的总长度,如果报文没有任何属性,那么属性长度就是0

有效载荷

用于实现报文的核心功能

PUBLISH 报文为例,载荷用于承载具体的消息内容

又以 SUBSCRIBE 报文为例,载荷包含了订阅主题和订阅选项

通过 Wireshark 获取报文

安装并进入 Wireshark 程序,选择需要监听的网卡,然后在搜索框内输入 MQTT 筛选出通过 MQTT 协议发送的消息

以下为不同情况下获取到的报文:

  1. 连接服务端

  2. 发送保活信息

  3. 发送普通信息(从上到下分别为 QoS 0~2)

  4. 订阅主题

  5. 取消订阅主题

  6. 断开连接

  • 标题: MQTT-控制报文
  • 作者: kk3TWT
  • 创建于 : 2026-05-02 16:43:15
  • 更新于 : 2026-05-02 16:53:47
  • 链接: https://kk-is-very-happy.online/posts/ec01270c/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。