文档章节

MQTT 5.0 新特性(四)Clean Start 与 Session Expiry Interval

EMQX
 EMQX
发布于 09/10 14:10
字数 1030
阅读 31
收藏 0

前言

MQTT v5.0 中的 Clean Start 与 Session Expiry Interval,对于有 MQTT v3.1.1 版本协议使用经验的朋友,一定不会感觉陌生,因为这两个字段与之前版本中的 Clean Session 非常相似。但它们在实际使用中远比 Clean Session 灵活,下文将详细介绍这几个字段的作用与区别。

MQTT v3.1.1 版本的 Clean Session

如果 Clean Session 设置为 0,服务端必须使用与 Client ID 关联的会话来恢复与客户端的通信。如果不存在这样的会话,服务器必须创建一个新会话。客户端和服务器在断开连接后必须存储会话的状态。

如果 Clean Session 设置为 1,客户端和服务器必须丢弃任何先前的会话并创建一个新的会话。该会话的生命周期将和网络连接保持一致,其会话状态一定不能被之后的任何会话重用。

可以看出,MQTT 期望通过这种持久会话的机制避免客户端掉线重连后消息的丢失,并且免去客户端连接后重复的订阅流程。这一功能在带宽小,网络不稳定的物联网场景中非常实用。但 Clean Session 同时限定了客户端和服务器在连接和断开连接两种状态下的行为,这并不是一个很好的实现。此外,在某些场景下会话并不需要服务器永久保留自己的状态时,这个机制将会导致服务器资源的浪费。

MQTT v5.0 版本的 Clean Start 与 Session Expiry Interval

如果 CONNECT 报文中的 Clean Start 为 1,客户端和服务端必须丢弃任何已存在的会话,并开始一个新的会话。

如果 CONNECT 报文中的 Clean Start 为 0 ,并且存在一个关联此客户端标识符的会话,服务端必须基于此会话的状态恢复与客户端的通信。如果不存在任何关联此客户端标识符的会话,服务端必须创建一个新的会话。

Session Expiry Interval 以秒为单位,如果 Session Expiry Interval 设置为 0 或者未指定,会话将在网络连接关闭时结束。

如果 Session Expiry Interval 为 0xFFFFFFFF ,则会话永不过期。

如果网络连接关闭时(DISCONNECT 报文中的 Session Expiry Interval 可以覆盖 CONNECT 报文中的设置) Session Expiry Interval 大于0,则客户端与服务端必须存储会话状态 。

现在,Clean Start 替代了原先的 Clean Session,但不再用于指示是否存储会话状态,仅用于指示服务端在连接时应该尝试恢复之前的会话还是直接创建全新的会话。会话状态在服务端的存储时长则完全交给 Session Expiry Interval 决定。

前面还提到,MQTT v5.0 支持客户端在断开连接时重新指定 Seesion Expiry Interval。这样我们可以非常容易地满足类似客户端网络连接异常断开时会话状态被服务器保留,客户端正常下线时会话则随着连接关闭而结束的场景,只需要客户端在断开连接时将 Session Expiry Interval 设置为 0 即可。即便是一个已经永不过期的会话,客户端也可以在下一次连接中通过设置 Clean Start 为 1 来 "反悔"。

Clean Start 与 Session Expiry Interval 不仅解决了 Clean Session 的遗留问题,同时也扩展了客户端的使用场景,使 MQTT 协议在受限的网络环境下更加实用。


更多信息请访问我们的官网 emqx.io,或关注我们的开源项目 github.com/emqx/emqx ,详细文档请访问 官方文档

© 著作权归作者所有

EMQX
粉丝 4
博文 54
码字总数 71436
作品 0
杭州
私信 提问
EMQ X 3.0-beta.1 版本发布,完整支持 MQTT-5.0 协议

EMQ X 3.0-beta.1 版本发布,版本别名: The Promise of Tomorrow。兼容 MQTT-3.1.1 协议的同时, 完整支持 MQTT-5.0 协议。此外还增加了很多实用的功能特性,重构了核心组件,提升了系统的伸...

emqtt
2018/09/05
1K
1
EMQ X 3.0-Beta.2 发布,包含对 MQTT 5.0 新特性的改进

EMQ X 主工程 功能改进: 支持 MQTT 5.0 'subscription options' 增加对 MQTT 5.0 'Topic-Alias' 的校验 改进 hooks 的设计 将模块 'emqx_mqtt_properties' 重命名为 'emqx_mqtt_props' 改进 ......

emqtt
2018/09/11
1K
1
EMQ X 3.0-beta.3 发布,新增共享订阅派发策略功能

功能改进 修复 travis 构建 更新模块emqx_mqueue.erl文档说明 新增共享订阅派发策略 修复emqx_pool模块参数错误 新增强制shutdown策略 改进KeepAlive检测算法 修复跨节点消息投递 改进Bridg...

emqtt
2018/09/26
1K
0
php将session中的数据保存到mysql

php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了 浏览器的cookie,程序中的session相关操作将无法执行...

逸舟
2011/03/31
162
0
如何在多web服务器共享SESSION数据

一、问题起源   稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站...

蜗牛奔跑
2016/03/08
31
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部