当前位置: 首页 > news >正文

MQTT 5.0 报文解析 04:PINGREQ 与 PINGRESP

欢迎阅读 MQTT 5.0 报文系列 的第四篇文章。在上一篇中,我们已经介绍了 MQTT 5.0 中的 SUBSCRIBE 报文和 UNSUBSCRIBE 报文。现在,我们将介绍用于维持连接的控制报文:PINGREQ 和 PINGRESP。

除了用于连接、发布和订阅的控制报文,MQTT 还有一类报文用于在客户端和服务端之间模拟心跳,以达到保持连接的目的,它们分别是 PINGREQ 报文和 PINGRESP 报文,我们通常也会称它们为心跳报文。

客户端定期向服务端发送 PINGREQ 报文,服务端可以由此得知连接良好且客户端仍然活跃。每收到一个 PINGREQ 报文,服务端就会回复一个 PINGRESP 报文,因此客户端也可以由此得知连接良好且服务端仍然活跃。

报文示例

我们使用 MQTTX CLI 向 公共 MQTT 服务器 发起一个客户端连接,不发布消息也不订阅主题,但我们仍然可以在 Wireshark 中看到客户端和服务端之间总是周期性地出现 MQTT 报文的往返,这些报文就是 PINGREQ 和 PINGRESP 报文。

以下命令将创建一个 Keep Alive 为 5 秒的客户端连接,这可以让我们尽快看到客户端发送 PINGREQ 报文:

mqttx conn --hostname broker.emqx.io --mqtt-version 5 --keepalive 5

我们会发现 PINGREQ 和 PINGRESP 报文总是只有 2 个字节的大小,并且它们的内容似乎也永远不会发生变化:

# PINGREQ
c0 00
# PINGRESP
d0 00

这是因为这两个报文有着非常简单的报文结构。

PINGREQ & PINGRESP 报文结构

PINGREQ 和 PINGRESP 报文的区别仅仅是固定报头中报文类型的不同,12(0xC)表示这是一个 PINGREQ 报文,13(0xD)则表示这是一个 PINGRESP 报文。

因为 PINGREQ 和 PINGRESP 报文均不包含可变报头有效载荷,所以它们的固定报头中剩余长度字段的值永远都是 0。

PING 报文.png

这种报文结构让 PINGREQ 和 PINGRESP 报文的大小降到了最低,所以发送它们并不会占用太多的带宽。

总结

PINGREQ 和 PINGRESP 是 MQTT 中最简单的报文类型,它们的内容固定不变。我们唯一可以改变的,就是通过连接时的 Keep Alive 选项,影响客户端发送 PINGREQ 报文的频率。

如果服务端没有在 1.5 倍 Keep Alive 时间内收到客户端发送的任何控制报文,就会认为客户端处于非活跃状态或网络异常而断开连接。在本文的报文示例中,我们在连接时 Keep Alive 设置为 5 秒,那么对服务端来说超时时间就是 7.5 秒。

对于客户端来说,如果在发送 PINGREQ 报文之后的一段时间内,没有收到服务端返回的 PINRESP 报文,那么它应该断开连接。这个时间的长短,主要取决于客户端对网络延迟的预期以及各个客户端 SDK 的具体实现。

现在,我们对 MQTT 报文的了解又更进了一步,在下一篇文章中我们将继续介绍在断开连接时使用的 DISCONNECT 报文。

http://www.lryc.cn/news/347936.html

相关文章:

  • 【算法刨析】完全背包
  • notepad++
  • Python ValueError: bad transparency mask
  • Linux本地部署Nightingale夜莺监控并实现远程访问提高运维效率
  • 开关电源功率测试方法:输入、输出功率测试步骤
  • QT 文字转语言插件
  • Kubernetes(k8s)的认证(Authentication)策略解析
  • Scikit-Learn决策树
  • Python面试题【python基础部分1-50】
  • 鸿蒙内核源码分析(Shell编辑篇) | 两个任务,三个阶段
  • 第Ⅷ章-Ⅱ 组合式API使用
  • stable-diffusion-webui配置
  • 1+X电子商务数据采集渠道及工具选择(二)||电商数据采集API接口
  • apinto OpenAPI
  • XYCTF - web
  • 学习方法的重要性
  • 把现有的 Jenkins 容器推送到一个新的镜像标签,并且重新启动新的容器
  • 难以重现的 Bug如何处理
  • 我与足球的故事 | 10年的热爱 | 伤病 | 悔恨 | 放弃 or 继续 | 小学生的碎碎念罢了
  • js图片回显的方法
  • Java中的maven的安装和配置
  • 轴承制造企业“数智化”突破口
  • UIButton案例之添加动画
  • C#链接数据库、操作sql、选择串口
  • 本地搭建各大直播平台录屏服务结合内网穿透工具实现远程管理录屏任务
  • macos使用yarn创建vite时出现Usage Error: The nearest package directory问题
  • 【JAVA入门】Day04 - 方法
  • 前端报错 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse
  • Mybatis进阶详细用法
  • Android 系统省电软件分析