我正在研究MQTT协议,似乎规范的第一行存在矛盾:
该协议通过TCP/IP或其他提供有序、无损、双向连接的网络协议运行。其特点包括:
[...]
消息传递的三种服务质量:
如果MQTT只能在无损的网络协议上运行,那么提供有损级别的QoS(级别0)的含义是什么?
我认为这甚至是不可能的,因为TCP协议将负责丢失消息的重传。这对于旨在运行在非TCP、不可靠网络上的MQTTSN来说是有意义的。
(备注:1级至少一次在使用TCP协议时没有意义,因为TCP已经包含了这种保证,但在更一般的情况下可能是有意义的,因为规范说可以使用其他无损协议)
严格地说,在TCP/IP层确认的TCP帧并不一定意味着在应用层,需要对数据包进行的任何操作都已有效完成。
在丢失MQTT QoS 0数据包的情况下,可能发生的情况是TCP数据包到达代理(即从客户端的角度来看确实是ACK的),但代理在将消息传递给所有订阅的客户端的过程中崩溃。
假设您有100,000个客户端订阅了MQTT主题-将数据转发到订阅的客户端需要一段时间,并且代理可能会在过程中死亡。从发布者的角度来看,消息确实已发布到代理,但确实存在消息丢失,因为一些订阅者永远不会听到该消息。