我正在研究MQTT协议,似乎在规范的第一行中存在矛盾:
该协议通过TCP/IP或其他提供有序,无损,双向连接的网络协议运行.其功能包括:
[...]
消息传递的三种服务质量:
- "最多一次",根据操作环境的最佳努力传递消息. 可能会发生消息丢失.例如,该水平可以用于环境传感器数据,其中如果个体读数丢失则无关紧要,因为下一个读数将很快发布.·
- "至少一次",确保消息到达但可能发生重复.·
- "恰好一次",确保消息准确到达一次.例如,此级别可用于计费系统,其中重复或丢失的消息可能导致应用不正确的费用.
如果MQTT只能运行无损的网络协议,那么提供有损QoS级别(级别0)的含义是什么?
我认为甚至不可能提供这一点,因为TCP协议将负责重传丢失的消息.这对于旨在在非TCP,不可靠网络上运行的MQTT-SN来说是有意义的.
(备注:级别1"至少一次"在使用TCP协议时没有意义,因为TCP已经包含此保证,但在更一般的情况下可能有意义,因为规范说可能使用其他无损协议)
kar*_*ben 16
严格地说,在TCP/IP层上确认的TCP帧并不一定意味着,在应用层,已经有效地完成了对分组所需要做的任何事情.
在丢失MQTT QoS 0数据包的情况下,可能发生的是TCP数据包到达代理(即从客户端的角度确实是确认的),但是代理在传递消息的过程中崩溃了所有订阅的客户.
假设您有100,000个客户订阅了MQTT主题 - 将数据转发给订阅的客户端需要一段时间,并且代理可能会在流程中间死亡.从发布者的角度来看,该消息确实已发布到代理,但确实存在消息丢失,因为一些订阅者永远不会听到该消息.
| 归档时间: |
|
| 查看次数: |
1065 次 |
| 最近记录: |