MQTT 协议 中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下消息传递的可靠性,QoS 的设计是 MQTT 协议里的重点。作为专为物联网场景设计的协议,MQTT 的运行场景不仅仅是 PC,而是更广泛的窄带宽网络和低功耗设备,如果能在协议层解决传输质量的问题,将为物联网应用的开发提供极大便利。

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 设计了重发和重复消息发现机制,保证消息到达对方并且严格只到达一次。

工作原理

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,都是如此。因此,接收端也需要对每一条命令消息都进行应答。

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

如何选择 MQTT QoS 等级

QoS 级别越高,流程越复杂,系统资源消耗越大。应用程序可以根据自己的网络场景和业务需求,选择合适的 QoS 级别。

以下情况下可以选择 QoS 0

  • 可以接受消息偶尔丢失。
  • 在同一个子网内部的服务间的消息交互,或其他客户端与服务端网络非常稳定的场景。

以下情况下可以选择 QoS 1

  • 对系统资源消耗较为关注,希望性能最优化。
  • 消息不能丢失,但能接受并处理重复的消息。

以下情况下可以选择 QoS 2

  • 不能忍受消息丢失(消息的丢失会造成生命或财产的损失),且不希望收到重复的消息。
  • 数据完整性与及时性要求较高的银行、消防、航空等行业。

参考:
emq官网

消息传输协议-MQTT篇-QoS相关推荐

  1. 【新手上路常见问答】关于物联网传输协议MQTT

    1.物联网数据传输的要求是什么? 物联网中的数据传输会面临很多挑战.采集发送数据的终端能耗应该较小,在低带宽和不稳定的网络情况下,需要保证数据的传输是成功的,保证数据不被重复发送,连接断开后可以进行重 ...

  2. librtmp实时消息传输协议(RTMP)库代码浅析

    没事碰到了librtmp库,这个库是ffmpeg的依赖库,用来接收,发布RTMP协议格式的数据. 代码在这里:git clone git://git.ffmpeg.org/rtmpdump 先看一段通 ...

  3. 超文本传输协议 - 白话篇

    再给大家介绍另一个小编,他也是一名在校学生,为什么会有写网络相关的想法呢?因为这几天在给图书馆的服务器装环境,在配置网络上面一直停滞不前,决定重新学习一遍计算机网络,他会将每天学到的知识通过大白话的方 ...

  4. MQTT-轻量级的物联网消息传输协议

    1.MQTT协议简介 随着 5G 时代的来临,万物互联的伟大构想正在成为现实.联网的 物联网设备 在 2018 年已经达到了 70 亿,在未来两年,仅智能水电气表就将超过10亿. 海量的设备接入和设备 ...

  5. 初接触RTMP流媒体实时消息传输协议

    由于公司目前的一个项目涉及到直播那一方面,在这之前我完全没有接触过这么高大上的东西,但是交给我了我就想办法完成.临近周末的星期五,折磨了一天,环境搭建了一天,终于把rtmp的推流服务器给搭建好了,IO ...

  6. 消息队列(2):常见的消息队列协议

    协议很常见,只要是通信,就会用到协议,就像我们说话的语言一样,不同的语言连通着不同的人群. 所以说,消息队列也是一样,想要互相通信,就要使用同一种协议. 每个协议下的消息队列,都有着不同的角色定义. ...

  7. 【AIOT】3.5 物联网传输协议介绍

    1. 介绍 常见的物联网传输协议 MQTT详细介绍 2. HTTP协议 HTTP协议是Hyper Text Transfer Protocol的缩写 处于OSI模型的应用程序层 通常的场景下,网络防火 ...

  8. 视频直播技术分享:一文读懂主流视频直播系统的推拉流架构、传输协议等

    本文由蘑菇街前端开发工程师"三体"分享,原题"蘑菇街云端直播探索--启航篇",有修订. 1.引言 随着移动网络网速的提升与资费的降低,视频直播作为一个新的娱乐方 ...

  9. SRT、RTMP、NDI视频传输协议对比

    一.SRT和NDI两种低延时传输协议的比较 关于SRT: SRT是由Haivision和Wowza共同创建的互联网传输协议,是时下非常受欢迎的开源低延迟视频传输协议.使用SRT传输技术,能够成功实现普 ...

  10. 视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等

    1.引言 随着移动网络网速的提升与资费的降低,视频直播作为一个新的娱乐方式已经被越来越多的用户逐渐接受.特别是最近这几年,视频直播已经不仅仅被运用在传统的秀场.游戏类板块,更是作为电商的一种新模式得到 ...

最新文章

  1. 计算机导论简答芯片,吉大计算机 - 计算机导论简答题 (2011级)
  2. 又一篇硕士论文火了!高校硕士论文研究“董明珠自恋及其经济后果”
  3. Magicodes.WeiChat——媒体资源选择组件之media-choice(开源)
  4. EOS 智能合约源代码解读 (3)asset.hpp
  5. 使用Apache Common Daemon实现Windows服务
  6. 猎鹰spacex_SpaceX:简单,美观的界面是未来
  7. java调用指定浏览器打开指定网址
  8. 帆软报表插件开发之fine-decision中的GlobalRequestFilterProvider扩展
  9. 用httpPost对JSON发送和接收的例子
  10. Android Studio 第五十三期 - 自定义EditText密码键盘
  11. vpx计算机论文,高端计算机系统架构设计与VPX总线
  12. 找Devcon.exe的同学看过来
  13. 地质专业考遥感计算机研究生,遥感专业考研选择哪些学校
  14. zoj 2476 Total Amount
  15. 写给20几岁的女孩、男孩
  16. get请求获得传递参数
  17. 二本跨考985计算机考研,跨专业考研经验谈:从二本到985的飞跃
  18. 2014acm亚洲区域赛陕西赛总结
  19. 九章量电子计算机诞生于,计算机应用基础统考题
  20. 【转】我奋斗了18年不是为了和你一起喝咖啡

热门文章

  1. 功能测试数据测试之因果图分析方法
  2. 该如何去认知Level 2 十档行情数据?
  3. 摩尔投票(包含题目讲解)
  4. tablepc是什么平板电脑_Tablet PC,这是什么意思?
  5. OneNote的同步问题
  6. 自动化本科生考计算机研究生,请教关于自动化专业本科生报考研究生的问题?...
  7. 凑硬币算法C语言,《凑硬币》 动态规划算法入门
  8. 计算机与控制工程学院用英语怎么说,计算机与控制工程学院副院长童向荣老师2017年开学典礼致辞...
  9. 智芯传感压力传感器在咖啡机中的应用
  10. Spark视频王家林大神第1课: 30分钟彻底理解Spark核心API发展史:RDD、DataFrame、DataSet