mqtt qos0 和 qos1 是什么 · 物联网平台-威尼斯人最新

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

在前面的课程中我们多次提到了 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 之间一次消息的传递流程如下:

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

6.3 qos1

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

  • 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
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
网站地图