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)

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

  1. 【学习笔记】传输层:TCP协议(报文段、连接管理{握手}、可靠传输、流量控制、拥塞控制)

    文章目录 一. 协议特点 & 报文段 ① 特点 ② 报文段首部格式 二. TCP连接管理 ① 建立联系(三次握手) SYN洪泛攻击 ② 连接释放(四次挥手) 三. TCP流量控制 ① 序号 ② ...

  2. 网络原理 | TCP/IP中的连接管理机制 重要协议与核心机制

    应用层.传输层.网络层.数据链路层.物理层 一.应用层协议 应用层 是程序猿最最经常打交道的一层 其他四层,都是操作系统.驱动.硬件,实现好了的,咱们不需要管 (除非你是系统工程师,驱动开发工程师-- ...

  3. TCP协议-TCP连接管理

    一.TCP概述 TCP协议是 TCP/IP 协议族中一个非常重要的协议.它是一种面向连接.提供可靠服务.面向字节流的传输层通信协议. TCP(Transmission Control Protocol ...

  4. 网络原理 --- 传输层Ⅱ TCP协议中的确认应答,超时重传和连接管理

    文章目录 网络原理 传输层 TCP 协议 TCP的基本特性 1.确认应答 2.超时重传 3.连接管理 ❗❗①建立连接(三次握手) ②断开连接(四次挥手) 总结 网络原理 介绍TCP/IP协议中每一层里 ...

  5. dubbo协议_Dubbo协议解析与OPPO自研ESA RPC框架实践

    本文来自OPPO互联网基础技术团队,转载请注名作者.同时欢迎关注我们的公众号:OPPO_tech,与你分享OPPO前沿互联网技术及活动. 1. 背景 Dubbo是一款高性能.轻量级的开源Java RP ...

  6. 网络协议及网络软件框架设计网络协议

    >>Drew的主页--->网络协议 主页 VxWorks ARM PowerPC 硬件驱动 网络协议 程序示例 下载 个人兴趣 网络协议及网络软件框架设计 网络协议 TCP/IP ( ...

  7. 互联网协议 — QUIC 快速 UDP 互联网连接

    目录 文章目录 目录 QUIC QUIC 的特性 基于 UDP 可靠性 数据流 有序交付 快速握手 安全性 连接迁移 解决队头阻塞 HTTP/3 支撑 QUIC 的工作原理 连接 数据流 用户态实现 ...

  8. python 全栈开发,Day66(web应用,http协议简介,web框架)

    一.web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...

  9. 了解TCP协议,IP协议、ICMP协议和ARP协议(TCP报文,TCP的分成管理,TCP与UDP,TCP的三次握手四次挥手原理)

    文章目录 了解TCP/IP协议 TCP报文格式 TCP/IP 的分层管理 TCP与UDP TCP的三次握手与四次挥手 为什么要三次握手? 为什么要四次挥手? IP数据包格式 ICMP协议 ICMP协议 ...

最新文章

  1. jtoken判断是否包含键_Redis列表键(linkedlist/ziplist)的介绍
  2. 【Unity开源项目精选】AirSim
  3. html 中写注释吗,html怎么注释?
  4. 计算机设备安装属于劳务吗,​安装服务费属于劳务费吗
  5. 吴恩达神经网络和深度学习-学习笔记-19-机器学习策略(正交化+单一数字评估指标)
  6. sm2和sm4加密算法浅析
  7. oracle设计案例,Oracle课程设计案例精编
  8. 三极管参数应用大全(转载)
  9. 【无标题】Vue长列表性能优化常用方案
  10. 怎么证明根号2是无理数,我们来推导和计算,还有逼格极高的算法
  11. 删了手机里的一个html文件,手机操作篇:手机上怎么删除pdf其中一页
  12. Android模仿新浪微博(自定义ListView下拉刷新)
  13. 前端架构设计应该包含哪些东西?
  14. OCI动态链接ORACLE
  15. NetBeans 尚未部署该模块错误 解决方案
  16. acm国家集训队论文(1999-2009)
  17. 10、Hibernate的对象检索策略
  18. Intellij IDEA如何设置为中文界面?
  19. PC服务器硬盘故障处理
  20. python字典、列表、元祖使用场景_(三)PYTHON字典 元祖 列表尝试应用

热门文章

  1. Word中试卷各选项提取到Excel对应列
  2. oracle int相减,求sql语句。得出表中两列相减的值
  3. ASO优化之什么原因会导致关键词落榜?
  4. 写作路上的这些小成绩,铸就了一个不平庸的我
  5. 堪比顶尖奢侈品牌的沙发,你了解多少
  6. AlexNet-阅读笔记-理解
  7. 模板引擎jsrender简单使用
  8. throw 、自定义异常
  9. 云片php sdk,GitHub - argb/yunpian-sms: A php SDK for yunpian(云片网络) sms RESTFULL API
  10. 678云盘服务器,GitHub - zxy678/TeambitionShare: 挂载Teambition文件 可直链分享 支持网盘(需申请)和项目文件(无需邀请码)...