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 报文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/621018.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音上有可以长久赚钱的副业吗?当然有,只有它最稳定长久!

大家好,我是电商糖果 现在有很多年轻人在大城市上班,发现辛辛苦苦一年也赚不到多少钱。 如果说自己有了房贷,车贷,那更是一点儿不敢歇。 为了可以有更多的收入,年轻人都希望可以靠着下班时间,找一个可以…

visual sudio使用-创建空项目-创建cpp文件

新建空项目 新建cpp文件 #include <iostream> using namespace std;int main() {cout << "hello vs" << endl;cout << "hello c" << "\n";cout << "hello first day\n"; }

如何在群晖NAS中开启FTP并实现使用公网地址远程访问传输文件

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具&#xff0c;实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…

关于SQL

数据库简介&#xff1a; 数据库分类 关系型数据库模型&#xff1a; 优点&#xff1a;易于维护&#xff0c;可以实现复杂的查询 缺点&#xff1a;海量数据 读取写入性能差&#xff0c;高并发下数据库的io是瓶颈 是把复杂的数据结构归结为简单的二元关系&#xff08;即二维表…

【数据结构】有关栈和队列相互转换问题

文章目录 用队列实现栈思路实现 用栈实现队列思路实现 用队列实现栈 Leetcode-225 用队列实现栈 思路 建立队列的基本结构并实现队列的基本操作 这部分这里就不多说了&#xff0c;需要的可以看笔者的另一篇博客 【数据结构】队列详解(Queue) 就简单带过一下需要实现的功能 …

分布式光伏管理系统的意义与核心技术

分布式光伏管理系统遵循安全可靠、经济合理原则&#xff0c;满足电力系统自动化总体规划要求&#xff0c;且充分考虑光伏发电的因素&#xff0c;对分布式光伏发电、用电进行集中监控、统一调度、统一运维。为用户提供运维服务&#xff0c;实现能源互联&#xff0c;信息互通&…

从使用教程、实现原理、差异对比全方面带你玩转业务系统中高频使用的过滤器与拦截器

1.概述 在Java Web开发中&#xff0c;**过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;**是两种常见的组件&#xff0c;用于在请求到达目标资源之前或之后执行一些操作&#xff0c;如日志记录、权限控制、字符编码处理等。虽然它们的作用有…

【Qt】demo示例--通过定时器实现时间刷新

【Qt】demo示例--通过定时器实现时间刷新 1.背景2.代码3.运行 1.背景 Qt Creator版本&#xff1a;4.2.0 &#xff0c;如下图&#xff1a; 即安装qt-opensource-windows-x86-msvc2013_64-5.7.1.exe 后自带得Qt编程IDE&#xff1b; 2.代码 项目结构如下&#xff1a; mydial…

Navicat Premium数据库新建函数报错问题

1.问题产生原因&#xff1a; (1)可能是软件 Navicat Premium 的版本不一样 (2)可能是与某些字符集不一样 2.找出解决办法&#xff1a; (1)参考对照系统自带sys数据库表的函数找出的区别&#xff08;后面遇到同样问题可以这样排查&#xff09; (2)不加 DETERMINISTIC 声明&a…

js图片回显的方法

直接上代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body>// HTML部分<input type"file" id"fileInput"><button onclick"show…

Nginx内网环境开启https

文章目录 前言一、open-ssl1. 验证2. 安装3.生成ssl证书 一、nginx1. 验证支持模块2. 安装必要模块2.1 重新编译nginx2.2 替换原文件 3. 配置https 总结 前言 nginx开启https前提&#xff1a; 服务器支持open-sslnginx 包含--with-http_ssl_module --with-stream --with-stre…

融知财经:期货和现货的区别是什么?哪个风险大?

期货和现货在交易对象等方面存在明显的区别。期货交易是一种衍生金融工具&#xff0c;主要用于价格发现、风险管理和投机&#xff0c;而现货交易则是商品和服务的实际买卖。在选择进行期货交易还是现货交易时&#xff0c;投资者需要根据自己的需求和市场情况来决定。 期货和现货…

In Context Learning(ICL)个人记录

In Context Learning&#xff08;ICL&#xff09;简介 In Context Learning&#xff08;ICL&#xff09;的关键思想是从类比中学习。上图给出了一个描述语言模型如何使用 ICL 进行决策的例子。首先&#xff0c;ICL 需要一些示例来形成一个演示上下文。这些示例通常是用自然语言…

C++牛客周赛题目分享(2)小红叕战小紫,小红的数组移动,小红的素数合并,小红的子序列求和

目录 ​编辑 1.前言 2.四道题目 1.小红叕战小紫 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思路 2.小红的数组移动 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思路 3.小红的素数合并 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思…

华东政法大学公布2024《负面清单期刊目录》,附目录

近日&#xff0c;华东政法大学公布2024《负面清单期刊目录》&#xff0c;包括《齐齐哈尔大学学报(哲学社会科学版)》《景德镇学院学报(社科)》《九江学院学报(社科)》《北京印刷学院学报》《江西电力职业技术学院学报》《中国多媒体与网络教学学报》《吉林省教育学院学报》《开…

pyqt动画效果放大与缩小

pyqt动画效果放大与缩小 QPropertyAnimation介绍放大与缩小效果代码 QPropertyAnimation介绍 QPropertyAnimation 是 PyQt中的一个类&#xff0c;它用于对 Qt 对象的属性进行动画处理。通过使用 QPropertyAnimation&#xff0c;你可以平滑地改变一个对象的属性值&#xff0c;例…

【新手入门】Github与Git使用教程

Github与Git 一、Github基础教程 1.1 基本操作 点击代码文件可以直接查看文件的内容&#xff0c;支持在线修改文件&#xff0c;只需要点击(文件内容)右上角的编辑按钮即可进行编辑。 README.md一般介绍项目的功能&#xff0c;用法&#xff0c;注意事项&#xff1b;有时还有…

二、安装、使用Grafana

目录 一、安装Grafana 二、使用grafana 一、安装Grafana 官网&#xff1a;https://grafana.com/ 账号&#xff1a;admin 密码&#xff1a;xxxxxx [rootrabbitmq_2 prometheus]# [rootrabbitmq_2 prometheus]# wget https://dl.grafana.com/enterprise/release/grafana-enter…

kubernetes集群开启ipvs模式

1&#xff09; 需要在所有节点机器安装ipvsadm&#xff1a; apt install ipvsadm 2) 加载ipvs模块 modprobe ip_vs modprobe ip_rr modprobe ip_wrr modprobe ip_sh修改k8s集群内的kube-proxy cm kubectl edit cm kube-proxy -n kube-system修改模式为ipvs&#xff1a; 如图 …

重大升级 | OpenSCA SaaS全面接入供应链安全情报!

结合社区用户反馈及研发小伙伴的积极探索&#xff0c; OpenSCA 项目组再次发力&#xff0c;SaaS版本重大升级啦&#xff01; 用户的需求是OpenSCA前进的动力&#xff0c;欢迎更多感兴趣的朋友们积极试用和反馈~ 更 新 内 容 1.全面接入云脉XSBOM供应链安全情报 2.强大的资产…