这篇文章来分析一下 SUBSCRIBE 相关报文,客户端向服务端发送 SUBSCRIBE 报文用于创建一个或多个订阅。每个订阅注册客户端关心的一个或多个 主题。为了将应用消息转发给与那些订阅匹配的主题,服务端发送 PUBLISH 报文给客户端。SUBSCRIBE 报文也(为每个订阅)指定了最大的 QoS 等级,服务端根据这个发送应用消息给客户端。
SUBSCRIBE 报文
固定头部
下面先看一下 SUBSCRIBE 报文的固定报头,和其他报文一样,包括报文类型,保留位已经剩余长度,如下图
值得注意的是,SUBSCRIBE 控制报固定报头的第 3,2,1,0 位是保留位,必须分别设置为 0,0,1,0。服务端必须将其它的任 何值都当做是不合法的并关闭网络连接。
可变报头
可变报头包含客户端标识符, 下图展示了一个报文标识符等于 10 的可变报头:
有效载荷
SUBSCRIBE 报文的有效载荷包含了一个主题过滤器列表,它们表示客户端想要订阅的主题。SUBSCRIBE 报文有效载荷中的主题过滤器列表必须是 UTF-8 字符串 。
每一个过滤器后面跟着一个字节,这个字节被叫做 服 务质量要求(Requested QoS)。它给出了服务端向客户端发送应用消息所允许的最大 QoS 等级。
SUBSCRIBE 报文的有效载荷必须包含至少一对主题过滤器 和 QoS 等级字段组合。没有有效载荷的 SUBSCRIBE 报文是违反协议的。
下面举一个例子,假设客户端发送的 SUBSCRIBE 报文包含两个主题过滤器:a/b
和 c/d
对应的服务质量要求分别为 QoS1 和 QoS2,那么该报文的有效载荷会如下所示:
SUBACK 报文
服务端收到客户端发送的一个 SUBSCRIBE 报文时,必须使用 SUBACK 报文响应 ,SUBACK 报文必须和等待确认的 SUBSCRIBE 报文有相同的报文标识符。
SUBACK 报文包含一个返回码清单,它们指定了 SUBSCRIBE 请求的每个订阅被授予的最大 QoS 等级。
固定报头
可变报头
可变报头包含等待确认的 SUBSCRIBE 报文的报文标识符,客户端通过该报文标识符确定 SUBACK 报文是对哪个报文的响应。可变报头格式如下:
有效载荷
有效载荷包含一个返回码清单。每个返回码对应等待确认的 SUBSCRIBE 报文中的一个主题过滤器。返回码的顺序必须和 SUBSCRIBE 报文中主题过滤器的顺序相同。
允许的返回码值:
0x00 - 成功 – 最大 QoS 0
0x01 - 成功 – 最大 QoS 1
0x02 - 成功 – 最大 QoS 2
0x80 - Failure 失败
除此之外的 SUBACK 返回码是保留的,不能使用。
UNSUBSCRIBE 报文
客户端发送 UNSUBSCRIBE 报文给服务端,用于取消订阅主题。
固定报头
UNSUBSCRIBE 报文固定报头的第 3,2,1,0 位是保留位且必须分别设置为 0,0,1,0。服务端必须认为任何其 它的值都是不合法的并关闭网络连接 。
可变报头
可变报头包含一个报文标识符。
有效载荷
UNSUBSCRIBE 报文的有效载荷包含客户端想要取消订阅的主题过滤器列表。UNSUBSCRIBE 报文中的 主题过滤器必须是连续打包的 UTF-8 编码字符串。
UNSUBSCRIBE 报文的有效载荷必须至少包含一个消息过滤器。没有有效载荷的 UNSUBSCRIBE 报文是违反协议的。
下面还是举个例子,客户端发送取消订阅 a/b
和 c/d
订阅主题,有效负载部分会如下所示:
UNSUBACK 报文
服务端必须发送 UNSUBACK 报文响应客户端的 UNSUBSCRIBE 请求。UNSUBACK 报文必须包含和 NSUBSCRIBE 报文相同的报文标识符。即使没有删除任何主题订阅,服务端也必须发 送一个 SUBACK 响应。
固定头部
剩余长度表示可变报头的长度,对 UNSUBACK 报文这个值等于 2。
可变报头
可变报头包含等待确认的 UNSUBSCRIBE 报文的报文标识符。
有效荷载
UNSUBACK 报文没有有效载荷。