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

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

MQTT QoS(服务质量)介绍相关推荐

  1. QoS 服务质量介绍说明

    QoS 服务质量介绍说明 前言 QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力, 是网络的一种安全机制, 是用来解决网络延迟 ...

  2. MQTT QoS服务质量

    MQTT(Quality of Service)设计了三个等级: QoS 0:消息最多传递一次,如果当时客户端不可用,则会丢失该消息. QoS 1:消息传递至少 1 次. QoS 2:保证消息到达对方 ...

  3. MQTT QoS 设计:车联网平台消息传输质量保障

    在本专题系列文章中,我们将根据 EMQ 在车联网领域的实践经验,从协议选择等理论知识,到平台架构设计等实战操作,与大家分享如何搭建一个可靠.高效.符合行业场景需求的车联网平台. 在此之前,我们已经介绍 ...

  4. MQTT QoS 详解

    本文主要介绍 MQTT 协议中 QoS(服务质量) 的详细内容. 1.概述 MQTT 协议 中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下消息传递的可靠性,Q ...

  5. MQTT Qos类型解释

    MQTT Qos类型解释 原文连接: https://blog.csdn.net/yangguosb/article/details/78653228 内容: Qos0 发送者只发送一次消息,不进行重 ...

  6. Kubernetes Resource QoS Classes介绍

    2019独角兽企业重金招聘Python工程师标准>>> Kubernetes Resource QoS Classes介绍 @(Kubernetes) 基本概念 Kubernetes ...

  7. QoS服务质量二令牌桶算法及QoS业务分类

    QoS服务质量二令牌桶算法及QoS业务分类 2.3.3.DiffServ模型令牌桶算法 2.3.4.基于DiffServ模型的QoS组成 2.3.3.DiffServ模型令牌桶算法 令牌桶算法是网络流 ...

  8. QoS服务质量三DiffServ模型报文的标记及PHB

    QoS服务质量三DiffServ模型报文的标记及PHB 2.3.5.报文的标记方法 2.3.5.1.IP Prececence 2.3.5.2.DSCP 2.3.5.3.IPv6报文 2.3.5.4. ...

  9. QoS服务质量四QoS边界行为之流量监管

    QoS服务质量四QoS边界行为之流量监管 二.QoS域边界节点的功能和行为 1.流分类 1.1.简单流分类 1.2.复杂流分类 2.流量监管 2.1.标记 2.1.1.流量监管工具CAR 2.1.1. ...

  10. QoS服务质量五QoS边界行为之流量整形

    QoS服务质量五QoS边界行为之流量整形 3.流量整形 3.1.GTS的原理 3.2.自适应流量整形 3.3流量监管和流量整形应用场景 3.4.配置限速(流量监管和流量整形) 3.4.1.配置流量整形 ...

最新文章

  1. 安卓开源项目周报0411
  2. BMP文件的读取与显示
  3. BZOJ 3731: Gty的超级妹子树
  4. C++设计模式--适配器模式
  5. 第十八篇 Linux环境下常用软件安装和使用指南
  6. mysql中设置字符_MySQL中设置默认字符集的方法
  7. java在创建对象时必须_Java中5种创建对象的方式
  8. 国漫《大闹天宫》4K修复版上线西瓜视频、鲜时光
  9. 如果量子计算机成功应用,这世界上还有普通人的生存空间吗?
  10. jquery点击按钮显示和隐藏div
  11. 梦笔记2022-2-1
  12. nvm 下载node 下载不下来_音乐下载 黄子韬爸妈可以不走吗
  13. 数据挖掘FPGrowth算法JAVA实现
  14. LoRa网关与服务器通信——MQTT
  15. 【单例模式、多例模式、工厂模式和枚举】
  16. parallel循环java_使用Java8新特性parallelStream遇到的坑
  17. BUUCTF 荷兰宽带数据泄露
  18. mysql orm_从MySQL到ORM(二):MySQL基础
  19. 泛泰SKYA830黑砖QHSUSB_DLOAD救砖教程
  20. 基于JAVA竞赛信息发布及组队系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署

热门文章

  1. 什么是软件即服务(SaaS) ? SaaS新手入门指南
  2. python相减函数subs,SUBS(subs是什么函数)
  3. eWebEditor编辑器的使用
  4. 1015 计算摄氏温度值
  5. zjnu 1779 KRUŽNICE(线段树成段更新+离散化)
  6. 明珠三国java最新_新明珠三国下载-新明珠三国最新版下载v5.0-三国在线
  7. 哇!家居环境居然能“可视化”?这守护真的牛
  8. note同步不及时 one_解决无法同步 OneNote 的问题
  9. C++ OpenCV遍历并处理一个文件夹中的所有图片
  10. C/C++/Linux工程师学习资料干货路线这都有,从入门到实战!【CSDN宝藏资料图鉴第二期】