MQTT Keep Alive机制

2024-03-21 20:20
文章标签 机制 mqtt keep alive

本文主要是介绍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 的遗嘱消息。

这篇关于MQTT Keep Alive机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/833813

相关文章

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

Spring中事务的传播机制

一、前言 首先事务传播机制解决了什么问题 Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。 事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY; 不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED,其中 REQUIRED 是默认的事务传播级别。

MQTT之CONNECT控制报文详解

目录 1.  MQTT协议规范 2.  名词解释 3.  CONNECT控制报文详解 3.1  固定报头 Fixed header 3.2  可变报头 Variable header 3.2.1  协议名 Protocol Name 3.2.2  协议级别 Protocol Level 3.2.3  连接标志 Connect Flags 3.2.4  保持连接 Keep

多头注意力机制(Multi-Head Attention)

文章目录 多头注意力机制的作用多头注意力机制的工作原理为什么使用多头注意力机制?代码示例 多头注意力机制(Multi-Head Attention)是Transformer架构中的一个核心组件。它在机器翻译、自然语言处理(NLP)等领域取得了显著的成功。多头注意力机制的引入是为了增强模型的能力,使其能够从不同的角度关注输入序列的不同部分,从而捕捉更多层次的信息。 多头注意力机

Linux-笔记 线程同步机制

目录 前言 实现 信号量(Semaphore) 计数型信号量 二值信号量  信号量的原语操作 无名信号量的操作函数 例子 互斥锁(mutex) 互斥锁的操作函数 例子 自旋锁 (Spinlock) 自旋锁与互斥锁的区别 自旋锁的操作函数 例子 前言         线程同步是为了对共享资源的访问进行保护,确保数据的一致性,由于进程中会有多个线程的存在,

Spring 集成 RabbitMQ 与其概念,消息持久化,ACK机制

目录 RabbitMQ 概念exchange交换机机制 什么是交换机binding?Direct Exchange交换机Topic Exchange交换机Fanout Exchange交换机Header Exchange交换机RabbitMQ 的 Hello - Demo(springboot实现)RabbitMQ 的 Hello Demo(spring xml实现)RabbitMQ 在生产环境

Rust:Future、async 异步代码机制示例与分析

0. 异步、并发、并行、进程、协程概念梳理 Rust 的异步机制不是多线程或多进程,而是基于协程(或称为轻量级线程、微线程)的模型,这些协程可以在单个线程内并发执行。这种模型允许在单个线程中通过非阻塞的方式处理多个任务,从而实现高效的并发。 关于“并发”和“并行”的区别,这是两个经常被提及但含义不同的概念: 并发(Concurrency):指的是同时处理多个任务的能力,这些任务可能在同一时

ROS话题通信机制实操C++

ROS话题通信机制实操C++ 创建ROS工程发布方(二狗子)订阅方(翠花)编辑配置文件编译并执行注意订阅的第一条数据丢失 ROS话题通信的理论查阅ROS话题通信流程理论 在ROS话题通信机制实现中,ROS master 不需要实现,且连接的建立也已经被封装了,需要关注的关键点有三个: 发布方(二狗子)订阅方(翠花)数据(此处为普通文本) 创建ROS工程 创建一个ROS工程

Java面试题:内存管理、类加载机制、对象生命周期及性能优化

1. 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件:Class loader(类装载)、Execution engine(执行引擎)、Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)装载class文件到Runtim

C++初学者指南第一步---14.函数调用机制

C++初学者指南第一步—14.函数调用机制 文章目录 C++初学者指南第一步---14.函数调用机制1.记住:内存的结构2.函数调用是如何工作的3. 不要引用局部变量4. 常见编译器优化5. Inlining内联 1.记住:内存的结构 堆(自由存储) 用于动态存储期对象,例如 std::vector 的内容。空间大,可以用于大容量存储(大多数用于主内存)。可以根据需要分配