IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:38:29  更:2021-11-29 16:39:00 
 
开发: 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年7日历 -2024/7/6 7:42:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码