MQTT协议回顾
1.基础模型:
基于 发布 - 订阅(Publish/Subscribe) 模式,
核心角色有 客户端(Client)(既可以发布也能订阅消息)=消息的发布者和订阅者
服务器(Broker)(负责接收、转发消息,匹配订阅关系)。
2.核心特性:
轻量级:协议头小(固定头 + 可变头 + 有效载荷),最小数据包可极简传输,
适配低带宽、弱网络场景。
QoS(Quality of Service):分 0(最多发一次,不保证到达)、
1(至少发一次,丢包重传)、
2(仅发一次,确保消息精准投递)三级
11 预留
遗嘱(Will Message):客户端异常断开时,Broker 代发预设消息,
用于设备离线状态通知。
保留消息(Retained Message):Broker 存储最新消息,新订阅者上线直接
获该内容,适合 “状态同步” 场景(如传感器实时数值)。
2.协议流程
把 MQTT 交互拆成
「网络连接」→「协议握手」→「消息交互」→「断开连接」 四个阶段,
1. MQTT 是应用层协议,必须依赖 TCP 提供 可靠字节流传输
(避免消息丢包、乱序),所以第一步先完成 TCP 三次握手。
2. TCP 连接建立后,客户端立即发 CONNECT 报文,完成 MQTT
协议层的 “身份验证 + 会话配置”
客户端发 CONNECT 后,Broker 必须回复 CONNACK,
核心看 Session Present 和 Return Code
3. 协议握手成功后,客户端与 Broker 进入 双向消息交互阶段,
核心动作有 4 类:
(1) PUBLISH发布消息,客户端或 Broker 都能发 PUBLISH
(2) SUBSCRIBE订阅主题,客户端发 SUBSCRIBE 报文,
申请订阅一个或多个主题,Broker 回复 SUBACK 确认
(3) UNSUBSCRIBE:取消订阅 客户端发 UNSUBSCRIBE 报文,
Broker 回复 UNSUBACK 确认,流程简单
(4) PING:心跳保活 若设置了 Keep Alive,客户端需定期发
PINGREQ,Broker 回复 PINGRESP
4. 断开连接(DISCONNECT)客户端主动发 DISCONNECT 报文,
正常关闭连接:
若 Will Message 已配置,正常断开不会触发遗嘱消息(只有异常断开才触发)。
Broker 收到 DISCONNECT 后,清理该客户端的临时会话
控制报文结构:
┌───────────────┐ 固定报头(必选,所有报文都有)
│ Fixed Header │ → 含「报文类型 + 标志位 + 剩余长度」
├───────────────┤
│Variable Header│ 可变报头(可选,部分报文有,如 PUBLISH/QoS 相关)
├───────────────┤
│ Payload │ 报文体、有效载荷(可选,部分报文有,如实际消息内容)
└───────────────┘
与 TCP/IP 的关系:MQTT 是 应用层协议,底层必须基于 TCP/IP 协议栈
(或兼容网络层)建立可靠连接,Broker 和客户端通过 TCP socket 收发数据,
借助 TCP 的 “三次握手”“重传机制” 保障消息传输基础可靠性。