1 MQTT介绍
MQTT是一种基于客户端/服务器架构(CS架构)的发布/订阅模式的消息传输协议。它最初由IBM开发,并被设计成为轻量、开放、简单以及易于实现的消息传输协议。MQTT很适合应用于环境受限(窄带、高延迟、不可靠的网络环境)的机器与机器(M2M)、物联网(IoT)设备之间的消息通信。
2 MQTT的消息服务质量QoS
MQTT的消息服务质量(Quality of Service,QoS)是MQTT协议确保消息可靠投递的一种机制。MQTT的消息服务质量共有三种:
- QoS 0 —— At most once,最多一次
- QoS 1 —— At least once,至少一次
- QoS 2 —— Exactly once,刚好一次
2.1 QoS 0 —— 最多一次
消息发送者使用QoS 0
发送消息时,消息最多投递一次;即消息一旦发送出去,其可达性完全依靠TCP层的协议。所以使用QoS 0
发送消息时有可能会导致消息丢失。
图2.1 QoS 0消息发布示意图
如上图所示,MQTT消息发送者使用QoS 0
发送消息时,MQTT的消息接收者不会回复确认;消息的可达性完全建立在TCP协议上。
2.2 QoS 1 —— 至少一次
消息发送者使用QoS 1
发送消息时,可以确保消息至少到达消息接收者一次,有可能会大于一次。
因为当使用QoS 1
发送消息时,消息会在发送者和接收者之间进行确认(PUBLISH
和PUBACK
)。消息会先缓存在发送者本地;只有当消息发送者成功接收到消息接收者的回复之后,发送者才认为消息已经被成功投递,并删除该条消息的本地缓存。
图2.2 QoS 1消息发布和确认示意图
如上图所示,发送者发布消息(PUBLISH
),接收者收到消息后会回复确认(PUBACK
)。
- 在网络比较好时,发布的消息(
PUBLISH
)能够在第一次就到达接收者,并且接收者回复的确认(PUBACK
)也能在第一次回复就到达发送者端。这种情况下,该条发布的消息只会被接收者收到一次; - 在网络比较差时,发布的消息(
PUBLISH
)不能在第一次就到达接收者,或者接收者回复的确认(PUBACK
)不能再第一次回复就到达发送者端。发送者就会重发,重发的消息会设置DUP
标志位。这就会导致接收者可能会多次收到同一条消息
消息发送者与接收者通过每条消息的消息ID(Packet Identifier)来跟踪、确认每条消息。总之,发送者只有收到接收者的回复确认(PUBACK
)后才会认为消息已经成功投递,并终止重发。
2.3 QoS 2 —— 刚好一次
消息发送者使用QoS 2
发送消息时,可以确保消息仅仅到达消息接收者一次,不会多次到达也不会无法到达。QoS 2
也是类似于QoS 1
的消息发布,通过在发送者和接收者之间进行确认来确保消息的投递。不同的是,QoS 2
比QoS 1
采用更加复杂的确认机制来投递消息:
图2.3 QoS 2消息发布和确认示意图
消息接收者会一直保存消息的缓存,直到它向发送者回复了PUBCOMP
响应。
——————–【参考文章】——————–