MQTT协议

什么是MQTT协议?

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

    byte 1的高四位取值范围:00001111,转化为十进制:015。
    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 保留该消息
  • 每一位的具体作用:
  1. Bit 3:DUP(重复发送标志),占一个bit位。
DUP 值 含义
0 该报文不是按照 DUP 标志标记的重发报文
1 该报文是重发报文
  • eg:客户端使用 QoS 1 发布消息后,没有收到 PUBACK,可能重新发送 PUBLISH 报文。如果这是对之前发送的 PUBLISH 报文的重发,则 DUP 可以设置为 1。
  • 注意:DUP = 1 不代表接收方一定已经收到过这条消息,它表示发送方正在重发该报文。
  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 保留值
  1. 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协议工作原理