PUBLISH 与 QoS 握手报文格式

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
2
3
4
Fixed Header: 0x30 = PUBLISH, QoS0, no DUP, no RETAIN
Fixed Header: 0x32 = PUBLISH, QoS1
Fixed Header: 0x33 = PUBLISH, QoS1 + RETAIN
Fixed Header: 0x34 = PUBLISH, QoS2

2. QoS 0:无确认

1
Sender ──PUBLISH (QoS0)──▶ Receiver

无 Packet Identifier;可丢。


3. QoS 1:PUBACK(§3.4)

1
2
Sender ──PUBLISH (QoS1, PacketID=P, DUP?)──▶ Receiver
Sender ◀─PUBACK (PacketID=P, Reason?)───── 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
2
3
4
Sender ──PUBLISH (QoS2, P)──▶ Receiver
Sender ◀─PUBREC (P)───────── Receiver
Sender ──PUBREL (P)─────────▶ Receiver # Flags 必须 0010
Sender ◀─PUBCOMP (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

下一篇:13-SUBSCRIBE与UNSUBSCRIBE报文格式.md

文章互动

阅读 --

留言

0 条留言

正在加载留言…