MQTT QoS2为什么使用4个数据包?

use*_*836 1 qos packet mqtt

我认为我们可以只使用publish和pubrcv来满足QoS2。

  1. ClientA->服务器发布数据包
  2. 服务器-> ClientA pubrecv数据包

当服务器接收发布数据包时,保存到db,然后服务器将其发布到其他客户端,例如。客户B。即使我们从ClientA接收两个相同的发布数据包,服务器也会检查db,并且知道这是重复的消息,因此不要发布到ClientB。

所以我认为不需要4个数据包。

我的逻辑正确吗?

kno*_*ary 5

该协议使用数据包的两次交换,以提供QoS 2消息传递的精确语义。

C --- PUBLISH --> S
*1
C <-- PUBREC  --- S
*2
C --- PUBREL  --> S
*3
C <-- PUBCOMP --- S
*4
Run Code Online (Sandbox Code Playgroud)

当服务器收到时,PUBLISH它将存储ID并转发消息。当服务器收到时PUBREL,可以删除该ID。

如果连接在断开*1,则客户端不知道服务器是否收到该消息。它重新发送PUBLISH(包含完整的消息有效负载)。如果服务器已经收到该消息,则只需使用进行响应PUBREC

如果连接断开*2,则客户端可能收到或尚未收到PUBREC。如果没有,它将重新发送PUBLISH。否则它将发送PUBREL

如果连接在断开*3,则客户端不知道服务器是否收到该消息。它重新发送PUBREL-不包含完整的消息有效负载。

如果连接在断开*4并且客户端尚未收到,PUBCOMP则可以重新发送PUBREL

对于为什么需要两次交换有两个观察结果:

  1. 服务器不需要记住它所见过的每条消息。有一个非常明确的期限来存储消息ID。两次交换使双方可以确定消息已被准确地传递一次。
  2. 客户端不需要多次重发消息(除非在处中断了连接*1。鉴于该协议旨在最大程度地减少网络流量,因此这是一项重要功能。