MQTT协议中的剩余长度(Remaining Length)是一个重要的概念,它表示当前报文剩余部分的字节数,包括可变报头和负载的数据,但不包括用于编码剩余长度字段本身的字节数。以下是对MQTT剩余长度的详细说明:
一、剩余长度的位置和表示
- 位置:剩余长度从MQTT报文的第二个字节开始表示,即紧跟在固定报头之后。
- 表示:剩余长度使用一个变长度编码方案,根据可变报头和负载数据的实际长度动态变化。它可以是一个字节、两个字节、三个字节或最多四个字节来表示。
二、剩余长度的编码方式
- 单字节编码:对于小于128的剩余长度值,它使用单字节编码。在这个字节中,低7位(bit 0到bit 6)用于编码数据,最高位(bit 7)用作延续位(continuation bit)。如果最高位为0,表示剩余长度就是这一个字节所表示的值;如果最高位为1,则表示后续还有字节用于表示剩余长度。
- 多字节编码:对于大于或等于128的剩余长度值,需要使用多个字节来表示。每个字节的低7位用于编码数据,最高位用作延续位。延续位为1表示后续还有字节,为0则表示这是最后一个字节。
三、剩余长度的取值范围
- 1个字节时:剩余长度的取值范围为0(0x00)到127(0x7F)。
- 2个字节时:剩余长度的取值范围为128(0x80, 0x01)到16383(0xFF, 0x7F)。
- 3个字节时:剩余长度的取值范围为16384(0x80, 0x80, 0x01)到2097151(0xFF, 0xFF, 0x7F)。
- 4个字节时:剩余长度的取值范围为2097152(0x80, 0x80, 0x80, 0x01)到268435455(0xFF, 0xFF, 0xFF, 0x7F)。
四、剩余长度的计算示例
假设一个MQTT报文的剩余长度需要表示300个字节,由于300大于127,因此不能只用一个字节表示。需要使用两个字节来表示,计算过程如下::
- 第一个字节:最高位为1(延续位),低7位表示1(因为300/128=2余44,商为2,二进制
0000 0010
,但因为是延续位,所以实际写入的是1000 0010
,即十六进制的0x82)。 - 第二个字节:表示余数44,即二进制
0010 1100
,十六进制为0x2C。