1、剩余长度总结
如下图,MQTT固定协议头中,从第二字节开始是剩余长度。
1)剩余长度表示哪部分的长度:可变报头(如果有)+ 有效载荷区域(如果有);
2)剩余长度用那几个字节表示:从第二个字节开始,最多4个字节,它是变长的;
3)剩余长度如何实现变长:
剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码;
而对于更大的数值则按下面的方式处理:每个字节的低7位用于编码数据长度,最高位(bit7)用于标识剩余长度字段是否有更多的字节,且按照大端模式进行编码,因此每个字节可以编码128个数值和一个延续位,剩余长度字段最大可拥有4个字节。
例如:两个字节最为表示为0xFF、0x7F,换算方法为:高字节0xFF中最高位(bit7)为标志位,去掉后为0x7F,低字节最大为0x7F,即0~0x7F共128个数,计算方法0x7F*128+0x7f=16383。
通用的计算公式为:(高字节-0x80)*128+低字节
4)剩余长度最大可以是多大:
剩余长度字段使用一个变长度编码方案,且按照大端模式进行编码
当使用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)。
理论上可以发送最大256M的报文
最大值计算:268435455 = (0xFF-0x80)128128*128+ (0xFF-0x80)128128+ (0xFF-0x80)*128+127
通用的计算公式为:
2个字节:(Byte1-0x80)*128 + Byte0
3个字节:(Byte2-0x80)128128 + (Byte1-0x80)128 + Byte0
4个字节:(Byte3-0x80)128128128 + (Byte2-0x80)128128 + (Byte1-0x80)*128 + Byte0
2、抓包分析
2.1 过滤出mqtt
2.2 Connect命令抓取
2.3 Publish命令抓取
对应:PUBLISH-发布消息