mqtt协议实现--协议框架和连接管理(1)

2、MQTT协议实现

2.1 协议栈基本工作原理

        MQTT实现的最核心的思想是发布/订阅模式,基本的工作原理是首先要通信双方建立连接,然后由服务端发布主题,客户端向broker订阅需要的主题,通过这种异步的方式实现客户和服务端间的通信。在保障通信质量方面,主要从两方面入手:其一是链路检测,通过心跳报文的定时收发,当发生断链时能够让通信双方知道这个事件;其二是消息重传,即引入了qos,保证在因网络故障发生丢包的情况下,可以通知对方重新发送报文,让信息可以正确传递。接下来将针对这里边的每一个核心功能做重点介绍。

2.1.1 协议栈架构

        如下图所示就是MQTT协议栈的架构图,该图是依据MQTT协议[2]总结出来的。从图中可以看出整个协议栈依赖于tcp/ip协议,包括连接管理、发布客户端、订阅客户端和服务端四个模块。其中连接管理模块主要为客户和服务端建立连接,在订阅客户端会通过心跳检测链路状态。发布客户端主要是实现发布管理,管理发布的主题,通过与服务端的多次握手,保证主题能够发布到服务端。订阅客户端主要实现订阅管理,管理订阅的主题,同样与服务端的多次握手,保证主题能够被订阅到。作为中间起桥梁作用的服务端,会同时去实现上述三个模块的回应功能,这样消息就可以在不同的角色之间流转。接下来的几节将深入各个模块内部探讨实现流程。

mqtt协议实现--协议框架和连接管理(1)_第1张图片

 2.1.2 连接管理

        连接管理是整个MQTT通信的基础,无论是订阅还是发布,第一步都是要先建立连接,让通信的双方有共同的逻辑通道。接下来将分析一下该模块正常和异常连接的流程,通信的报文控制信息和有效载荷。注意此节及后续模块的解读,目的不是对协议栈进行二次陈述,而是抓住协议文档中体现不出来的流程和模块的关系进行详述,并且从使用者的视角探寻。

1)正常的连接流程

如下图所示,是客户端和服务端之间建链、维持链接和断链的交互图,图中可以看出在建链方面,订阅者和发布者无差别,都是跟服务端连接,不是直接连接,这样的好处就是通信双方可以无须关注对方的连接状态,只需要关心本端和服务器的连接状态即可。在完成主题发布或者订阅后,作为发布者会断开同服务端的连接,需要的话再连接就可以,这样的好处是发布者不用时时刻刻同服务端保持连接,节省了带宽。作为订阅者则不同,会一直和服务端之间保持一个链接状态,而且为了维持这种状态,以s为单位会发一个心跳检测报文,这样即使在某个时刻订阅端和服务端之间断链了,也可以重新连接上,保证订阅端能够随时收到服务端的消息。

mqtt协议实现--协议框架和连接管理(1)_第2张图片 2)连接控制报文

        在MQTT协议栈中与上述的连接,断链和心跳请求有对应的控制报文,如下图所示。从发送的报文名称也能明显的看出报文的功能,如PINGREQ就是对应心跳请求报文,PINGRESP对应心跳响应报文,此处不再详述。如果想了解控制报文的详细格式可以对照参考文献MQTT协议[2]。

mqtt协议实现--协议框架和连接管理(1)_第3张图片

 3)连接报文有效载荷

       这一小节,关于有效载荷的需要特别注意,只有上述的CONNECT报文才有有效载荷,其他的诸如CONNACK、PINGREQ等控制报文是没有有效载荷的。如下图所示是CONNECT报文的有效载荷中关键的信息,其中有与角色有关的唯一标识符、安全有关的用户名和密码以及出现异常时的遗嘱主题和消息。这些信息都是客户端(无论是订阅还是发布)和服务端保证有效安全连接的基础。

mqtt协议实现--协议框架和连接管理(1)_第4张图片

4)连接异常处理流程

        为何要关注异常处理流程,在实际的应用场景下,网络通常是不稳定的,所以不管在连接过程中还是连接后,经常会出现断链丢包的情况,这个时候就需要去定位断链的原因,那就需要熟悉有哪些断链的场景,如下图所示是协议提供的常见的断链场景,比如重复请求连接、协议名不正确等。作为协议的使用者也要特别关注这些异常,做好dfx手段,当出现问题时可以快速定位。

mqtt协议实现--协议框架和连接管理(1)_第5张图片

未完待续...

参考文献:

[2]Introduction · MQTT协议中文版 (gitbooks.io)

 

你可能感兴趣的:(万物互联之通信协议篇,mqtt,网络协议,物联网)