每条 WebSphere MQ 遥感传输方式 命令消息的消息头包含固定头。下表显示固定头格式。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字节 1 | 消息类型 | DUP 标志 | QoS 级别 | RETAIN | ||||
字节 2 | 剩余长度 |
包括“消息类型”和“标志”(Dup、QoS 级别和 RETAIN)字段。
(至少一个字节)包含“剩余长度”字段。
在以下部分中描述了这些字段。所有数据值都按大尾数法的顺序:高顺序字节在低顺序字节前。16 位字在线上显示为“最重要的字节”(MSB),后面是“最不重要的字节”(LSB)。
显示为 4 位无符号值。下表中显示了此协议版本的枚举。
助记符 | 枚举 | 描述 |
---|---|---|
保留 | 0 | 保留 |
CONNECT | 1 | 连接到代理的客户机请求 |
CONNACK | 2 | 连接确认 |
PUBLISH | 3 | 发布消息 |
PUBACK | 4 | 发布确认 |
PUBREC | 5 | 发布接收(有保证的发送部分 1) |
PUBREL | 6 | 发布发行版(有保证的发送部件 2) |
PUBCOMP | 7 | 发布完成(有保证的发送部分 3) |
SUBSCRIBE | 8 | 客户机预订请求 |
SUBACK | 9 | 预订确认 |
UNSUBSCRIBE | 10 | 客户机取消预订请求 |
UNSUBACK | 11 | 取消预订确认 |
PINGREQ | 12 | PING 请求 |
PINGRESP | 13 | PING 响应 |
DISCONNECT | 14 | 客户机正在断开连接 |
保留 | 15 | 保留 |
字节 1 的剩余各位包含 DUP、QoS 和 RETAIN 字段。如下表所示,对位位置进行了编码来表示各标志。
位位置 | 名称 | 描述 |
---|---|---|
3 | DUP | 重复发送 |
2-1 | QoS | 服务质量 |
0 | RETAIN | RETAIN 标志 |
位置:字节 1,位 3。
当客户机或代理尝试重新发送“发布”消息时设置此标志。此标志适用于 QoS 值大于零(0),且必需确认的消息。当设置 DUP 位时,可变头包含一个消息标识。
位置:字节 1,位 2-1。
此标志表明发送“发布”消息的确认级别。下表中显示了 QoS 级别。
QoS 值 | 位 2 | 位 1 | 描述 | ||
---|---|---|---|---|---|
0 | 0 | 0 | 最多一次 | 发送/忽略消息 | <=1 |
1 | 0 | 1 | 至少一次 | 确认传递 | >=1 |
2 | 1 | 0 | 仅一次 | 确实传递 | =1 |
3 | 1 | 1 | 保留 |
位置:字节 1,位 0。
设置时,Retain 标志表明代理保留消息,并作为初始消息发送到预订本主题 的新订户。这表示连接到代理的新客户机可以快速建立当前的主题数。当发布程序以“报告异常”为基础发送消息时这很有用,并且它可能有时在新订户接收有关特殊主题的 数据前。数据具有保留或 Last Known Good(LKG)的值。
在 将“预订”消息发送到一个或多个主题后,订户接收到 SUBACK 消息,每个具有保留值的新预订的主题都后跟一条消息。保留值从代理发布到已设置 Retain 标志并具有相同原始发布的 QoS 的订户,并因此以通常的 QoS 传递确保为条件。在消息中将 Retain 标志设置到订户,将它与“ live”数据分辨开,以便订户能适当的处理它。
因为代理可能不再保留先前保留的 PUBLISH 消息,所以不保证订户会收到有关某个主题的初始保留 PUBLISH 消息。
位置:字节 2。
表示当前消息内剩余的字节数,包括可变头和有效内容中的数据。
可变长度编码方案对相当于 127 字节的消息使用单字节。超出此长度的消息按如下所示进行处理。每个字节的 7 位编码剩余长度数据,而第八位表示表示法中的任何以下字节。每个字节编码 128 个值和一个“延续位 ”。例如,编码为 单字节的十进制数 64 用十六进制数来表示是 0x40。而编码为双字节的十进制数 321(=128x2 + 65)是低位在先的。第一个字节是 2+128 = 130。注意,设置顶部位至少表示以 下字节之一。第二个字节是 65。
协议限制最大表示为 4 的字节数。这允许应用程序发送多达 268 435 455(256 MB)的消息。所使用的此数字的表示为:0xFF、0xFF、0xFF、0x7F。
下表显示了通过增加字节数表示的剩余长度值。
数字 | 从 | 到 |
---|---|---|
1 | 0(0x00) | 127(0x7F) |
2 | 128(0x80,0x01) | 16 383 (0xFF, 0x7F) |
3 | 16 384 (0x80, 0x80, 0x01) | 2 097 151 (0xFF, 0xFF, 0x7F) |
4 | 2 097 152 (0x80, 0x80, 0x80, 0x01) | 268 435 455 (0xFF, 0xFF, 0xFF, 0x7F) |
将十进制数(X)编码到可变长度编码方案的算法如下所示:
do digit = X MOD 128 x = X DIV 128 // if there are more digits to encode, set the top bit of this digit if ( X > 0 ) digit = digit OR 0x80 endif 'output' digit while ( X > 0 )
其中 MOD 是取模运算符(C 中的 %)、DIV 是整除(C 中的 /),而 OR 是按位或运算符(C 中的 |)。
编码剩余长度字段的算法如下所示:
multiplier = 1 value = 0 do digit = 'next digit from stream' value += (digit AND 127) * multiplier; multiplier *= 128; while ((digit AND 128) != 0);
其中 AND 是按位与运算符(C 中的 &)。
当此算法终止时,值以字节包含剩余长度。
剩余长度编码不是可变头的一部分。用于编码剩余长度的字节数不包含剩余长度的值。变量长度“扩展字节”是固定头的一部分(而不是可变头)。