我认为我们可以只使用publish和pubrcv来满足QoS2。
当服务器接收发布数据包时,保存到db,然后服务器将其发布到其他客户端,例如。客户B。即使我们从ClientA接收两个相同的发布数据包,服务器也会检查db,并且知道这是重复的消息,因此不要发布到ClientB。
所以我认为不需要4个数据包。
我的逻辑正确吗?
该协议使用数据包的两次交换,以提供QoS 2消息传递的精确语义。
C --- PUBLISH --> S
*1
C <-- PUBREC  --- S
*2
C --- PUBREL  --> S
*3
C <-- PUBCOMP --- S
*4
当服务器收到时,PUBLISH它将存储ID并转发消息。当服务器收到时PUBREL,可以删除该ID。
如果连接在断开*1,则客户端不知道服务器是否收到该消息。它重新发送PUBLISH(包含完整的消息有效负载)。如果服务器已经收到该消息,则只需使用进行响应PUBREC。
如果连接断开*2,则客户端可能收到或尚未收到PUBREC。如果没有,它将重新发送PUBLISH。否则它将发送PUBREL。
如果连接在断开*3,则客户端不知道服务器是否收到该消息。它重新发送PUBREL-不包含完整的消息有效负载。
如果连接在断开*4并且客户端尚未收到,PUBCOMP则可以重新发送PUBREL。
对于为什么需要两次交换有两个观察结果:
*1。鉴于该协议旨在最大程度地减少网络流量,因此这是一项重要功能。