提问者:小点点

MQTT QoS的用途/目的是什么?


我正在研究MQTT协议,似乎规范的第一行存在矛盾:

该协议通过TCP/IP或其他提供有序、无损、双向连接的网络协议运行。其特点包括:

[...]

消息传递的三种服务质量:

  • “最多一次”,根据操作环境的最大努力传递消息。可能会发生消息丢失。例如,此级别可用于环境传感器数据,如果单个读数丢失并不重要,因为下一个读数将很快发布。·
  • “至少一次”,确保消息到达但可能发生重复。·
  • “恰好一次”,其中消息确保恰好到达一次。例如,此级别可用于计费系统,其中重复或丢失的消息可能导致应用不正确的费用。

如果MQTT只能在无损的网络协议上运行,那么提供有损级别的QoS(级别0)的含义是什么?

我认为这甚至是不可能的,因为TCP协议将负责丢失消息的重传。这对于旨在运行在非TCP、不可靠网络上的MQTTSN来说是有意义的。

(备注:1级至少一次在使用TCP协议时没有意义,因为TCP已经包含了这种保证,但在更一般的情况下可能是有意义的,因为规范说可以使用其他无损协议)


共1个答案

匿名用户

严格地说,在TCP/IP层确认的TCP帧并不一定意味着在应用层,需要对数据包进行的任何操作都已有效完成。

在丢失MQTT QoS 0数据包的情况下,可能发生的情况是TCP数据包到达代理(即从客户端的角度来看确实是ACK的),但代理在将消息传递给所有订阅的客户端的过程中崩溃。

假设您有100,000个客户端订阅了MQTT主题-将数据转发到订阅的客户端需要一段时间,并且代理可能会在过程中死亡。从发布者的角度来看,消息确实已发布到代理,但确实存在消息丢失,因为一些订阅者永远不会听到该消息。