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

Ped*_*nso 8 qos tcp mqtt

我正在研究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主题 - 将数据转发给订阅的客户端需要一段时间,并且代理可能会在流程中间死亡.从发布者的角度来看,该消息确实已发布到代理,但确实存在消息丢失,因为一些订阅者永远不会听到该消息.