MQTT 根据 QoS 定义的等级来传输消息。等级描述如下:

level 0:最多一次的传输

消息是基于 TCP/IP 网络传输的。没有回应,在协议中也没有定义重传的语义。消息可能到达服务器 1 次,也可能根本不会到达。

level 1:至少一次的传输

服务器接收到消息会被确认,通过传输一个 PUBACK 信息。如果有一个可以辨认的传输失败,无论是通讯连接还是发送设备,还是过了一段时间确认信息没有收到,发送方都会将消息头的 DUP 位置 1,然后再次发送消息。消息最少一次到达服务器。SUBSCRIBE 和 UNSUBSCRIBE 都使用 level 1 的 QoS。

如果客户端没有接收到 PUBACK 信息(无论是应用定义的超时,还是检测到失败然后通讯 session 重启),客户端都会再次发送 PUBLISH 信息,并且将 DUP 位置 1。

当它从客户端接收到重复的数据,服务器重新发送消息给订阅者,并且发送另一个 PUBACK 消息。

level 2: 只有一次的传输

在 QoS level 1 上附加的协议流保证了重复的消息不会传送到接收的应用。这是最高级别的传输,当重复的消息不被允许的情况下使用。这样增加了网络流量,但是它通常是可以接受的,因为消息内容很重要。

QoS level 2 在消息头有 Message ID。


↙↙↙阅读原文可查看相关链接,并与作者交流