MQTT协议的初浅认识之通讯级别和持久会话

那年仲夏 提交于 2020-05-01 02:47:42

背景

这是我最近了解MQTT协议的最后一部分内容了,MQTT协议里面的QOS和Keep Alive是两个比较重要的内容。QOS的设置,直接影响了订阅客户端与中间件之间的消息交互行为。而Keep Alive直接影响了客户端与中间件连接状态。

QOS

MQTT中QOS的三个级别:

  • 0:最多一次传送 (只负责传送,发送过后就不管数据的传送情况)
  • 1:至少一次传送 (确认数据交付)
  • 2:正好一次传送 (保证数据交付成功)

QOS 0

QoS-0

这种情况下面,中间件接收发布者的推送消息后,不会给发布者响应任何消息,也就是说消息推送出去,就不管消息有没有订阅者被收到了。

QOS 1

QoS-1

puback_packet

QoS级别1保证消息至少一次传递给订阅者。 发送者存储消息,直到它从订阅者获得确认收到消息的PUBACK数据包。 可以多次发送或传递消息。也就是说每次推送一个消息,一定会收到一个订阅者确认收到的PUBACK消息,如果中间件没有收到PUBACK确认消息,中间件就会一直给订阅发消息,直到订阅者响应PUBACK确认消息。

QOS 2

QoS 2是MQTT中的最高级别。 此级别保证每个消息仅由预期订阅者接收一次。 QoS 2是最安全和最慢的QOS水平。 保证由发布者和订阅者之间的至少两个请求/响应流(四个握手)提供。 发布者和订阅者使用原始PUBLISH消息的包标识符来协调消息的传送。

QOS-2

当订阅者从发布者获得QoS 2 PUBLISH数据包时,它会相应地处理发布消息,并使用PUBREC数据包回复发布者。 如果发布者没有从订阅者获得PUBREC数据包,它会再次发布带有重复(DUP)标志的PUBLISH数据包,直到收到确认。

pubrec_packet

一旦发布者从订阅者接收到PUBREC数据包,发送方就可以安全地丢弃初始PUBLISH数据包。 发布者存储来自订阅者的PUBREC数据包,并以PUBREL数据包进行响应。

pubrel_packet

在订阅者获得PUBREL数据包之后,订阅者可以丢弃所有存储的状态,并用PUBCOMP数据包回答(当发布者收到PUBCOMP时也是如此)。 在订阅者完成处理并将PUBCOMP分组发布回发布者之前,订阅者存储对原始PUBLISH分组的分组标识符的引用。 此步骤对于避免第二次处理消息非常重要。 在发送者收到PUBCOMP数据包之后,已发布消息的数据包标识符可供重用。

pubcomp_packet

当QoS 2流程完成时,双方都确定消息已发送且发送者已确认交付。

如果数据包在途中丢失,则发送者有责任在合理的时间内重新传输消息。 如果发送者是MQTT客户机或MQTT中间件,则同样如此。 订阅者有责任相应地响应每条命令消息。

级别简单总结:

  • QOS0:发送消息不可靠。
  • QOS1:消息可靠,性能比QOS2好,但可能多次收到消息,我选这个。
  • QOS2:消息可靠,且只能收到一次消息,解决QOS1,但是,性能比QOS1差。

Keep Alive

这个参数很重要,这个影响到消息是否能够及时收到。当发送者与订阅者之间长时间没有收到消息,这个keep alive定义,订阅者与发布者之间可以忍受的时间。这个keep alive时间定义多长时间订阅客户端发PINGREQ消息给中间件的消息,中间件收到PINGREQ消息后,回应PINGRESP消息给订阅者客户端,一般60s。

pingreq

pingresp

总结

MQTT协议,我们就告一段落了,建议大家可以自己阅读HiveMQ的MQTT Essentials Part1-10,十篇文章很容易理解。

参考:

MQTT

MQTT Essentials Part 6: Quality of Service 0, 1 & 2

MQTT Essentials Part 10: Keep Alive and Client Take-Over

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!