关于MQTT连接的属性
连接相关的属性.
这些属性是MQTT的连接报文中连接标志字, 包含一些用于指定 MQTT 连接行为的参数.
1.清理会话(Clean Session)
客户端和服务端可以保存会话状态,以支持跨网络连接的可靠消息传输. 这个标志位用于控制会话状态的生存时间.
值为0. 客户端和服务器端基于会话状态(用客户端标识符识别)恢复与客户端的通信.服务器端没有该标识符, 则创建新的会话. 当连接断开后, 客户端和服务端必须保存会话信息. 同时, 服务器端必须保存客户端订阅过的QoS1和QoS2级别的消息为会话的一部分.
值为1. 客户端和服务端必须丢弃之前的任何会话并开始一个新的会话.会话仅持续和网络连接同样长的时间. 与这个会话关联的状态数据不能被任何之后的会话重用.
客户端的会话状态包括:
已经发送给服务端, 但是还没有完成确认的 QoS 1 和 QoS 2 级别的消息.
已从服务端接收, 但是还没有完成确认的 QoS 2 级别的消息.
服务端的会话状态包括:
会话是否存在, 即使会话状态的其它部分都是空.
客户端的订阅信息.
已经发送给客户端, 但是还没有完成确认的 QoS 1 和 QoS 2 级别的消息.
即将传输给客户端的 QoS 1 和 QoS 2 级别的消息.
已从客户端接收, 但是还没有完成确认的 QoS 2 级别的消息.
可选, 准备发送给客户端的 QoS 0 级别的消息.保留消息不是服务端会话状态的一部分, 会话终止时不能删除保留消息.
关键点:
1. 为了确保在发生故障时状态的一致性, 客户端应该使用会话状态标志 1 重复请求连接, 直到连接成功.
2.一般来说, 客户端连接时总是将清理会话标志设置为 0 或 1,并且不交替使用两种值。 这个选择取决于具体的应用.
清理会话标志设置为 1 的客户端不会收到旧的应用消息, 而且在每次连接成功后都需要重新订阅任何相关的主题.
清理会话标志设置为 0 的客户端会收到所有在它连接断开期间发布的 QoS 1 和 QoS 2 级别的消息.因此, 要确保不丢失连接断开期间的消息, 需要使用 QoS 1 或QoS 2 级别,同时将清理会话标志设置为 0.
清理会话标志 0 的客户端连接时, 服务端在连接断开后会保留它的 MQTT 会话状态. 如果打
算在之后的某个时间点重连到这个服务端, 客户端连接应该只使用清理会话标志 0.当客户端决定之后不再使用这个会话时,应该将清理会话标志设置为 1 最后再连接一次,然后断开连接.(释放服务器资源).
清理会话规定了会话的时效性. 标志为0, 可以保障MQTT协议消息可靠递出, 即便有延时; 标志为1, 可以节约服务器资源.
2.遗嘱标志(Will Flag)
遗嘱标志(Will Flag) 被设置为 1,表示如果连接请求被接受了, 遗嘱消息(Will Message) 必须被存储在服务端并且与这个网络连接关联。当网络连接关闭时,服务端必须发布这个遗嘱消息, 除非服务端收到DISCONNECT 报文时删除了这个遗嘱消息
遗嘱消息发布的条件, 包括但不限于:
服务端检测到了一个 I/O 错误或者网络故障.
客户端在保持连接(Keep Alive)的时间内未能通讯.
客户端没有先发送 DISCONNECT 报文直接关闭了网络连接.
由于协议错误服务端关闭了网络连接.如果遗嘱标志被设置为 1,连接标志中的 Will QoS 和 Will Retain 字段会被服务端用到, 同时有效载荷中必须包含 Will Topic 和 Will Message 字段 .
一旦被发布或者服务端收到了客户端发送的 DISCONNECT 报文, 遗嘱消息就必须从存储的会话状态中移除 .
如果遗嘱标志被设置为 0, 连接标志中的 Will QoS 和 Will Retain 字段必须设置为 0, 并且有效载荷中不能包含 Will Topic 和 Will Message 字段.
如果遗嘱标志被设置为 0,网络连接断开时, 不能发送遗嘱消息.
服务端应该迅速发布遗嘱消息。在关机或故障的情况下, 服务端可以推迟遗嘱消息的发布直到之后的重启.如果发生了这种情况, 在服务器故障和遗嘱消息被发布之间可能会有一个延迟.
遗嘱标志确定了传输链路发生故障时MQTT协议的后手保障方案, 通过遗嘱消息告诉订阅者某个客户端发生故障.
3.遗嘱消息质量(Will QoS)
遗嘱消息质量用于指定发布遗嘱消息时使用的服务质量等级. 只有使用了遗嘱标志, 改项才能设置非0参数.
0. 最多发送一次. (发送一次完事)
1. 最少发送一次. (可能发送多次,必须接到应答)
2. 可靠发送一次. (只发送一次, 并保证送达)
遗嘱消息质量规定了遗嘱消息发布的可靠性等级.
4.遗嘱保留(Will Retain)
只有使用了遗嘱标志, 改项才能设置非0参数.
遗嘱保留为 0, 服务端必须将遗嘱消息当作非保留消息发布 .
遗嘱保留为 1, 服务端必须将遗嘱消息当作保留消息发布 .
遗嘱保留规定了遗嘱消息发布后的留存问题.
5.用户名标志(User Name Flag)
设置为 0, 有效载荷中不能包含用户名字段.
设置为 1, 有效载荷中必须包含用户名字段.用户名标志表示MQTT协议允许匿名登录.具体和服务端的实现相关.
6. 密码标志(Password Flag)
设置为 0, 有效载荷中不能包含密码字段.
设置为 1, 有效载荷中必须包含密码字段.
如果用户名标志被设置为 0, 密码标志也必须设置为 0.密码标志表示匿名登录不能有密码, 非匿名登录可以只用用户名,也可以用户名+密码.
- 发布相关的属性.
1.重发标志(DUP)
如果 DUP 标志被设置为 0, 表示这是客户端或服务端第一次请求发送这个 PUBLISH 报文。 如果 DUP 标志被设置为 1,表示这可能是一个早前报文请求的重发。
客户端或服务端请求重发一个 PUBLISH 报文时, 必须将 DUP 标志设置为 1.
对于 QoS0 的消息, DUP 标志必须设置为 0.
服务端发送 PUBLISH 报文给订阅者时, 收到(入站) 的 PUBLISH 报文的 DUP 标志的值不会被传播。 发送(出站) 的 PUBLISH 报文与收到(入站) 的 PUBLISH 报文中的 DUP 标志是独立设置的, 它的值必须单独的根据发送(出站) 的 PUBLISH 报文是否是一个重发来确定 .
关键点:
1.接收者收到一个 DUP 标志为 1 的控制报文时, 不能假设它看到了一个这个报文之前的一个副本.
2.需要特别指出的是, DUP 标志关注的是控制报文本身, 与它包含的应用消息无关.
当使用 QoS 1时, 客户端可能会收到一个 DUP 标志为 0 的 PUBLISH 报文, 这个报文包含一个它之前收到过的应用消息的副本, 但是用的是不同的报文标识符。
重发标志和使用MQTT的用户无关, 和MQTT服务端和客户端实现相关.
2.服务质量等级(QoS)
这个字段表示应用消息分发的服务质量等级保证。
0. 最多发送一次. (发送一次完事)
1. 最少发送一次. (可能发送多次,必须接到应答)
2. 可靠发送一次. (只发送一次, 并保证送达)
3.保留标志(Retain)
如果客户端发给服务端的 PUBLISH 报文的保留(RETAIN) 标志被设置为 1, 服务端必须存储这个应用消息和它的服务质量等级(QoS) ,以便它可以被分发给未来的主题名匹配的订阅者 .
一个新的订阅建立时,对每个匹配的主题名,如果存在最近保留的消息, 它必须被发送给这个订阅者 .
如果服务端收到一条保留(RETAIN) 标志为 1 的 QoS 0 消息, 它必须丢弃之前为那个主题保留的任何消息. 它应该将这个新的 QoS 0 消息当作那个主题的新保留消息,但是任何时候都可以选择丢弃它. 如果这种情况发生了, 那个主题将没有保留消息 .
服务端发送 PUBLISH 报文给客户端时,如果消息是作为客户端一个新订阅的结果发送, 它必须将报文的保留标志设为 1.
当一个 PUBLISH 报文发送给客户端是因为匹配一个已建立的订阅时,服务端必须将保留标志设为 0, 不管它收到的这个消息中保留标志的值是多少.
保留标志为 1 且有效载荷为零字节的 PUBLISH 报文会被服务端当作正常消息处理,它会被发送给订阅主题匹配的客户端。此外,同一个主题下任何现存的保留消息必须被移除,因此这个主题之后的任何订阅者都不会收到一个保留消息 . 服务端不能存储零字节的保留消息.
如果客户端发给服务端的 PUBLISH 报文的保留标志位 0, 服务端不能存储这个消息也不能移除或替换任何现存的保留消息.
保留消息标志标示着这条消息比较重要, 新的订阅者需要收到. 新的保留消息会覆盖旧的保留消息, 空的保留消息会清空以往的保留消息.
- 订阅主题相关的属性
1. Requested QoS
这个属性是订阅报文有效载荷的一部分, 用于表示订阅的服务质量要求.
以上参考了《MQTT-3.1.1-CN》. 如发现错误, 敬请留言!!
关于MQTT连接的属性的更多相关文章
- 单机千万级MQTT连接服务器测试报告
目标:测试创建1000万客户端连接到服务器端,服务器操作系统 Linux(任意一款发行版服务器版本).分别在两台硬件一样的服务器,其中一台用于服务器端运行,另一台用于创建千万客户端连接客户端机器.在硬 ...
- 帆软报表FineReport中数据连接的JDBC连接池属性问题
连接池原理 在帆软报表FineReport中,连接池主要由三部分组成:连接池的建立.连接池中连接使用的治理.连接池的关闭.下面就着重讨论这三部分及连接池的配置问题. 1. 连接池原理 连接池技术的核心 ...
- 使用 JSSE 定制 SSL 连接的属性--转载
当数据在网络上传播的时候,通过使用 SSL 对其进行加密和保护,JSSE 为 Java 应用程序提供了安全的通信.在本篇有关该技术的高级研究中,Java 中间件开发人员 Ian Parkinson 深 ...
- MQTT连接服务器返回2
/********************************************************************************* * MQTT连接服务器返回2 * ...
- hikari连接池属性详解
hikari连接池属性详解 一.主要配置 1.dataSourceClassName 这是DataSourceJDBC驱动程序提供的类的名称.请查阅您的特定JDBC驱动程序的文档以获取此类名称,或参阅 ...
- ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT连接阿里云物联网平台
前言 这节看一下在阿里云上实现MQTT通信是个怎样的流程 看了很多网上的教程,感觉讲的迷迷糊糊.... 其实感觉他们是对MQTT不够透彻,所以写的文章就是个比着葫芦画瓢的感觉 在我面前这东西就是玩具. ...
- django 通过MQTT连接阿里云
Django MQTT 连接阿里云 目录 Django MQTT 连接阿里云 目录 一.安装库 1.安装Python对接mqtt协议库,paho-mqtt 二. 设备认证,一机一密型接入 三.问题 1 ...
- MQTT——连接报文
学习MQTT协议.如果只是看了相关文档就认为可以了.那是一个错误的观念.笔者为了能更好的去理解MQTT协议.看了不少相关的开源Broker的项目.可惜这些项目一般都是不完全的.不过从这些项目中笔者至少 ...
- Druid连接池 属性说明
1.1 maxActive 连接池支持的最大连接数.一般取值20就可以了,一般把maxActive设置成可能的并发量就行了设 0 为没有限制. 1.2 maxIdle 连接池中最多可空闲maxIdle ...
随机推荐
- ubuntu 切换用户
app切换root ubuntu: sudo su - app sudo su - root centos : sudo su ############ root 切换app sudo su - ap ...
- Servlet继承体系结构
Servlet如何只定义1个service方法,其它的方法按需求设置 Servlet——接口 ↑继承 GenericServlet——抽象类 ↑继承 HttpServlet——抽象类:推荐使用 Gen ...
- (BFS)1097: Yuchang and Zixiang ‘s maze
1097: Yuchang and Zixiang ‘s maze Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 863 Solved: 149 De ...
- Linux常用命令英文全称与中文解释 (pwd、su、df、du等)
https://blog.csdn.net/qq_40334837/article/details/83819735 Linux常用命令英文全称与中文解释 apt: Advanced Packagin ...
- git 本地回滚与远程库回滚
不说废话,开始: 一.本地回滚: git reset --hard commit-id //回滚到commit-id 二.远程回滚操作分3步:①将本地分支退回到某个commit ②删除远程分支 ...
- 每天进步一点点------SysTimer
/******************************************************************** * 文 件 名:SysTimer_test.c * 功 能: ...
- jquery 获取 父级 iframe 里的控件对象
window.parent.document.getElementsByTagName('iframe')[0].contentWindow.document.getElementById('id')
- Django Web接口开发
什么是接口 接口一般来讲分为两种: (1)程序内部的接口:方法与方法.模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就 ...
- php 基础 二维数组以某个重复值累加
$arr = array( array('id' => 123, 'name' => '张三', 'amount'=>'1'), array('id' => 123, 'nam ...
- ubuntu16 安装opencv3.4.2
下载好opencv3.4.2.zip 执行命令: unzip opencv3.4.2.zip 进入解压后的文件夹: cd opencv3.4.2/ 创建编译路径: mkdir release 进入新创 ...