MQTT协议定义了三种质量服务等级(Quality of Service, QoS),分别为QoS 0、QoS 1和QoS 2。这些服务等级控制着消息的传输可靠性,确保消息在网络中的传输质量和可靠性。理解这些服务等级及其特点是掌握MQTT协议的关键之一。
1 QoS 0 - 最低服务等级
1.1 定义和特点
QoS 0,也称为“至多一次”(At most once),是MQTT协议中的最低服务等级。这意味着消息发送方尽可能地将消息发送到接收方,但不保证消息的可靠到达。
- 消息传递:消息发送后,不进行任何确认,也不进行重发。
- 使用场景:适用于对消息传递不要求确认的场景,如心跳消息、状态更新等。
1.2 消息处理
- 固定头:消息头部的“QoS”位设置为0。
- 传输过程:发送后不进行确认,也不存储消息。
1.3 示例
消息类型:3(PUBLISH)
QoS等级:0
消息ID:无
消息格式示例:
+-------------------------------+
| 消息类型(1字节) |
+-------------------------------+
| 保留标志(1字节) |
+-------------------------------+
| QoS等级(2字节) |
+-------------------------------+
| 保留标志(1字节) |
+-------------------------------+
| 消息剩余长度(2字节) |
+-------------------------------+
| 主题名称长度(2字节) |
+-------------------------------+
| 主题名称(字符串) |
+-------------------------------+
| 消息内容(字符串或二进制) |
+-------------------------------+
2 QoS 1 - 至少一次
2.1 定义和特点
QoS 1,称为“至少一次”(At least once),保证消息至少被传送一次到接收方,但可能会重复传输。发送方在发送消息后等待接收方的确认,确认消息是否已被成功接收。
- 消息传递:发送方发送消息后,等待PUBACK确认。
- 重发机制:如果未收到确认,消息会被重新发送,直到确认。
2.2 消息处理
- 固定头:消息头部的“QoS”位设置为1。
- 传输过程:发送后等待PUBACK确认,未收到确认则重传。
2.3 示例
消息类型:3(PUBLISH)
QoS等级:1
消息ID:1
消息格式示例:
+-------------------------------+
| 消息类型(1字节) |
+-------------------------------+
| 保留标志(1字节) |
+-------------------------------+
| QoS等级(2字节) |
+-------------------------------+
| 保留标志(1字节) |
+-------------------------------+
| 消息剩余长度(2字节) |
+-------------------------------+
| 主题名称长度(2字节) |
+-------------------------------+
| 主题名称(字符串) |
+-------------------------------+
| 消息ID(2字节) |
+-------------------------------+
| 消息内容(字符串或二进制) |
+-------------------------------+
3 QoS 2 - 仅一次
3.1 定义和特点
QoS 2,称为“仅一次”(Exactly once),保证消息仅传输一次到接收方,避免重复发送。此服务等级通过四步握手机制(PUBREL-PUBREC-PUBCOMP)确保消息的唯一性。
- 消息传递:发送方发送消息后,等待PUBREC确认,随后发送PUBREL和PUBCOMP。
- 重发机制:确保消息仅传递一次。
3.2 消息处理
- 固定头:消息头部的“QoS”位设置为2。
- 传输过程:进行四步握手,确保消息仅传递一次。
3.3 示例
消息类型:3(PUBLISH)
QoS等级:2
消息ID:1
消息格式示例:
+-------------------------------+
| 消息类型(1字节) |
+-------------------------------+
| 保留标志(1字节) |
+-------------------------------+
| QoS等级(2字节) |
+-------------------------------+
| 保留标志(1字节) |
+-------------------------------+
| 消息剩余长度(2字节) |
+-------------------------------+
| 主题名称长度(2字节) |
+-------------------------------+
| 主题名称(字符串) |
+-------------------------------+
| 消息ID(2字节) |
+-------------------------------+
| 消息内容(字符串或二进制) |
+-------------------------------+
4 服务等级选择的考虑因素
4.1 消息重要性
- QoS 0:适用于不需要确认的消息,如状态更新、心跳包。
- QoS 1:适用于需要确认的消息,确保至少传输一次,如命令控制。
- QoS 2:适用于对消息传递唯一性要求极高的场景,如支付确认。
4.2 网络条件
- QoS 0:网络条件较差的环境,消息传递的可靠性要求不高。
- QoS 1和2:适用于网络稳定性较好、消息传输需要高可靠性的环境。
4.3 应用场景
- QoS 0:适用于传输速度快且对可靠性要求不高的场合,如设备状态更新。
- QoS 1:适用于需要消息确认的场合,如设备控制指令、命令执行确认。
- QoS 2:适用于对消息不重复传输有严格要求的场合,如支付系统、重要数据传输。
5 服务等级选择实例
1 状态更新
-
应用场景:传感器数据更新
-
建议QoS等级:QoS 0(至多一次)
-
示例:
消息类型:3(PUBLISH) QoS等级:0 消息内容:温度数据
2 命令执行确认
-
应用场景:远程设备控制
-
建议QoS等级:QoS 1(至少一次)
-
示例:
消息类型:3(PUBLISH) QoS等级:1 消息ID:123 消息内容:开关命令
3 数据传输保证
-
应用场景:支付确认
-
建议QoS等级:QoS 2(仅一次)
-
示例:
消息类型:3(PUBLISH) QoS等级:2 消息ID:456 消息内容:支付确认
6 QoS消息的四步握手机制
6.1 步骤概述
- 步骤1:PUBREL(发布释放)
- 发送方发送PUBREL消息,告诉代理可以释放消息。
- 步骤2:PUBREC(发布接收)
- 接收方发送PUBREC消息,确认已收到消息。
- 步骤3:PUBCOMP(发布完成)
- 接收方发送PUBCOMP消息,确认消息传输完成。
- 步骤4:确认消息
- 发送方接收PUBCOMP,确认消息完全传送。
6.2 四步握手过程
-
步骤1:发送PUBREL消息
消息类型:6 QoS等级:2 消息ID:1
-
步骤2:接收PUBREC消息
消息类型:5 QoS等级:2 消息ID:1
-
步骤3:发送PUBCOMP消息
消息类型:7 QoS等级:2 消息ID:1
-
步骤4:接收PUBCOMP消息
消息类型:7 QoS等级:2 消息ID:1
在本章中,我们深入探讨了MQTT协议的质量服务等级(QoS),从QoS 0到QoS 2的特点、使用场景及实现机制。