大纲:
|心跳包是什么
|mqtt的心跳包通信格式
|mqtt的心跳包机制
#心跳包是什么[1]?
心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。说明;broker是代理的意思,在这里指的是服务端的意思。
心跳机制可以确认连接仍然是打开的,并且broker和客户端都连接上了对方。因此客户端可以设定一个几秒钟的时间间隔,并在连建立后按此间隔来发送消息给broker。心跳的间隔时间(周期)是broker和客户端所能接受的最长的通信周期。
MQTT的说明书描述如下:
客户端有职责来确保发送的数据包间隔不超过心跳周期。如果没有数据包待发,那么客户端必须发送一个PINGREQ包。
这意味着只要消息被频繁地交换,而且心跳时长也没有超出阈值,那么就没有必要再发送额外的消息来确认连接是否开着了。
但是如果客户端在心跳周期内没有任何消息可以发送,那么它必须发送一个PINGREQ包给broker来确认它本身和broker仍然可用。
如果客户端没有在1.5倍心跳周期内发送PINGREQ或者其他数据,那么broker必须与客户端断开连接。同样的,如果broker没有在规定的时间内响应,客户端也应该主动断开连接。
#mqtt的心跳包机制
实现流程图:
图 mqtt心跳包机制
说明:
该机制采用了一个健康值的概念,当客户端在心跳周期内没有收到服务端的回应,那么它将心跳包的健康值减1,反之,加1。同时,必须客户端发送一个PINGREQ包给服务端来确认它本身和broker仍然可用。如果健康值等于0,证明客户端与服务端之间的通信链路已经断开了,需要关闭当前连接,重新建立连接。
如果客户端在一个心跳包周期内无论收没收到回应,都将心跳包周期减半,加快检测通信链路通断的速度。只要在每秒钟检测过程中收到服务端的心跳包回应了,就将心跳包周期复原初始值。
参考:
[1]qinwenbo.MQTT Part 10 心跳和客户端替换[EB/OL].https://www.jianshu.com/p/0d8c63b1bcab