前言

该报文为控制报文,MQTT5将该报文的传递方向由单向变成双向。

DISCONNECT – 断开连接/断开通知

MQTT3.1.1为断开连接,MQTT5为断开通知

【MQTT 3.1.1】

DISCONNECT报文是客户端发给服务端的最后一个控制报文。表示客户端正常断开连接。

【MQTT 5】

DISCONNECT数据报文是从客户端或服务器发送的最终MQTT控制数据报文。

它指示了网络连接被关闭的原因。 客户端或服务器可以在关闭网络连接之前发送一个DISCONNECT数据报文。 如果网络连接被关闭,而客户端没有首先发送原因码为0x00(正常断开连接)的DISCONNECT数据报文,并且该连接有一个Will消息,则将发布Will消息。

服务器在发送原因代码小于0x80的CONNACK之前,不得发送DISCONNECT 报文。

固定报头

在这里插入图片描述

服务端必须验证所有的保留位都被设置为0,如果它们不为0,在MQTT3.1.1中则必须断开连接,在MQTT5中,需要发送包含原因码为0x81(无效报文)的DISCONNECT报文。

剩余长度字段
等于可变报头的长度,编码为变长字节整数

DISCONNECT可变报头(MQTT 5)

MQTT3.1.1 DISCONNECT报文没有可变报头

DISCONNECT报文的可变报头按顺序包含以下字段:断开原因码,属性(Properties)。

断开原因码

可变报头的第1个字节是断开原因码。如果剩余长度小于1,则表示使用原因码0x00(正常断开)。

单字节无符号断开原因码字段如下所示。

断开原因码

在这里插入图片描述

客户端或服务端发送DISCONNECT报文时必须使用一种DISCONNECT原因码。如果原因码为0x00(正常断开)且没有属性,原因码和属性长度可以被省略。这种情况下DISCONNECT报文剩余长度为0。

DISCONNECT报文用于指示断开的原因,例如没有确认报文(比如QoS等级0的发布消息)或当客户端或服务端不能继续处理连接。

客户端可以使用这些信息来决定是否重新连接,以及在重新尝试之前应该等待多长时间。

DISCONNECT属性(MQTT5)
属性长度

DISCONNECT报文可变报头中的属性(Properties)的长度被编码为变长字节整数。如果剩余长度小于2,属性长度使用0。

会话过期间隔

17 (0x11)Byte,会话过期间隔(Session Expiry Interval)标识符。
跟随其后的是用四字节整数表示的以秒为单位的会话过期间隔(Session Expiry Interval)。包含多个会话2224 过期间隔将造成协议错误(Protocol Error)。

如果没有设置会话过期间隔,则使用CONNECT报文中的会话过期间隔。

会话过期间隔不能由服务端的DISCONNECT报文发送。

如果CONNECT报文中的会话过期间隔为0,则客户端在DISCONNECT报文中设置非0会话过期间隔将造成协议错误(Protocol Error)。如果服务端收到这种非0会话过期间隔,则不会将其视为有效的DISCONNECT报文。服务端使用包含原因码为0x82(协议错误)的DISCONNECT报文。

原因字符串

31 (0x1F)Byte,原因字符串(Reason String)标识符。
跟随其后的是UTF-8编码字符串表示断开原因。此原因字符串是为诊断而设计的可读字符串,不应该被接收端所解析。

如果此属性使得DISCONNECT报文的长度超出了接收端指定的最大报文长度,则发送端不能发送此属性 。包含多个原因字符串将造成协议错误(Protocol Error)。

用户属性

38 (0x26)Byte,用户属性(User Property)标识符。

跟随其后的是UTF-8字符串键值对。

此属性可用于向客户端提供包括诊断信息在内的附加信息。如果加上用户属性之后的DISCONNECT报文长度超出了接收端指定的最大报文长度,则发送端不能发送此属性 。用户属性允许出现多次,以表示多个名字/值对,且相同的名字可以多次出现。

服务端参考

28 (0x1C)Byte,服务端参考列表(Server Reference)标识符。

跟随其后的是一个UTF-8编码字符串,客户端可以使用它来识别其他要使用的服务端。包含多个服务端参考将造成协议错误(Protocol Error)。

服务端发送包含一个服务端参考和原因码0x9C(使用其他服务端)或0x9D(服务端已移动)的DISCONNECT报文。

DISCONNECT报文可变报头非规范示例

在这里插入图片描述

有效载荷

DISCONNECT报文没有有效载荷。

DISCONNECT行为

客户端发送DISCONNECT报文之后:

  • 必须关闭网络连接 。
  • 不能通过那个网络连接再发送任何控制报文。

服务端在收到DISCONNECT报文时:

MQTT5则为当服务端接收到包含原因码为0x00(成功)的DISCONNECT时,才:

  • 必须丢弃任何与当前连接关联的未发布的遗嘱消息,而不发布它

  • 【MQTT3.1.1】如果客户端尚未关闭网络连接,则应关闭网络连接。

  • 【MQTT5】接收到DISCONNECT报文时,接收端应该关闭网络连接

更多推荐