2.1.3 发布管理
发布管理是建链后,进行消息通信的第一步,是由发布客户端往服务端发送一个主题,或者由服务端往客户端发布一个主题。同样的我们将按照发布的正常流程和异常流程,以及发布的控制报文和有效载荷的视角进行解读。
1)发布正常流程
如下图所示以客户端往服务端发送主题为例,注意这个方向可以是反过来的。从图中可以看出服务端在收到发布主题的消息后,会依据报文中的QOS等级进行回复。如果是QOS1等级,即至少发布一次,则会只回复一个发布确认,假设此次交互中失败了,那按照设定的QOS1等级,客户端可以再次发送,直到发送成功,因此上述的一次交互也是合理的。如果是QOS2等级,即只发布一次,则会进行两次的握手,首先会告知客户端发布收到,然后客户端会根据设定的只发布一次的规则,告知服务端发布释放,最后再由服务端通过发布完成告知客户端完成所有流程。与第一种可以多次收发不同,这种方式只能收发一次,因此需要通过多次握手,保证确保主题可以发布成功。
2)发布控制报文
如下图所示是发布的控制报文,与上图一一对应,PUBLISH的可变报文头会包含topic的信息,至于说topic的内容,则在有效载荷中包含,由具体的应用决定。在PUBLISH报文的固定报文头中包含QOS0~2的等级,QOS0是没有回复的,剩下的两个等级有回复,另外如果是重发的PUBLISH报文,DUP的位会被设置为1。其他的回复报文比较简单,如果想了解控制报文的详细格式可以对照参考文献MQTT协议[2]。
3)发布有效载荷
如下图所示,在发布管理的的5种控制报文中,只有PUBLISH报文有有效载荷,该载荷就是topic主题的内容,该内容是由具体的应用决定,除此以外其他的都没有。
4)发布异常流程
连接建立以后,在发布主题的时候也是有断链的情况出现的,这个时候需要明确是在发送哪个报文的时候出现断链,如下图所示是在该场景下PUBLISH报文和PUBREL报文异常时出现的断链。可以根据图示的位值进行排查。
未完待续...
参考文献: