MQTT Remaining Length 从 127 到 128,为什么总包长多两字节
Remaining Length采用变长编码,127只用一个长度字节,128需要两个。因此载荷增加一字节跨过边界时,总包长可能增加两字节。
本文由器赋开物编辑整理,AI 辅助撰写。下面输入是合成对照,用于复算公式或协议规则,没有连接真实设备完成现场验证。
本次具体要判断什么?
主题1byte、QoS0时,124byte载荷对应RL=127、总长129byte;载荷125byte则RL=128、总长131byte。这个边界不涉及网络头,只来自MQTT固定头的长度编码。
先保存可复算的对照输入
打开MQTT 3.1.1 PUBLISH 报文大小计算器,把默认值改为下表场景。文字或字节过长时这里只展示摘要,完整原始输入在附件中。
| 输入项目 | 对照值 | 单位或格式 |
|---|---|---|
| 主题UTF-8字节数 | 1 | byte |
| 载荷字节数 | 125 | byte |
| QoS | 0 | 见字段定义 |
模型或规则得到什么结果?
RL=2+主题字节+(QoS>0?2:0)+载荷;总长=1+RL编码长度+RL
| 结果项目 | 对照输出 | 单位 |
|---|---|---|
| Remaining Length | 128 | byte |
| 长度字段占用 | 2 | byte |
| 单个PUBLISH总长度 | 131 | byte |
只计算MQTT 3.1.1单个PUBLISH包,不含QoS握手、TCP/IP、TLS、重传或MQTT 5属性。
下载本例完整输入、输出与核验记录 JSON。64 位整数按字符串保留,未四舍五入的计算值保存在附件;设备、仪器和实际结论栏目留空,不把预测当测量。
怎样核对和排查?
分别保存边界两侧的输入,核对可变头、主题和载荷相加得到RL,再独立按128进制组计算长度字节。若QoS变成1或2,还要加入包标识两字节,可能使边界在更早的载荷长度出现。
哪些做法容易误判?
RL不包含固定头首字节和它自身长度。把整个包总长再作为RL输入或把QoS握手响应加进单个PUBLISH,都会混淆层级。
什么条件才足以接受结论?
边界对照中RL与总长关系一致,并核对协议为3.1.1。MQTT5属性不在此模型内,不能靠额外加一个未知常数覆盖全部版本差异。
适用范围与相关资料
继续查阅相关原理或其他工具。使用不同工具时先核对输入单位、模型和协议版本,避免把一个场景的结论直接套到另一个场景。
不含QoS后续握手、TCP/IP、TLS和重传,不用于MQTT5属性或主题别名。
依据:OASIS MQTT 3.1.1正式规范。实现检查覆盖了独立算例和拒绝路径;工具自身通过测试不能替代你对硬件、SDK版本和业务规则的核验。
继续处理相邻任务
本文为公开资料整理,非亲测。关键参数与代码请结合实物与下列官方来源验证。
- OASIS MQTT 3.1.1正式规范 ↗
docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html