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

时间:2016-09-01 17:49:32

标签: tcp mqtt qos

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

  

协议通过TCP / IP或其他网络协议运行   提供有序的,无损耗的双向连接。它的功能   包括:

     

[...]

     

三种服务质量   消息传递:

     
      
  • “最多一次”,消息在哪里   根据运营环境的最佳努力交付。   可能会发生邮件丢失。例如,可以使用此级别   环境传感器数据,如果个人阅读无关紧要   由于下一个将很快发布,所以会丢失。 ·
  •   
  • “在   至少一次“,确保消息到达,但重复可以   发生。 ·
  •   
  • “恰好一次”,确保信息到达   一次。例如,可以使用此级别进行计费   重复或丢失邮件可能导致错误的系统   收费。
  •   

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

我认为甚至不可能提供这一点,因为TCP协议将负责重传丢失的消息。这对于MQTT-SN来说是有意义的,它旨在通过非TCP,不可靠的网络运行。

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

1 个答案:

答案 0 :(得分:13)

严格地说,在TCP / IP层上确认的TCP帧并不一定意味着,在应用层,已经有效地完成了对数据包所需要做的任何事情。

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

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