×

Interval 特性 Session Expiry Clean

Clean Start与Session Expiry Interval - MQTT 5.0新特性

jnlyseo998998 jnlyseo998998 发表于2023-04-04 19:38:02 浏览27 评论0

抢沙发发表评论

前言

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

MQTT 3.1.1版本的Clean Session

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

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

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

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

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