百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

MQTT协议Keep Alive详解

bigegpt 2025-04-27 12:36 12 浏览

为什么需要Keep Alive

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

MQTT Keep Alive的机制流程与使用

启用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

在 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 的遗嘱消息。

如何在EMQX中使用Keep Alive

在EMQX中,用户可以通过配置来自定义Keep Alive机制的行为,主要配置字段有:

zone.${zoneName}.server_Keep Aliveserver_Keep Alive类型默认值整型无

如果没有设置这个值,则EMQX会按照客户端创建连接时的 Keep Alive 的值,来控制Keep Alive的行为。

如果设置了这个值,则Broker会对该zone下面所有的连接,强制启用Keep Alive机制,并且会使用这个值,覆盖客户端连接请求中的值。

zone.${zoneName}.Keep Alive_backoffKeep Alive_backoff类型默认值浮点数0.75

MQTT协议中要求Broker在1.5倍 Keep Alive 时间内,如果没有收到客户端的任何协议包,则认定客户端断开了连接。

而在EMQX中,我们引入了退让系数(Keep Alive back off),并将这个系数通过配置暴露出来,方便用户更灵活的控制Broker端的Keep Alive行为。

在引入退让系数后,EMQX通过下面的公式来计算最大超时时间:

Keep Alive*backoff*2

Back off 默认值为0.75,因此在用户不修改该配置的情况下,EMQX的行为完全符合MQTT标准。

Web Socket连接时设置Keep Alive

EMQX支持客户端通过Web Socket接入,当客户端使用Web Socket发起连接时,只需要在连接参数中设置上Keep Alive的值即可。

结语

本文介绍了MQTT协议中Keep Alive的机制及EMQX中Keep Alive的使用,开发者可以借助这一特性确保 MQTT连接的稳定性,构建更加健壮的上层物联网应用。读者可根据本文所学尝试上手使用MQTT应用及服务开发,探索MQTT的更多高级应用。

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...