PUBLISH 与 QoS 握手报文格式
OASIS MQTT 5.0:§3.3 PUBLISH、§3.4 PUBACK、§3.5 PUBREC、§3.6 PUBREL、§3.7 PUBCOMP
QoS 语义综述另见:03-QoS与消息投递.md
1. PUBLISH(§3.3)
1.1 Fixed Header
1 | Type=3 | DUP | QoS1 | QoS0 | RETAIN | Remaining Length… |
| 标志 | 含义 |
|---|---|
| DUP | 1=可能是重传的 PUBLISH(QoS>0);接收方须按 Packet ID 去重/续传逻辑处理 |
| QoS | 00=0,01=1,10=2;11 非法 → 协议错误 |
| RETAIN | 1=Server 应作为该 Topic 的保留消息存储/替换(空载荷 Retain 可删除保留消息,见规范) |
1.2 Variable Header
1 | Topic Name → Packet Identifier(若 QoS>0) → Properties(5.0) |
| 字段 | 规则 |
|---|---|
| Topic Name | UTF-8;不得含通配符;可用 Topic Alias 缩短(5.0) |
| Packet Identifier | QoS 1/2 必须;QoS 0 不得出现 |
| Properties | Payload Format、Message Expiry、Topic Alias、Response Topic、Correlation Data、User Property、Subscription Identifier、Content Type 等 |
1.3 Payload
- 应用消息原始字节;长度 = Remaining Length − Variable Header 长度
- 协议对内容不可知(JSON/Protobuf/二进制均可)
1.4 抓包心算
1 | Fixed Header: 0x30 = PUBLISH, QoS0, no DUP, no RETAIN |
2. QoS 0:无确认
1 | Sender ──PUBLISH (QoS0)──▶ Receiver |
无 Packet Identifier;可丢。
3. QoS 1:PUBACK(§3.4)
1 | Sender ──PUBLISH (QoS1, PacketID=P, DUP?)──▶ Receiver |
PUBACK 结构
| 部分 | 内容 |
|---|---|
| Fixed Header | Type=4,Flags=0000 |
| Variable Header | Packet Identifier;5.0 可跟 Reason Code + Properties |
| Payload | 无 |
成功 Reason 常为 0x00 Success;亦可 0x10 No matching subscribers 等(5.0,视角色)。
超时未收到 PUBACK → Sender 以 DUP=1 重传同一 Packet ID 的 PUBLISH。
4. QoS 2:四步握手(§3.5~3.7)
1 | Sender ──PUBLISH (QoS2, P)──▶ Receiver |
| 报文 | Type | Flags | 作用 |
|---|---|---|---|
| PUBREC | 5 | 0000 | Receiver:已收到,进入第二阶段 |
| PUBREL | 6 | 0010 | Sender:释放;可带 Reason(5.0) |
| PUBCOMP | 7 | 0000 | Receiver:完成 |
任一步超时按规范重传对应报文;状态机必须持久化未完成流(会话恢复相关)。
MQTT 5 下 PUBREC/PUBREL/PUBCOMP 均可带 Reason Code + Properties(如 Reason String)。
5. 端到端注意(规范视角)
- QoS 保证的是 MQTT 协议跳(如 Client↔Server),不是自动的业务全局 exactly-once
- Publisher→Server 与 Server→Subscriber 是两段独立 QoS
- 应用层仍建议:
message_id/ 幂等键
6. 3.1.1 vs 5.0
| 项 | 3.1.1 | 5.0 |
|---|---|---|
| PUBACK 等 | 仅 Packet ID | + Reason Code + Properties |
| PUBLISH 元数据 | 无标准属性 | Topic Alias、Expiry、Response Topic… |
| 无匹配订阅者 | 无标准反馈 | PUBACK Reason 0x10 等 |
正在加载留言…