MQTT QoS 详解
本文主要介绍 MQTT 协议中 QoS(服务质量) 的详细内容。 1、概述 MQTT 协议 中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下消息传递的可靠性,QoS 的设计是 MQTT 协议里的重点。作为专为物联网场景设计的协议,MQTT 的运行场景不仅仅是 …
本文主要介绍 MQTT 协议中 QoS(服务质量) 的详细内容。
1、概述
MQTT 协议中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下消息传递的可靠性,QoS 的设计是 MQTT 协议里的重点。作为专为物联网场景设计的协议,MQTT 的运行场景不仅仅是 PC,而是更广泛的窄带宽网络和低功耗设备,如果能在协议层解决传输质量的问题,将为物联网应用的开发提供极大便利。
2、MQTT QoS 等级
MQTT 设计了 3 个 QoS 等级。
- QoS 0:消息最多传递一次,如果当时客户端不可用,则会丢失该消息。
- QoS 1:消息传递至少 1 次。
- QoS 2:消息仅传送一次。
QoS 0 是一种 “fire and forget” 的消息发送模式:Sender (可能是 Publisher 或者 Broker) 发送一条消息之后,就不再关心它有没有发送到对方,也不设置任何重发机制。
QoS 1 包含了简单的重发机制,Sender 发送消息之后等待接收者的 ACK,如果没收到 ACK 则重新发送消息。这种模式能保证消息至少能到达一次,但无法保证消息重复。
QoS 2 设计了重发和重复消息发现机制,保证消息到达对方并且严格只到达一次。
3、QoS 工作原理
QoS 0 – 最多分发一次
当 QoS 为 0 时,消息的分发依赖于底层网络的能力。发布者只会发布一次消息,接收者不会应答消息,发布者也不会储存和重发消息。消息在这个等级下具有最高的传输效率,但可能送达一次也可能根本没送达。
Qos 1 – 至少分发一次
当 QoS 为 1 时,可以保证消息至少送达一次。MQTT 通过简单的 ACK 机制来保证 QoS 1。发布者会发布消息,并等待接收者的 PUBACK 报文的应答,如果在规定的时间内没有收到 PUBACK 的应答,发布者会将消息的 DUP 置为 1 并重发消息。接收者接收到 QoS 为 1 的消息时应该回应 PUBACK 报文,接收者可能会多次接受同一个消息,无论 DUP 标志如何,接收者都会将收到的消息当作一个新的消息并发送 PUBACK 报文应答。
QoS 2 – 只分发一次
当 QoS 为 2 时,发布者和订阅者通过两次会话来保证消息只被传递一次,这是最高等级的服务质量,消息丢失和重复都是不可接受的。使用这个服务质量等级会有额外的开销。
发布者发布 QoS 为 2 的消息之后,会将发布的消息储存起来并等待接收者回复 PUBREC 的消息,发送者收到 PUBREC 消息后,它就可以安全丢弃掉之前的发布消息,因为它已经知道接收者成功收到了消息。发布者会保存 PUBREC 消息并应答一个 PUBREL,等待接收者回复 PUBCOMP 消息,当发送者收到 PUBCOMP 消息之后会清空之前所保存的状态。
当接收者接收到一条 QoS 为 2 的 PUBLISH 消息时,他会处理此消息并返回一条 PUBREC 进行应答。当接收者收到 PUBREL 消息之后,它会丢弃掉所有已保存的状态,并回复 PUBCOMP。
无论在传输过程中何时出现丢包,发送端都负责重发上一条消息。不管发送端是 Publisher 还是 Broker,都是如此。因此,接收端也需要对每一条命令消息都进行应答。
4、QoS 在发布与订阅中的区别
MQTT 发布与订阅操作中的 QoS 代表了不同的含义,发布时的 QoS 表示消息发送到服务端时使用的 QoS,订阅时的 QoS 表示服务端向自己转发消息时可以使用的最大 QoS。
- 当客户端 A 的发布 QoS 大于客户端 B 的订阅 QoS 时,服务端向客户端 B 转发消息时使用的 QoS 为客户端 B 的订阅 QoS。
- 当客户端 A 的发布 QoS 小于客户端 B 的订阅 QoS 时,服务端向客户端 B 转发消息时使用的 QoS 为客户端 A 的发布 QoS。
不同情况下客户端收到的消息 QoS 可参考下表:
发布消息的 QoS | 主题订阅的 QoS | 接收消息的 QoS |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
0 | 2 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
1 | 2 | 1 |
2 | 0 | 0 |
2 | 1 | 1 |
2 | 2 | 2 |
5、如何选择 MQTT QoS 等级
QoS 级别越高,流程越复杂,系统资源消耗越大。应用程序可以根据自己的网络场景和业务需求,选择合适的 QoS 级别。
以下情况下可以选择 QoS 0
- 可以接受消息偶尔丢失。
- 在同一个子网内部的服务间的消息交互,或其他客户端与服务端网络非常稳定的场景。
以下情况下可以选择 QoS 1
- 对系统资源消耗较为关注,希望性能最优化。
- 消息不能丢失,但能接受并处理重复的消息。
以下情况下可以选择 QoS 2
- 不能忍受消息丢失(消息的丢失会造成生命或财产的损失),且不希望收到重复的消息。
- 数据完整性与及时性要求较高的银行、消防、航空等行业。
MQTT QoS 详解相关推荐
- IoT:MQTT协议详解
IoT -- (七)MQTT协议详解 转自:https://blog.csdn.net/anxianfeng55555/article/details/80908795 MQTT是什么? MQTT(M ...
- MQTT协议详解 三、MQTT控制包(CONNECT)
文章目录 系列文章目录 前言 CONNECT(客户端请求连接服务端) 一.固定包头(2字节) 二.可变包头(10字节) 协议名字(6字节) 协议等级(1字节) 连接标识(1字节) Clean Sess ...
- MQTT协议详解 二、MQTT控制包格式
文章目录 系列文章目录 前言 一.MQTT控制包格式 二.固定包头 控制包类型 控制包类型标识 剩余长度 三.可变包头 数据包标识 四.载荷 系列文章目录 MQTT协议详解 一.MQTT简介 MQTT ...
- MQTT协议详解,非常易懂
MQTT协议详解一 协议地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html 当然也有PDF版的,百度 ...
- MQTT协议详解 一、MQTT简介
文章目录 系列文章目录 前言 一.简述 二.主要特性 三.应用领域 四.常见术语 总结 系列文章目录 MQTT协议详解 一.MQTT简介 MQTT协议详解 二.MQTT控制包格式 MQTT协议详解 三 ...
- MQTT协议详解及v5.0实践——实践类
本文主要包含了以下内容: 1)MQTT协议演进历史及协议特点,总结和分析MQTT协议族的优缺点,分析和总结了为什么相比于其他协议,MQTT适合IoT,业内支持现状等. 2)阿里云IoT MQTT3和5 ...
- MQTT协议详解及开发教程(四)MQTT协议报文格式
推荐一款稳定的基于C编写的MQTT Client开源库 cMQTT MQTT协议详解及开发教程(一)MQTT协议概述 MQTT协议详解及开发教程(二)MQTT服务器EMQx搭建 MQTT协议详解及开发 ...
- http发送16进制报文_阿里云物联网平台使用心得(25)MQTT协议详解UNSUBSCRIBE报文...
题目 大家好,超子又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖.超子今天给大家介绍一下UNSUBSCRIBE报文. UNSUBSCRIBE报文 从上图中可知,UNSUBSCRI ...
- mqtt协议详解_IoT物联网设备上云技术方案详解
随着传感器和通信技术的不断发展,物联网行业方兴未艾,业务链路涉及数据采集,通信连接,数据存储,数据可视化,洞察,行动决策.但,在实施过程中,碎片化的设备端通信连接难题往往就阻碍了项目落地进程. 今天, ...
最新文章
- 【组队学习】【25期】Datawhale组队学习内容介绍
- 图灵71年前提出神经网络!《智能机器》再掀热议,却一生未发表
- 数据结构与算法-二叉查找树(java描述)
- Go的io/ioutil
- 教程:正确的SLF4J日志记录用法以及如何检查它
- EndNote使用技巧之一--参考文献的导入
- 素质教育新模式:后疫情时代教育 OMO 模式如何切实落地?
- 重新解释i++和++i
- zip、rar文件格式
- Linux中如何通过命令行访问Dropbox
- mysql 日期分隔符_sql中的日期处理
- 我的世界java版_我的世界Java版1.15版本
- C# WinForm技巧“将Form嵌入到Panel”
- vlan间路由详细实验步骤
- iOS开发中向iPhone模拟器中添加视频资源
- 九阳神功足疗是什么?分析美团按摩项目,泡脚足浴排第一
- 带K线的macd选股指标详解 优化MACD王牌指标 通达信macd选股指标源码
- php无限评论回复_php实现无限级评论功能
- Java制作的类祖码游戏-数字祖码
- Matlab——彩色图像的拼接与裁剪
热门文章
- 系统时间与 RTC 时间设置方法
- 2020最新Java面试题总结
- 安卓DownloadManager下载视频并用VideoView播放
- 全国计算机等级考msoffice选择题,全国计算机等级考试msoffice选择题必考
- 神经网络算法是黑盒_在黑盒内窥视如何欺骗神经网络
- 商业在用《蝙蝠对冲套利EA系统》及源码均出售--外汇多货币对冲ea策略对冲策略对冲套利对冲源码稳定盈利ea源码MQL源码
- [转]李维《Delphi 2006 高效数据程序设计——dbExpress 篇》连载
- TensorFlow2-高阶操作(八):gather/gather_nd(已知元素的位置,从张量中提取该元素)、scatter_nd/scatter_nd_update(已知赋值位置,向0张量中赋值)
- Spring 定时任务@Scheduled用法
- android glide 动画,Glide添加加载动画