MQTT Keep Alive机制

MQTT 协议是承载于 TCP 协议之上的, 而 TCP 协议以连接为导向, 在连接双方之间, 提供稳定、 有序的字节流功能。 但是, 在部分情况下, TCP 可能出现半连接问题。 所谓半连接, 是指某一方的连接已经断开或者没有建立, 而另外一方的连接却依然维持着。 在这种情况下, 半连接的一方可能会持续不断地向对端发送数据, 而显然这些数据永远到达不了对端。 为了避免半连接导致的通信黑洞, MQTT 协议提供了Keep Alive 机制, 使客户端和 MQTT 服务器可以判定当前是否存在半连接问题, 从而关闭对应连接。

启用 Keep Alive
客户端在创建和 MQTT Broker 的连接时, 只要将连接请求协议包内的 Keep Alive 可变头部字段设置为非 0 值, 就可以在通信双方间启用 Keep Alive 机制。 Keep Alive 为 0~65535 的一个整数, 代表客户端发送两次 MQTT 协议包之间的最大间隔时间。而 Broker 在收到客户端的连接请求后, 会检查可变头部中的 Keep Alive 字段的值, 如果有值, 则 Broker将会启用 Keep Alive 机制。

在 MQTT 5.0 标准中, 引入了 Server Keep Alive 的概念, 允许 Broker 根据自身的实现等因素, 选择接受客户端请求中携带的 Keep Alive 值, 或者是覆盖这个值。 如果 Broker 选择覆盖这个值, 则需要将新值设置在连接确认包(CONNACK) 的 Server Keep Alive 字段中, 客户端如果在连接确认包中读取到了Server Keep Alive, 则需要使用该值, 覆盖自己之前的Keep Alive 的值。

Keep Alive 机制流程

  • 客户端流程
    在连接建立后, 客户端需要确保, 自己任意两次 MQTT 协议包的发送间隔不超过 Keep Alive 的值, 如果客户端当前处于空闲状态, 没有可发送的包, 则可以发送 PINGREQ 协议包。当客户端发送 PINGREQ 协议包后, Broker 必须返回一个 PINGRESP 协议包, 如果客户端在一个可靠的时间内, 没有收到服务器的 PINGRESP 协议包, 则说明当前存在半连接、 或者 Broker 已经下线、 或者出现了网络故障, 这个时候, 客户端应当关闭当前连接。

  • Broker 流程
    在连接建立后, Broker 如果没有在 Keep Alive 的 1.5 倍时间内, 收到来自客户端的任何包, 则会认为和客户端之间的连接出现了问题, 此时 Broker 便会断开和客户端的连接。如果 Broker 收到了来自客户端的 PINGREQ 协议包, 需要回复一个 PINGRESP 协议包进行确认。

  • 客户端接管机制
    当 Broker 里存在半连接时, 如果对应的客户端发起了重连或新的连接, 则 Broker 会启动客户端接管机制: 关闭旧的半连接, 然后与客户端建立新的连接。这种机制保证了客户端不会因为 Broker 里存在的半连接, 导致无法进行重连。

Keep Alive 与遗嘱消息
Keep Alive 通常还可以与遗嘱消息结合使用, 通过遗嘱消息, 设备可将自己的意外掉线情况及时通知第三方。
例如,客户端连接时设置了 Keep Alive 为 5 秒, 并且设置了遗嘱消息。 那么当服务器 7.5 秒(1.5 倍Keep Alive) 内未收到该客户端的任何报文时, 即会向 last_will 主题发送 Payload 为 offline 的遗嘱消息。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ppt技巧】PPT转换为图片,方法有哪些?

想要将ppt文件转换为图片,其实很简单,一起来看一下如何操作吧! 方法一: 使用格式转换器,有些文件格式转换器,支持ppt转换为图片。 方法二: 不需要转换器,直接在ppt中进行操作即可…

Java基础知识总结(9)

快速排序 3 1 2 5 4 6 重复第一轮的过程,应该得到如下序列: 2 1 3 5 4 6 OK,现在3已经归位。接下来需要处理3左边的序列: 2 1 3 6 处理之后,2已经归位,序列“1”只有一个数,也不需要进行任何…

可观测性体系建设后,该如何挖掘数据及工具价值?

在现代企业的运维管理中,构建高效且可靠的可观测性体系是保障系统稳定性和业务连续性的关键。然而,运维团队成员的技术能力参差不齐往往成为实现这一目标的障碍。尤其在处理复杂系统故障时,高度依赖专业知识和经验的可观测性工具很难被全员有…

j-vxe-table设置

1.设置按键回车箭头tab健设置 :mouse-config"{selected: true}" :keyboard-config"{ isArrow: true, isEnter: true, isEdit: true,isTab:true}" 2 表格编辑设置 :edit-config"{trigger: this.triggerFlag, mode: row, showIcon: false , active…

Java 基础 反射

什么是反射? 反射是各类框架的灵魂,允许我们在JVM运行时提供分析类,操作类的能力。 反射是一种在运行时检查和修改类、方法、属性等程序结构的能力。通过反射,可以动态地获取和操作程序的元数据,包括类的字段、方法、…

如何用 C++ 部署深度学习模型?

深度学习模型通常在诸如Python这样的高级语言中训练和验证,但在实际生产环境部署时,往往需要更高的执行效率和更低的资源占用。C作为一款性能卓越、低级别的编程语言,是部署深度学习模型的理想选择之一。本文将详细介绍如何在C环境下加载和运…

opengl日记11-opengl的transformtions变换示例

文章目录 环境代码CMakeLists.txt文件内容不变。vertexShaderSource.vsmain.cpp 总结参考 环境 系统&#xff1a;ubuntu20.04opengl版本&#xff1a;4.6glfw版本&#xff1a;3.3glad版本&#xff1a;4.6cmake版本&#xff1a;3.16.3gcc版本&#xff1a;10.3.0 在<opengl学…

电子资金转账系统的分类、应用及其对银行业的影响

科技的飞速发展&#xff0c;计算机网络技术已广泛应用于各个领域&#xff0c;其中之一就是电子资金转账&#xff08;Electronic Funds Transfer&#xff0c;简称EFT&#xff09;系统。EFT系统作为金融业务电子化的重要实现手段&#xff0c;正逐步改变着传统银行业务的运作方式&…

Blender 3D建模要点

3d模型可以为场景的仿真模拟带来真实感&#xff0c;它还有助于更轻松地识别场景中的所有内容。 例如&#xff0c;如果场景中的所有对象都是简单的形状&#xff0c;如立方体和圆形&#xff0c;则很难在仿真中区分对象。 1、碰撞形状与视觉形状 像立方体和球体这样的简单形状&a…

开发指南015-前端缓存的信息

平台前端架构启动后&#xff0c;在store里存储了很多信息&#xff0c;可以通过getter取到&#xff1a; 1)访问token import { getToken } from /utils/qlm_auth getToken()可以获取该值 为空则没有登录 2) 用户信息 this.$store.getters.userId // 用户ID this.$sto…

大厂面试-- [VueReact] 对虚拟DOM的理解?虚拟DOM主要做了什么?虚拟DOM本身是什么?

什么是虚拟DOM ​ 从本质上讲&#xff0c;Virtual Dom是一个Javascript对象&#xff0c;通过对象的方式来表示DOM结构。将页面的状态抽象为JS对象的形式&#xff0c;配合不同的渲染工具&#xff0c;将使跨平台渲染成为可能。通过事物处理机制&#xff0c;将多次DOM修改的结果一…

鸿蒙Harmony应用开发—ArkTS-属性动画

组件的某些通用属性变化时&#xff0c;可以通过属性动画实现渐变过渡效果&#xff0c;提升用户体验。支持的属性包括width、height、backgroundColor、opacity、scale、rotate、translate等。布局类改变宽高的动画&#xff0c;内容都是直接到终点状态&#xff0c;例如文字、can…

Linux 标准IO介绍

一、Linux文件的种类 常规文件r目录文件d字符设备文件c块设备文件b管道文件p套接字文件s符号链接文件(相当于Windows快捷方式&#xff09;l 二、标准I/O 1、概念 I&#xff1a;input 输入设备 比如键盘鼠标都是Input设备 O&#xff1a;output 输出设备 比如显示器 优…

英国政府发布云SCADA(数据采集与监控系统)安全指南

近期&#xff0c;英国国家网络安全中心 (NCSC) 发布了安全指南&#xff0c;用以帮助使用运营技术 (OT) 的组织确定是否应将其监控和数据采集 (SCADA) 系统迁移到云端。 出于安全原因&#xff0c;SCADA 系统传统上与互联网甚至本地企业网络隔离&#xff0c;但云可以提供许多好处…

在家有电脑手机怎么赚钱?整理了六种在家做副业的方法

如果你在家空闲时间比较多&#xff0c;有电脑有手机&#xff0c;一定要做的六种副业&#xff01; 无论你现在是什么身份&#xff0c;如果能够利用自己的空余时间&#xff0c;去做一份副业&#xff0c;那么你的自信心会得到大大地提升&#xff01; 分享六种我觉得很值得尝试的副…

JDBC基础(CRUD)使用详解(mysql)

1. 什么是JDBC JDBC,即Java Database Connectivity,java数据库连接.是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范.这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访…

Docker安装部署RabbitMQ(单机版)

文章目录 1.1.下载镜像1.2.安装MQ 本篇文章探讨的是单机部署 环境:Centos7 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3.8-management方式二&#xff1a;从本地加载 【1】将该镜像包上传到虚拟机的tmp目录 【2】上传到虚拟机中后&#xff0c;切换到存…

词令直达微信二维码如何生成关键词口令?

什么是词令直达微信二维码&#xff1f; 词令直达微信二维码是指商家生成指定的词令关键词口令后&#xff0c;可将商家的个人微信、企业微信、微信群、微信公众号、微信小程序等二维码关联到已生成的词令。用户使用词令微信小程序关键词口令直达工具&#xff0c;输入商家的词令…

MySQL表的增删改查---多表查询和联合查询

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

Python 数据分析模块pandas 如何创建DataFrame

以下用两种方式分别创建DataFrame。 import pandas as pd#原始数据存储在列表中 names [Alice,Deric,Amanda,Petter] ages [34,24,33,35] incomes [50000,65000,46000,69000]# 使用字典创建 DataFrame data {names:names,ages:ages,incomes:incomes} df1 pd.DataFrame(da…