Q0S服务质量等级

  • 一、什么是服务质量?
  • 二、MQTT协议有三种服务质量级别
    • QoS = 0 – 最多发一次
    • QoS = 1 – 最少发一次
    • QoS = 2 – 保证收一次
  • 三、设置QoS
    • 发布消息
    • 订阅消息
    • 接收端连接服务端
  • 四、服务质量降级
  • 五、通讯时的注意事项
    • QoS=1通讯时的注意事项
    • QoS=2通讯时的注意事项
  • 六、小结

一、什么是服务质量?

在物联网系统中,有些信息是非常重要的,我们需要确保这类重要信息可以准确无误的发送和接收。而有些信息则相对不那么重要,这类信息如果在传输中丢失不会影响系统的运行。

MQTT服务质量(Quality of Service 缩写 QoS)正是用于告知物联网系统,哪些信息是重要信息需要准确无误的传输,而哪些信息不那么重要,即使丢失也没有问题。

二、MQTT协议有三种服务质量级别

  • QoS = 0 – 最多发一次
  • QoS = 1 – 最少发一次
  • QoS = 2 – 保证收一次

以上三种不同的服务质量级别意味着不同的MQTT传输流程。对于较为重要的MQTT消息,我们通常会选择QoS>0的服务级别(即QoS 为1或2)。

另外这里提到的“发”与“收”有两种可能。一种是客户端发布消息时,将消息发送给服务端。一种是客户端订阅了某一主题消息后,服务端将消息发送给客户端。 因此发布消息和接收消息的可能是服务端也可能是客户端。

为了避免造成混淆,我们在本节后面的描述中将使用“发送端”来描述发送MQTT消息的设备,而使用“接收端”来描述接收MQTT消息的设备。
接下来我们仔细看一下这三种服务质量级别的具体含义。

QoS = 0 – 最多发一次

0是服务质量QoS的最低级别。当QoS为0级时,MQTT协议并不保证所有信息都能得以传输。也就是说,QoS=0的情况下,MQTT服务端和客户端不会对消息传输是否成功进行确认和检查。消息能否成功传输全看网络环境是否稳定。

也就是说,在QoS为0时。发送端一旦发送完消息后,就完成任务了。发送端不会检查发出的消息能否被正确接收到。

在网络环境稳定的情况下,信息传输一般是不会出现问题的。但是在环境不稳定的情况下,可能会在传输过程中出现MQTT消息丢失的情况。

QoS = 1 – 最少发一次

当QoS级别为1时,发送端在消息发送完成后,会检查接收端是否已经成功接收到了消息。但是发送端是如何实现这一检查的呢?请看下图:

发送端将消息发送给接收端后,会等待接收端的确认。接收端成功接收消息后,会发送一条确认报文PUBACK给发送端。如果发送端收到了这条PUBACK确认报文,那么它就知道消息已经成功接收。

假如过了一段时间后,发送端没有收到PUBACK报文,那么发送端会再次发送消息,然后再次等待接收端的PUBACK确认报文。因此,当QoS=1时,发送端在没有收到接收端的PUBACK确认报文以前,会重复发送同一条消息。

所以QoS = 1时,每一条消息都至少传输一次。

PUBLISH报文的内容。

当发送端重复发送一条消息时,PUBLISH报文中的dupFlag会被设置为True(如上图黑色横线所标注的部分)。这是为了告诉接收端,此消息为重复发送的消息。

QoS = 2 – 保证收一次

MQTT服务质量最高级是2级,即QoS = 2。当MQTT服务质量为2级时,MQTT协议可以确保接收端只接收一次消息。

如下图所示,QoS=2的收发相对更加复杂。发送端需要接收端进行两次消息确认。因此,2级MQTT服务质量是最安全的服务级别,也是最慢的服务级别。

下面我们来分步看一下Q0S=2时的消息发送和接收基本流程。


接收端收到QoS为2的消息后,会返回PUBREC报文作为应答。

发送端收到PUBREC报文后,会把此报文进行存储,并且返回PUBREL报文作为应答。


当接收端收到PUBREL报文后,会应答发送端一条PUBCOMP报文。至此,一次QoS2的MQTT消息传输就结束了。

以上是QoS=2时的MQTT通讯基本过程。这里我们只给您列出了基本流程,而没有过多的讲解MQTT协议是如何控制接收端只接收一次消息。这么做是因为本教程的重点是MQTT应用。关于QoS=2的MQTT服务端内部控制机制,我们在实际开发MQTT物联网的过程中是不会涉及到的。

所以我们只需要牢记一点,那就是QoS=2可以保证接收端只收一次消息。

三、设置QoS

了解了QoS的含义后,我们该如何在MQTT通讯中设置QoS呢?下面我们来分别讲解客户端在发布消息和订阅消息时如何设置QoS。

发布消息

如下图所示,客户端发布信息时,PUBLISH数据包中专有一个信息为qos。该信息正是用于设置客户端发布MQTT消息的QoS等级。

订阅消息

同样的,在客户端订阅MQTT主题时,SUBSCRIBE数据包中也同样有一个信息用于设置订阅主题的QoS级别。客户端正是通过该主题来设置订阅主题的QoS级别的。

换句话说,无论是发布(PUBLISH)还是订阅(SUBSCRIBE),都可以使用数据包中的qos消息设置服务质量级别。

接收端连接服务端

另外,要想实现QoS>0的MQTT通讯,客户端在连接服务端时必须要将cleanSession设置为false。如果这一步没有实现,那么客户端是无法实现QoS>0的MQTT通讯。这一点非常关键,务必要留意。

四、服务质量降级

讲到这里,不知道有没有朋友会感到好奇。假如客户端在发布和订阅信息时使用不同级别的QoS,将会发生什么情况呢。如下图所示,假如客户端A发布到主题1的消息是采用QoS = 2,然而客户端B订阅主题1采用QoS = 1。那么服务端该如何来应对这一情况呢?
MQTT-QoS-设置-1

在这种情况下,服务端会使用较低级别来提供服务。如下图所示,虽然A发送到主题1的消息采用QoS为2,但是服务端发送主题1的消息给B时,采用的QoS为1。这是因为B在订阅主题1时采用的QoS为1。

MQTT-QoS-设置-2

下面我们再来看一种情况。

如下图所示,假如客户端A发布主题1消息时使用QoS为0,而客户端B订阅主题1消息时使用QoS为1。


在这种情况下,虽然客户端B订阅主题1消息时QoS为1,但是由于客户端A发送主题1消息时QoS为0,所以服务端发送消息给B的QoS为0。

通过以上两个示例我们可以看到。对于发布和订阅消息的客户端,服务端会主动采用较低级别的QoS来实现消息传输。

五、通讯时的注意事项

QoS=1通讯时的注意事项

如想在MQTT通讯中实现服务质量等级为1级(QoS=1),我们要分别对消息的发布端课接收端进行相应的设置。以下列表中的内容是具体需要采取的措施。

  • 接收端连接服务端时cleanSession设置为false
  • 接收端订阅主题时QoS=1
  • 发布端发布消息时QoS=1

QoS=2通讯时的注意事项

如想在MQTT通讯中实现服务质量等级为2级(QoS=2),我们要分别对消息的发布端和接收端进行相应的设置。以下列表中的内容是具体需要采取的措施。

  • 接收端连接服务端时cleanSession设置为false
  • 接收端订阅主题时QoS=2
  • 发布端发布消息时QoS=2

六、小结

  • 若想实现QoS>0,订阅端连接服务端时cleanSession需要设置为false,订阅端订阅主题时QoS>0,发布端发布消息时的QoS>0。
  • 服务端会选择发布消息和订阅消息中较低的QoS来实现消息传输,这也被称作“服务降级”。
  • QoS = 0, 占用的网络资源最低,但是接收端可能会出现无法接收消息的情况,所以适用于传输重要性较低的信息。
  • QoS = 1, MQTT会确保接收端能够接收到消息,但是有可能出现接收端反复接收同一消息的情况。
  • QoS = 2, MQTT会确保接收端只接收到一次消息。但是QoS为2时消息传输最慢,另外消息传输需要多次确认,因此所占用的网络资源也是最多的。此类服务等级适用于重要消息传输。
  • 由于QoS1和QoS2都能确保客户端接收到消息,但是QoS1所占用的资源较QoS2占用资源更小。因此建议使用QoS1来实现网络资源较为珍贵的环境下传输重要信息。

MQTT-QoS 服务质量等级相关推荐

  1. MQTT——QoS服务质量等级

    1.QoS是MQTT协议中的一个重要标志位.在固定报头第一个字节,低4位中定义: 2.QoS服务质量等级分为三级:QoS0,QoS1,QoS2; 2.1.QoS0:最多发送一次,到达不到达发布者不管, ...

  2. 【MQTT基础篇(十)】QoS 服务质量等级

    文章目录 QoS 服务质量等级 1 什么是服务质量? 1.1 QoS = 0 最多发一次 1.2 QoS = 1 最少发一次 1.3 QoS = 2 保证收一次 2 设置QoS 2.1 发布消息 2. ...

  3. pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas

    前言 环境:k8s-v1.22.17 docker-20.10.9 centos-7.9 目录 前言 什么是可计算资源 CPU.Memory计量单位 pod资源请求.限额方式 pod定义request ...

  4. QoS 服务质量等级

    什么是MQTT服务质量? 在之前的课程里我们提到过,一个物联网系统中有些信息非常重要,我们需要确保这类重要信息可以准确无误的发送和接收,而有些信息则相对不那么重要,这类信息如果在传输中丢失不会影响系统 ...

  5. 学习太极创客 — MQTT 第二章(一)QoS 服务质量等级

    视频链接:https://www.bilibili.com/video/BV1FK4y1L7TQ/?spm_id_from=333.788.recommend_more_video.-1&vd ...

  6. MQTT服务质量等级及抓包分析

    什么是服务质量? 服务质量(QualityofService,QoS)等级是消息发送方与消息接收方之间的协议,对应着消息传递时不同的可靠程度. MQTT有三种QoS等级: 至多一次(QoS 0) 至少 ...

  7. MQTT QoS服务质量

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

  8. MQTT QoS 详解

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

  9. MQTT Qos类型解释

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

最新文章

  1. 图像分割(Image Segmentation)
  2. kubeadm安装kubernetes 1.13.2多master高可用集群
  3. 一维数组和指针的关系
  4. python画圣诞树代码解读_实战 | 教你用Python画各种版本的圣诞树
  5. Hyper-V动态扩展或差异磁盘体积缩小技巧
  6. 不同特征值对应的特征向量
  7. 人工智能知识体系的学习路线(南京大学人工智能学院本科生培养体系)
  8. 应用商店应用计算机,应用市场电脑版
  9. P问题、NP问题、NPC问题
  10. Agilent/安捷伦N6705B直流电源分析仪
  11. js 条码枪扫描_JavaScript 扫描枪使用(一)
  12. 树莓派(RPi) CentOS7扩展内存卡剩余空间
  13. excel一列求和_EXCEL表格怎么自动求和?4种典型批量求和套路
  14. C++程序设计 第2单元作业2:在线编程-名字空间
  15. android虚拟按键趋势,为什么Android虚拟按键老被吐槽但却有厂商坚持在做?
  16. 深度学习中滑动平均模型的作用、计算方法及tensorflow代码示例
  17. AD21覆铜,包地,补泪滴,有图
  18. php 字符串编码方式转换,PHP 字符串编码的转换
  19. 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了1个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天想再吃时,就只剩一个
  20. Unity中OnTriggerEnter条件以及isTrigger的一个问题

热门文章

  1. 分布式数据库中间件 MyCat 搞起来
  2. 端宗과 世祖 (朝鮮歷史 韓長庚)
  3. 软件生命周期以及测试方法
  4. imagenet 数据整理
  5. Mac配置homebrew
  6. 方差计算公式的变形及应用
  7. [node] node
  8. Serverless入门
  9. mercury怎么设置虚拟服务器,XAMPP邮件服务器Mercury的设置方法
  10. MapReduce工作笔记——Streaming多路输出