from:https://www.cnblogs.com/schips/p/12262587.html

背景

QoS 等级 与 通信的流程有关,直接影响了整个通信。而且篇幅比较长,所以我觉得应该单独拎出来讲一下。

概念

QoS 代表了 服务质量等级。 设置上,由2 位 的二进制控制,且值不允许为 3(0x11)。

QoS值Bit 2Bit 1描述000最多分发一次

101至少分发一次

210只分发一次

-11保留位

要注意的是,QoS 是 Sender 和 Receiver 之间达成的协议,不是 Publisher 和 Subscriber 之间达成的协议。也就是说 Publisher 发布一条 QoS1 的消息,只能保证 Broker 能至少收到一次这个消息;至于对应的 Subscriber 能否至少收到一次这个消息,还要取决于 Subscriber 在 Subscribe 的时候和 Broker 协商的 QoS 等级。这里又牵扯出一个概念:"QoS 降级":在 MQTT 协议中,从 Broker 到 Subscriber 这段消息传递的实际 QoS 等于 "Publisher 发布消息时指定的 QoS 等级和 Subscriber 在订阅时与 Broker 协商的 QoS 等级,这两个 QoS 等级中的最小那一个。"

QoS 0 的通信时序图

此时,整个过程中的 Sender 不关心 Receiver 是否收到消息,它"尽力"发完消息,至于是否有人收到,它不在乎。

发布者服务器订阅者PUBLISH (QoS0,Msg-A)PUBLISH(QoS0,Msg-A)Delete Msg-A发布者服务器订阅者QoS 0:At most one(Fire and forget)

QoS1 的通信时序图

此时,Sender 发送的一条消息,Receiver 至少能收到一次,也就是说 Sender 向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,但是因为重传的原因,Receiver 有可能会收到重复的消息;

发布者服务器订阅者Store (Msg-A)PUBLISH (QoS1,Msg-A)Store (Msg-A)PUBLISH (QoS1,Msg-A)PUBACK (QoS1)Delete (Msg-A)PUBACK (QoS1,Msg-A)Delete (Msg-A)发布者服务器订阅者QoS 1:At least one

1)Sender 向 Receiver 发送一个带有消息数据的 PUBLISH 包, 并在本地保存这个 PUBLISH 包。

2)Receiver 收到 PUBLISH 包以后,向 Sender 发送一个 PUBACK 数据包,PUBACK 数据包没有消息体(Payload),在可变头中(Variable header)中有一个包标识(Packet Identifier),和它收到的 PUBLISH 包中的 Packet Identifier 一致。

3)Sender 收到 PUBACK 之后,根据 PUBACK 包中的 Packet Identifier 找到本地保存的 PUBLISH 包,然后丢弃掉,一次消息的发送完成。

4)如果 Sender 在一段时间内没有收到 PUBLISH 包对应的 PUBACK,它将该 PUBLISH 包的 DUP 标识设为 1(代表是重新发送的 PUBLISH 包),然后重新发送该 PUBLISH 包。重复这个流程,直到收到 PUBACK,然后执行第 3 步。

QoS 2 的通信时序图QoS2 不仅要确保 Receiver 能收到 Sender 发送的消息,还要保证消息不重复。它的重传和应答机制就要复杂一些,同时开销也是最大的。

Sender 发送的一条消息,Receiver 确保能收到而且只收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,同时保证 Receiver 不会因为消息重传而收到重复的消息。

发布者服务器订阅者Store (Msg-A)PUBLISH (QoS2,Msg-A,DUP=0)Store (Msg-A)PUBREC (QoS2,Msg-A)PUBREL (QoS2,Msg-A)PUBLISH (QoS2,Msg-A,DUP=0)PUBCOMP (QoS2,Msg-A)Delete (Msg-A)Store (Msg-A)PUBREC (QoS2,Msg-A)PUBREL (QoS2,Msg-A)Notify (Msg-A)PUBCOMP (QoS2,Msg-A)Delete (Msg-A)Delete (Msg-A)发布者服务器订阅者QoS 2:Exactly one

QoS 使用 2 套请求/应答流程(一个 4 段的握手)来确保 Receiver 收到来自 Sender 的消息,且不重复:

1)Sender 发送 QoS 为 2 的 PUBLISH 数据包,数据包 Packet Identifier 为 P,并在本地保存该 PUBLISH 包;

2)Receiver 收到 PUBLISH 数据包以后,在本地保存 PUBLISH 包的 Packet Identifier P,并回复 Sender 一个 PUBREC 数据包,PUBREC 数据包可变头中的 Packet Identifier 为 P,没有消息体(Payload);

3)当 Sender 收到 PUBREC,它就可以安全地丢弃掉初始的 Packet Identifier 为 P 的 PUBLISH 数据包,同时保存该 PUBREC 数据包,同时回复 Receiver 一个 PUBREL 数据包,PUBREL 数据包可变头中的 Packet Identifier 为 P,没有消息体;如果 Sender 在一定时间内没有收到 PUBREC,它会把 PUBLISH 包的 DUP 标识设为 1,重新发送该 PUBLISH 数据包(Payload);

4)当 Receiver 收到 PUBREL 数据包,它可以丢弃掉保存的 PUBLISH 包的 Packet Identifier P,并回复 Sender 一个 PUBCOMP 数据包,PUBCOMP 数据包可变头中的 Packet Identifier 为 P,没有消息体(Payload);

5)当 Sender 收到 PUBCOMP 包,那么它认为数据包传输已完成,它会丢弃掉对应的 PUBREC 包。如果 Sender 在一定时间内没有收到 PUBCOMP 包,它会重新发送 PUBREL 数据包。

我们可以看到在 QoS2 中,完成一次消息的传递,Sender 和 Reciever 之间至少要发送四个数据包,QoS2 是最安全也是最慢的一种 QoS 等级了。

QoS 和会话(Session)

客户端的会话状态包括:已经发送给服务端,但是还没有完成确认的QoS 1和QoS 2级别的消息

已从服务端接收,但是还没有完成确认的QoS 2级别的消息。

服务端的会话状态包括:会话是否存在,即使会话状态的其它部分都是空。

客户端的订阅信息。

已经发送给客户端,但是还没有完成确认的QoS 1和QoS 2级别的消息。

即将传输给客户端的QoS 1和QoS 2级别的消息。

已从客户端接收,但是还没有完成确认的QoS 2级别的消息。

可选,准备发送给客户端的QoS 0级别的消息。

保留消息不是服务端会话状态的一部分,会话终止时不能删除保留消息。

如果 Client 想接收离线消息,必须使用持久化的会话(CONNECT报文中可变头(byte8[1])Clean Session = 0)连接到 Broker,这样 Broker 才会存储 Client 在离线期间没有确认接收的 QoS 大于 1 的消息。

QoS 等级的选择

在以下情况下你可以选择 QoS0:Client 和 Broker 之间的网络连接非常稳定,例如一个通过有线网络连接到 Broker 的测试用 Client;

可以接受丢失部分消息,比如你有一个传感器以非常短的间隔发布状态数据,所以丢一些也可以接受;

你不需要离线消息。

在以下情况下你应该选择 QoS1:你需要接收所有的消息,而且你的应用可以接受并处理重复的消息;

你无法接受 QoS2 带来的额外开销,QoS1 发送消息的速度比 QoS2 快很多。

在以下情况下你应该选择 QoS2:你的应用必须接收到所有的消息,而且你的应用在重复的消息下无法正常工作,同时你也能接受 QoS2 带来的额外开销。

实际上,QoS1 是应用最广泛的 QoS 等级,QoS1 发送消息的速度很快,而且能够保证消息的可靠性。虽然使用 QoS1 可能会收到重复的消息,但是在应用程序里面处理重复消息,通常并不是件难事。

java qos_QoS等级 与 会话[转]相关推荐

  1. Java工程师等级划分

    在哔哩哔哩中看到一个视频,视频内容是对Java工程师等级做了一个简单划分,以前我也找过相关的文章,但没有找到合适的,刚好做个笔记,小伙伴们可以参考一下,主要以下几个维度展开: 薪资待遇: 工作年限(具 ...

  2. Java web后端4 会话 Cookie Session

    会话 会话:指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应的过程. 客户端和服务器的请求和响应的过程(对话双方只要有一方发生变化,都属于不同的会话) 超时间隔[距离上一次请求的 ...

  3. java 4种跟踪会话技术_会话跟踪技术

    一.会话跟踪技术 在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束. 在一个会话的多个请求中共享数据,这就是会话跟踪技术 会话路径技术使用Cookie ...

  4. java redirect 超时_会话超时后,Spring安全性不会重定向到上次请求的页面登录

    首先启用并发会话控制支持是在以下位置添加以下侦听器web.xml: org.springframework.security.web.session.HttpSessionEventPublisher ...

  5. Java——成绩等级评定

    目录 对百分制成绩评定等级 (一)编程实现 方法一.采用并列式多分支结构评定成绩等级 思路:有多少种情况,就并列写多少个单分支,分支之间相互独立 方法二.采用嵌套式多分支结构评定成绩等级 思路1.从高 ...

  6. Java计算机等级考试系统的实现_基于JSP的计算机等级考试查询系统的设计与实现论文.docx...

    基于JSP的计算机等级考试查询系统的设计与实现论文.docx 职场大变样社区():下载毕业设计成品全套资料,全部50元以下毕业设计(论文)任务书第1页毕业设计(论文)题目:基于JSP的计算机等级考试查 ...

  7. java jdbc is一个会话_java_JdbcUtilis_单实例

    //eg1,没有使用单实例,eg2有 package cn.itcast; import java.sql.Connection; import java.sql.DriverManager; imp ...

  8. Java(等级划分)

    import java.util.Scanner;public class next {public static void main(String[] args){//声明部分int score;S ...

  9. java 会员等级_java-第四章-升级我行我素购物管理系统,实现计算会员折扣

    import java.util.Scanner; public class A03 { /** * @param args */ public static void main(String[] a ...

最新文章

  1. Moving Towards Third‐Generation Sequencing Technologies 迈向第三代测序技术
  2. hadoop3.0 分布式搭建/安装
  3. 双链表的建立、求长、定位、插入、删除、输出和释放
  4. 在C/C++语言中使用正则表达式
  5. hdu 4288 Coder (成都赛区 线段树)
  6. 诺基亚在日本测试5G网络 网速可达256MB/s
  7. Oracle中的COALESCE,NVL,NVL2,NULLIF函数
  8. linux 创建用户/添加用户/用户组添加修改删除(ubuntu/centos)
  9. MarkText常用快捷键
  10. 【C语言】abs()用法及其他绝对值函数
  11. Vue的8种通信方式
  12. Assembler messages error gcc and clang build
  13. 五星大饭店完整剧情,五星大饭店(完整集数)在线观看
  14. C语言练习之打印9*9乘法口诀表
  15. 微信分享中将链接图标替换成自定义图片的实例
  16. 吕 思 伟 ---- 潘 爱 民 :: ATL 介 绍( 一) (转)
  17. 国产系统-Deepin安装图文(VIP典藏2022版)
  18. 铁氧体磁芯电感的特性大揭秘
  19. Chrome怎么导出扩展程序(插件)为crx文件
  20. sql注入之——SQLMap常见语句

热门文章

  1. CVPR 2022 | 超越RepVGG!浙大阿里提出OREPA:在线卷积重参数化
  2. [PyQt]使用Qt Designer设计师完成PyQt界面图标设计
  3. 《让子弹飞》系列——自称处男的老五
  4. 【数学建模】(3)插值模型 精解+代码
  5. office online server的使用感受
  6. DeepDive安装教程
  7. 会议签到二维码制作教程
  8. 科蒂斯控制器故障代码_科蒂斯1230控制器故障代码指示
  9. 光环国际PMP:项目经理常见的工作误区
  10. 最优化方法Python计算:一元函数搜索算法——黄金分割法