0%

【计算机网络】mqtt通信协议入门(八)订阅报文

这篇文章来分析一下 SUBSCRIBE 相关报文,客户端向服务端发送 SUBSCRIBE 报文用于创建一个或多个订阅。每个订阅注册客户端关心的一个或多个 主题。为了将应用消息转发给与那些订阅匹配的主题,服务端发送 PUBLISH 报文给客户端。SUBSCRIBE 报文也(为每个订阅)指定了最大的 QoS 等级,服务端根据这个发送应用消息给客户端。

SUBSCRIBE 报文

固定头部

下面先看一下 SUBSCRIBE 报文的固定报头,和其他报文一样,包括报文类型,保留位已经剩余长度,如下图

image-20240718232959849

值得注意的是,SUBSCRIBE 控制报固定报头的第 3,2,1,0 位是保留位,必须分别设置为 0,0,1,0。服务端必须将其它的任 何值都当做是不合法的并关闭网络连接。

可变报头

可变报头包含客户端标识符, 下图展示了一个报文标识符等于 10 的可变报头:

image-20240718233227688

有效载荷

SUBSCRIBE 报文的有效载荷包含了一个主题过滤器列表,它们表示客户端想要订阅的主题。SUBSCRIBE 报文有效载荷中的主题过滤器列表必须是 UTF-8 字符串 。

每一个过滤器后面跟着一个字节,这个字节被叫做 服 务质量要求(Requested QoS)。它给出了服务端向客户端发送应用消息所允许的最大 QoS 等级。

SUBSCRIBE 报文的有效载荷必须包含至少一对主题过滤器 和 QoS 等级字段组合。没有有效载荷的 SUBSCRIBE 报文是违反协议的。

下面举一个例子,假设客户端发送的 SUBSCRIBE 报文包含两个主题过滤器:a/bc/d 对应的服务质量要求分别为 QoS1 和 QoS2,那么该报文的有效载荷会如下所示:

image-20240718234134808

image-20240718234148176

SUBACK 报文

服务端收到客户端发送的一个 SUBSCRIBE 报文时,必须使用 SUBACK 报文响应 ,SUBACK 报文必须和等待确认的 SUBSCRIBE 报文有相同的报文标识符

SUBACK 报文包含一个返回码清单,它们指定了 SUBSCRIBE 请求的每个订阅被授予的最大 QoS 等级。

固定报头

image-20240718234525012

可变报头

可变报头包含等待确认的 SUBSCRIBE 报文的报文标识符,客户端通过该报文标识符确定 SUBACK 报文是对哪个报文的响应。可变报头格式如下:

image-20240718234738096

有效载荷

有效载荷包含一个返回码清单。每个返回码对应等待确认的 SUBSCRIBE 报文中的一个主题过滤器。返回码的顺序必须和 SUBSCRIBE 报文中主题过滤器的顺序相同。

image-20240718235034217

允许的返回码值:

  • 0x00 - 成功 – 最大 QoS 0

  • 0x01 - 成功 – 最大 QoS 1

  • 0x02 - 成功 – 最大 QoS 2

  • 0x80 - Failure 失败

除此之外的 SUBACK 返回码是保留的,不能使用。

UNSUBSCRIBE 报文

客户端发送 UNSUBSCRIBE 报文给服务端,用于取消订阅主题。

固定报头

image-20240718235356282

UNSUBSCRIBE 报文固定报头的第 3,2,1,0 位是保留位且必须分别设置为 0,0,1,0。服务端必须认为任何其 它的值都是不合法的并关闭网络连接 。

可变报头

可变报头包含一个报文标识符。

image-20240718235437451

有效载荷

UNSUBSCRIBE 报文的有效载荷包含客户端想要取消订阅的主题过滤器列表。UNSUBSCRIBE 报文中的 主题过滤器必须是连续打包的 UTF-8 编码字符串。

UNSUBSCRIBE 报文的有效载荷必须至少包含一个消息过滤器。没有有效载荷的 UNSUBSCRIBE 报文是违反协议的。

下面还是举个例子,客户端发送取消订阅 a/bc/d 订阅主题,有效负载部分会如下所示:

image-20240718235759504

UNSUBACK 报文

服务端必须发送 UNSUBACK 报文响应客户端的 UNSUBSCRIBE 请求。UNSUBACK 报文必须包含和 NSUBSCRIBE 报文相同的报文标识符。即使没有删除任何主题订阅,服务端也必须发 送一个 SUBACK 响应。

固定头部

image-20240719000049441

剩余长度表示可变报头的长度,对 UNSUBACK 报文这个值等于 2。

可变报头

可变报头包含等待确认的 UNSUBSCRIBE 报文的报文标识符。

image-20240719000128591

有效荷载

UNSUBACK 报文没有有效载荷。