MQTT 协定中的 Keep Alive 机制
为什么须要 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 内的半连贯问题,导致无奈进行重连。
如何在 EMQX 中应用 Keep Alive
在 EMQX 中,用户能够通过配置来自定义 Keep Alive 机制的行为,次要配置字段有:
zone.${zoneName}.server_keepalive
server_keepalive 类型 默认值 整型 无
如果没有设置这个值,则 EMQX 会依照客户端创立连贯时的 Keep Alive 的值,来管制 Keep Alive 的行为。
如果设置了这个值,则 Broker 会对该 zone 上面所有的连贯,强制启用 Keep Alive 机制,并且会应用这个值,笼罩客户端连贯申请中的值。
zone.${zoneName}.keepalive_backoff
keepalive_backoff 类型 默认值 浮点数 0.75
MQTT 协定中要求 Broker 在 1.5 倍 Keep Alive 工夫内,如果没有收到客户端的任何协定包,则认定客户端断开了连贯。
而在 EMQX 中,咱们引入了让步系数 (keepalive backoff),并将这个系数通过配置裸露进去,不便用户更灵便的管制 Broker 端的 Keep Alive 行为。
在引入让步系数后,EMQX 通过上面的公式来计算最大超时工夫:
Keepalive * backoff * 2
backoff 默认值为 0.75,因而在用户不批改该配置的状况下,EMQX 的行为完全符合 MQTT 规范。
更多相干内容请参见 EMQX 配置文档。
WebSocket 连贯时设置 Keep Alive
EMQX 反对客户端通过 WebSocket 接入,当客户端应用 WebSocket 发动连贯时,只须要在连贯参数中设置上 keepalive 的值即可,具体见应用 WebSocket 连贯 MQTT 服务器。
结语
本文介绍了 MQTT 协定中 Keep Alive 的机制及 EMQX 中 Keep Alive 的应用,开发者能够借助这一个性确保 MQTT 连贯的稳定性,构建更加强壮的下层物联网利用。
版权申明:本文为 EMQ 原创,转载请注明出处。
原文链接:https://www.emqx.com/zh/blog/mqtt-keep-alive