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