| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> mqtt协议实现--协议框架和连接管理(1) -> 正文阅读 |
|
[网络协议]mqtt协议实现--协议框架和连接管理(1) |
2、MQTT协议实现 2.1 协议栈基本工作原理 ? ? ? ? MQTT实现的最核心的思想是发布/订阅模式,基本的工作原理是首先要通信双方建立连接,然后由服务端发布主题,客户端向broker订阅需要的主题,通过这种异步的方式实现客户和服务端间的通信。在保障通信质量方面,主要从两方面入手:其一是链路检测,通过心跳报文的定时收发,当发生断链时能够让通信双方知道这个事件;其二是消息重传,即引入了qos,保证在因网络故障发生丢包的情况下,可以通知对方重新发送报文,让信息可以正确传递。接下来将针对这里边的每一个核心功能做重点介绍。 2.1.1 协议栈架构 ? ? ? ? 如下图所示就是MQTT协议栈的架构图,该图是依据MQTT协议[2]总结出来的。从图中可以看出整个协议栈依赖于tcp/ip协议,包括连接管理、发布客户端、订阅客户端和服务端四个模块。其中连接管理模块主要为客户和服务端建立连接,在订阅客户端会通过心跳检测链路状态。发布客户端主要是实现发布管理,管理发布的主题,通过与服务端的多次握手,保证主题能够发布到服务端。订阅客户端主要实现订阅管理,管理订阅的主题,同样与服务端的多次握手,保证主题能够被订阅到。作为中间起桥梁作用的服务端,会同时去实现上述三个模块的回应功能,这样消息就可以在不同的角色之间流转。接下来的几节将深入各个模块内部探讨实现流程。 ?2.1.2 连接管理 ? ? ? ? 连接管理是整个MQTT通信的基础,无论是订阅还是发布,第一步都是要先建立连接,让通信的双方有共同的逻辑通道。接下来将分析一下该模块正常和异常连接的流程,通信的报文控制信息和有效载荷。注意此节及后续模块的解读,目的不是对协议栈进行二次陈述,而是抓住协议文档中体现不出来的流程和模块的关系进行详述,并且从使用者的视角探寻。 1)正常的连接流程 如下图所示,是客户端和服务端之间建链、维持链接和断链的交互图,图中可以看出在建链方面,订阅者和发布者无差别,都是跟服务端连接,不是直接连接,这样的好处就是通信双方可以无须关注对方的连接状态,只需要关心本端和服务器的连接状态即可。在完成主题发布或者订阅后,作为发布者会断开同服务端的连接,需要的话再连接就可以,这样的好处是发布者不用时时刻刻同服务端保持连接,节省了带宽。作为订阅者则不同,会一直和服务端之间保持一个链接状态,而且为了维持这种状态,以s为单位会发一个心跳检测报文,这样即使在某个时刻订阅端和服务端之间断链了,也可以重新连接上,保证订阅端能够随时收到服务端的消息。 ?2)连接控制报文 ? ? ? ? 在MQTT协议栈中与上述的连接,断链和心跳请求有对应的控制报文,如下图所示。从发送的报文名称也能明显的看出报文的功能,如PINGREQ就是对应心跳请求报文,PINGRESP对应心跳响应报文,此处不再详述。如果想了解控制报文的详细格式可以对照参考文献MQTT协议[2]。 ?3)连接报文有效载荷 ? ? ? ?这一小节,关于有效载荷的需要特别注意,只有上述的CONNECT报文才有有效载荷,其他的诸如CONNACK、PINGREQ等控制报文是没有有效载荷的。如下图所示是CONNECT报文的有效载荷中关键的信息,其中有与角色有关的唯一标识符、安全有关的用户名和密码以及出现异常时的遗嘱主题和消息。这些信息都是客户端(无论是订阅还是发布)和服务端保证有效安全连接的基础。 4)连接异常处理流程 ? ? ? ? 为何要关注异常处理流程,在实际的应用场景下,网络通常是不稳定的,所以不管在连接过程中还是连接后,经常会出现断链丢包的情况,这个时候就需要去定位断链的原因,那就需要熟悉有哪些断链的场景,如下图所示是协议提供的常见的断链场景,比如重复请求连接、协议名不正确等。作为协议的使用者也要特别关注这些异常,做好dfx手段,当出现问题时可以快速定位。 未完待续... 参考文献: [2]Introduction · MQTT协议中文版 (gitbooks.io) ? |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:01:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |