什么是MQTT协议?
介绍:
- MQTT协议是一种轻量级的消息传输协议,采用发布/订阅(Publish/Subscribe)的通信模式,适用于网络带宽有限、网络不稳定以及设备资源受限的场景。
MQTT协议的特点:
- 轻量级:协议开销小,适合资源受限的嵌入式设备。
- 安全可靠:MQTT协议是建立在TCP/IP协议之上,所以安全可靠。
- 支持不同的QoS等级:
| 等级 |
名称 |
交付机制 |
主要特点 |
| QoS 0 |
至多一次 |
不进行 MQTT 层的交付确认 |
开销小,消息可能丢失 |
| QoS 1 |
至少一次 |
使用 PUBACK 确认 |
消息可能重复 |
| QoS 2 |
恰好一次 |
使用多阶段握手 |
MQTT 协议层保障消息交付一次 |
- 心跳保活:由于网络问题可能造成连接陷于假死状态,为了判断客户端和代理是否出现异常,MQTT定义自己的心跳机制,定期向代理发送报文,以便于快速识别出异常连接,让客户端快速与代理断开连接。
- 持久会话: 代理保留客户端发送过来的消息,以便于消息订阅端上线立刻获取消息。
MQTT报文结构:
- 固定报头(Fixed header):所有的数据包都包含这部分,用来表示数据的类型;
- 可变报头(Variable header):存在于部分数据包中,决定了可变头是否存在及其具体内容;
- 有效载荷(Payload):存在于部分数据包中,表示客户端收到的内容;
固定报头的格式:

byte 1的高四位取值范围:0000~1111,转化为十进制:0~15。
byte 1的低四位大多数是保留位,只有当高四位为Publish(0011)的时候,低四位的值才有意义。
| 二进制(4 bit) |
十进制 |
控制报文类型 |
中文名称 |
作用说明 |
0000 |
0 |
Reserved |
保留 |
不允许作为有效控制报文类型使用 |
0001 |
1 |
CONNECT |
连接请求 |
客户端向 Broker 发起连接请求,提供协议版本、客户端标识、认证信息等 |
0010 |
2 |
CONNACK |
连接确认 |
Broker 向客户端返回连接结果,表示连接是否被接受 |
0011 |
3 |
PUBLISH |
发布消息 |
发布者向 Broker 发送业务消息,或 Broker 向订阅者转发消息 |
0100 |
4 |
PUBACK |
发布确认 |
确认 QoS 1 的 PUBLISH 报文 |
0101 |
5 |
PUBREC |
发布收到 |
QoS 2 交互中,接收方确认收到 PUBLISH 报文 |
0110 |
6 |
PUBREL |
发布释放 |
QoS 2 交互中,发送方通知接收方继续完成消息交付流程 |
0111 |
7 |
PUBCOMP |
发布完成 |
QoS 2 交互中,确认消息交付流程完成 |
1000 |
8 |
SUBSCRIBE |
订阅请求 |
客户端向 Broker 请求订阅一个或多个主题,并指定订阅选项 |
1001 |
9 |
SUBACK |
订阅确认 |
Broker 返回订阅结果及相应的授权或失败信息 |
1010 |
10 |
UNSUBSCRIBE |
取消订阅请求 |
客户端请求取消对一个或多个主题过滤器的订阅 |
1011 |
11 |
UNSUBACK |
取消订阅确认 |
Broker 确认收到取消订阅请求;MQTT 5.0 还可提供逐项结果 |
1100 |
12 |
PINGREQ |
心跳请求 |
客户端向 Broker 发送请求,以检查连接是否仍然有效 |
1101 |
13 |
PINGRESP |
心跳响应 |
Broker 对 PINGREQ 返回响应 |
1110 |
14 |
DISCONNECT |
断开连接 |
客户端通知 Broker 连接即将关闭 |
1111 |
15 |
AUTH |
认证报文 |
用于 MQTT 5.0 的增强认证流程;MQTT 3.1.1 不支持此报文类型 |
- 当高四位为Publish(0011)时,低四位的意义:
| Bit 位 |
字段 |
长度 |
作用 |
| Bit 3 |
DUP |
1 bit |
表示该 PUBLISH 报文是否为重发报文 |
| Bit 2~1 |
QoS |
2 bit |
表示消息的服务质量等级 |
| Bit 0 |
RETAIN |
1 bit |
表示发布者是否要求 Broker 保留该消息 |

- Bit 3:DUP(重复发送标志),占一个bit位。
| DUP 值 |
含义 |
0 |
该报文不是按照 DUP 标志标记的重发报文 |
1 |
该报文是重发报文 |
- eg:客户端使用 QoS 1 发布消息后,没有收到 PUBACK,可能重新发送 PUBLISH 报文。如果这是对之前发送的 PUBLISH 报文的重发,则 DUP 可以设置为 1。
- 注意:DUP = 1 不代表接收方一定已经收到过这条消息,它表示发送方正在重发该报文。
- Bit 2~1:QoS(服务质量等级),QoS 占 2 bit,有 4 种二进制组合,但其中 11 是保留值。
| Bit 2 |
Bit 1 |
QoS 值 |
含义 |
0 |
0 |
0 |
至多一次,不进行 MQTT 层的交付确认 |
0 |
1 |
1 |
至少一次,通过 PUBACK 确认 |
1 |
0 |
2 |
恰好一次,通过四阶段交互完成交付 |
1 |
1 |
3 |
保留值 |
- Bit 0:RETAIN(保留标志),占一个bit位。
| RETAIN 值 |
含义 |
0 |
不要求 Broker 将本次发布的消息保存为新的保留消息 |
1 |
要求 Broker 将本次发布的消息保存为该主题的保留消息 |
- 注意:RETAIN 与 QoS 无关,二者作用不同。
- 举例:
| 十六进制 |
二进制 |
DUP |
QoS |
RETAIN |
含义 |
30 |
0011 0000 |
0 |
0 |
0 |
QoS 0,不保留 |
31 |
0011 0001 |
0 |
0 |
1 |
QoS 0,保留 |
32 |
0011 0010 |
0 |
1 |
0 |
QoS 1,不保留 |
33 |
0011 0011 |
0 |
1 |
1 |
QoS 1,保留 |
34 |
0011 0100 |
0 |
2 |
0 |
QoS 2,不保留 |
35 |
0011 0101 |
0 |
2 |
1 |
QoS 2,保留 |
3A |
0011 1010 |
1 |
1 |
0 |
QoS 1,重发,不保留 |
MQTT协议工作原理

原文地址: https://www.cveoy.top/t/topic/qHRk 著作权归作者所有。请勿转载和采集!
免费AI点我,无需注册和登录