MQTT MQTT QoS0 和 QoS1 是什么

niubi · 2020年05月25日 · 最后由 aazz 回复于 2022年08月19日 · 678 次阅读
本帖已被设为精华帖!

在前面的课程中我们多次提到了 QoS(Quality of Service)的概念,CONNECT、PUBLISH、SUBSCRIBE 中都有 QoS 的标识,那么 MQTT 提供的 QoS 是什么呢?本节课核心内容:

MQTT 中的 QoS 等级

QoS0

QoS1

6.1 MQTT 中的 QoS 等级

作为最初用来在网络带宽窄、信号不稳定的环境下传输数据的协议,MQTT 设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种不同层次 QoS:

  • QoS0,At most once,至多一次;
  • QoS1,At least once,至少一次;
  • QoS2,Exactly once,确保只有一次。

什么意思呢,QoS 是消息的发送方(Sender)和接受方(Receiver)之间达成的一个协议:

  • QoS0 代表,Sender 发送的一条消息,Receiver 最多能收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,也就算了;
  • QoS1 代表,Sender 发送的一条消息,Receiver 至少能收到一次,也就是说 Sender 向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,但是因为重传的原因,Receiver 有可能会收到重复的消息;
  • QoS2 代表,Sender 发送的一条消息,Receiver 确保能收到而且只收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,同时保证 Receiver 不会因为消息重传而收到重复的消息。

要注意的是,QoS 是 Sender 和 Receiver 之间达成的协议,不是 Publisher 和 Subscriber 之间达成的协议。也就是说 Publisher 发布一条 QoS1 的消息,只能保证 Broker 能至少收到一次这个消息;至于对应的 Subscriber 能否至少收到一次这个消息,还要取决于 Subscriber 在 Subscribe 的时候和 Broker 协商的 QoS 等级。

接下来我们来看一下 QoS0 和 QoS1 的机制,并讨论一下什么是 QoS 降级。

6.2 QoS0

QoS0 是最简单的一个 QoS 等级了,在这个 QoS 等级下,Sender 和 Receiver 之间一次消息的传递流程如下:

iotschool

Sender 向 Receiver 发送一个包含消息数据的 PUBLISH 包,然后不管结果如何,丢弃掉已发送的 PUBLISH 包,一条消息的发送完成。

6.3 QoS1

QoS 要保证消息至少到达 Sender 一次,所以有一个应答的机制,在 Qos1 等级下的 Sender 和 Receiver 的一次消息的传递流程如下。

iotschool

  • Sender 向 Receiver 发送一个带有消息数据的 PUBLISH 包, 并在本地保存这个 PUBLISH 包。
  • Receiver 收到 PUBLISH 包以后,向 Sender 发送一个 PUBACK 数据包,PUBACK 数据包没有消息体(Payload),在可变头中(Variable header)中有一个包标识(Packet Identifier),和它收到的 PUBLISH 包中的 Packet Identifier 一致。
  • Sender 收到 PUBACK 之后,根据 PUBACK 包中的 Packet Identifier 找到本地保存的 PUBLISH 包,然后丢弃掉,一次消息的发送完成。
  • 如果 Sender 在一段时间内没有收到 PUBLISH 包对应的 PUBACK,它将该 PUBLISH 包的 DUP 标识设为 1(代表是重新发送的 PUBLISH 包),然后重新发送该 PUBLISH 包。重复这个流程,直到收到 PUBACK,然后执行第 3 步。
ThingsKit 将本帖设为了精华贴 05月25日 23:16
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册