【MQTT协议 03】 抓包分析
一、MQTT测试工具
1、mqtt服务器 emqx
2、mqtt 客户端 mqttx
3、抓包工具 wireshark
搭建参考
【MQTT 协议 01】MQTT 服务器搭建_mqtt服务器搭建-CSDN博客
二、报文测试
2.1、CONNECT (客户端连接)
2.1.1、抓包
2.1.2、解析
#16进制表示
103000044d51545405c2003c051100000000000e6d717474785f376238313731393400066e767231323300066e7672313233
#固定报头(剩余长度48个字节)
10 30
#可变报头(0004 表示协议名称长度为4个字节 MQTT,版本5,标志字节C2,心跳60s,属性5个字节)
00 04 4d 51 54 54 05 c2 00 3c 05 11 00 00 00 00
#余下为有效载荷字段
#客户端标识符(000e 表示长度为14个字节,文本内容为“mqttx_7b817194”)
00 0e 6d 71 74 74 78 5f 37 62 38 31 37 31 39 34
#遗嘱主题、遗嘱消息没启用,所以没有
#用户名(0006 示长度为6个字节,文本内容为“nvr123”)
00 06 6e 76 72 31 32 33
#密码(0006 表示长度为6个字节,文本内容为“nvr123”)
00 06 6e 76 72 31 32 33
2.2、CONACK (服务端应答)
2.2.1、抓包
2.2.2、解析
#16进制表示
2013000010270010000025012a01290122ffff2801
#固定报文(剩余长度19个字节,连接确认标志00,返回码00)
20 13 00 00
#属性
10: 总长
27: ID maximum packet size
00 10 00 00: value
25 :ID retain available
01: value
2a: ID shared subscription available
01: value
29: ID subscription identifier available
01: value
22: ID topic alias maximum
ff ff: value
28: ID wildcard subsciption available
01: value
2.3、SUBSCRIBE (客户端订阅主题)
2.3.1、订阅主题topic1 Qos 0
2.3.1.1、抓包
2.3.1.2、解析
#16进制表示
820ce453000006746f7069633100
#固定报头(剩余长度12个字节)
82 0C
#可变报头(报文标识符为58451)
e4 53
#有效载荷(长度为6个字节,主题为“topic1”,Qos为0)
00 属性 总长
00 06 74 6f 70 69 63 31 00
2.3.2、订阅主题 topic2 Qos 1
2.3.2.1、抓包
2.3.2.2、解析
#16进制表示
820ce454000006746f7069633201
#固定报头(剩余长度12个字节)
82 0C
#可变报头(报文标识符为58452)
e4 54
#有效载荷(长度为6个字节,主题为“topic2”,Qos为1)
00 属性 总长
00 06 74 6f 70 69 63 32 01
2.3.3、订阅主题 topic3 Qos 2
2.3.3.1、抓包
2.3.3.2、解析
#16进制表示
820ce455000006746f7069633302
#固定报头(剩余长度12个字节)
82 0C
#可变报头(报文标识符为58453)
e4 55
#有效载荷(长度为6个字节,主题为“topic3”,Qos为2)
00 属性 总长
00 06 74 6f 70 69 63 33 02
2.4、SUBCK (服务端应答主题)
2.4.1、应答topic1 Qos 0
2.4.1.1、抓包
2.4.1.2、解析
#16进制表示
9004e4530000
#固定报头(剩余长度4个字节)
90 04
#可变报头(报文标识符为58451)
e4 53
#有效载荷(对应订阅的topic1的qos 0)
00 属性 总长
00 返回码:授予QoS 0
2.4.2、 应答topic2 Qos 1
2.4.2.1、抓包
2.4.2.2、解析
#16进制表示
9004e4540001
#固定报头(剩余长度4个字节)
90 04
#可变报头(报文标识符为58452)
e4 54
#有效载荷(对应订阅的topic2的qos 1)
00 属性 总长
01 返回码:授予QoS 1
2.4.3、应答 topic3 Qos 2
2.4.3.1、抓包
2.4.3.2、解析
#16进制表示
9004e4550002
#固定报头(剩余长度4个字节)
90 04
#可变报头(报文标识符为58453)
e4 55
#有效载荷(对应订阅的topic3的qos 2)
00 属性 总长
02 返回码:授予QoS 2
2.5、PINGREQ (客户端发送心跳包)
2.5.1、抓包
2.5.2、解析
#16进制表示
C0 00
2.6、PINGRESP (服务端应答心跳包)
2.6.1、抓包
2.6.2、解析
#16进制表示
D0 00
2.7、PUBLISH (发布信息)
2.7.1、发布主题topic1 Qos 0
2.7.1.1、抓包
2.7.1.2、解析
#16进制表示
301e0006746f7069633100746f7069633120516f7320302072657461696e2030
#固定报头(qos=0消息,非重传、非保留,剩余长度30个字节)
30 1e
#可变报头(6个字节的主题“topic1”,无报文标识符)
00 06 74 6f 70 69 63 31
#有效载荷(信息 topic1 Qos 0 retain 0)
00 属性 总长
74 6f 70 69 63 31 20 51 6f 73 20 30 20 72 65 74 61 69 6e 20 30
2.7.2、发布主题topic2 Qos 0
2.7.2.1、抓包
2.7.2.2、解析
#16进制表示
301e0006746f7069633200746f7069633220516f7320302072657461696e2030
#固定报头(qos=0消息,非重传、非保留,剩余长度30个字节)
30 1e
#可变报头(6个字节的主题“topic2”,无报文标识符)
00 06 74 6f 70 69 63 32
#有效载荷(信息 topic2 Qos 0 retain 0)
00 属性 总长
74 6f 70 69 63 32 20 51 6f 73 20 30 20 72 65 74 61 69 6e 20 30
2.7.3、发布主题topic3 Qos 0
2.7.3.1、抓包
2.7.3.2、解析
#16进制表示
301e0006746f7069633300746f7069633320516f7320302072657461696e2030
#固定报头(qos=0消息,非重传、非保留,剩余长度30个字节)
30 1e
#可变报头(6个字节的主题“topic3”,无报文标识符)
00 06 74 6f 70 69 63 33
#有效载荷(信息 topic3 Qos 0 retain 0)
00 属性 总长
74 6f 70 69 63 33 20 51 6f 73 20 30 20 72 65 74 61 69 6e 20 30
2.7.4、发布主题topic1 Qos 1
2.7.4.1、发布抓包
2.7.4.2、发布解析
#16进制表示
32200006746f70696331e45600746f7069633120516f7320312072657461696e2030
#固定报头(qos=1消息,非重传、非保留,剩余长度32个字节)
32 20
#可变报头(6个字节的主题“topic1”,标识符(e4 56)58454)
00 06 74 6f 70 69 63 31 e4 56
#有效载荷(信息 topic1 Qos 1 retain 0)
00 属性 总长
74 6f 70 69 63 31 20 51 6f 73 20 31 20 72 65 74 61 69 6e 20 30
2.7.4.3、PUBACK应答抓包
2.7.4.4、PUBACK应答解析
#16进制表示
4004e4560000
#固定报头(剩余长度2个字节)
40 04
#可变报头(报文标识符为58454)
e4 56
#有效载荷
00 Reason Code: Success (0)
00 属性 总长
2.7.5、发布主题topic2 Qos 1
2.7.5.1、发布抓包
2.7.5.2、发布解析
#16进制表示
32200006746f70696332e45700746f7069633220516f7320312072657461696e2030
#固定报头(qos=1消息,非重传、非保留,剩余长度32个字节)
32 20
#可变报头(6个字节的主题“topic2”,标识符(e4 57)58455)
00 06 74 6f 70 69 63 32 e4 57
#有效载荷(信息 topic2 Qos 1 retain 0)
00 属性 总长
74 6f 70 69 63 32 20 51 6f 73 20 31 20 72 65 74 61 69 6e 20 30
2.7.5.3、PUBACK应答抓包
2.7.5.4、PUBACK应答解析
#16进制表示
4004e4560000
#固定报头(剩余长度2个字节)
40 04
#可变报头(报文标识符为58455)
e4 57
#有效载荷
00 Reason Code: Success (0)
00 属性 总长
2.7.6、发布主题 topic3 Qos 1
2.7.6.1、发布抓包
2.7.6.2、发布解析
#16进制表示
32200006746f70696333e45800746f7069633320516f7320312072657461696e2030
#固定报头(qos=1消息,非重传、非保留,剩余长度32个字节)
32 20
#可变报头(6个字节的主题“topic3”,标识符(e4 58)58456)
00 06 74 6f 70 69 63 33 e4 58
#有效载荷(信息 topic3 Qos 1 retain 0)
00 属性 总长
74 6f 70 69 63 33 20 51 6f 73 20 31 20 72 65 74 61 69 6e 20 30
2.7.6.3、PUBACK应答抓包
2.7.6.4、PUBACK应答解析
#16进制表示
4004e4580000
#固定报头(剩余长度2个字节)
40 04
#可变报头(报文标识符为58456)
e4 58
#有效载荷
00 Reason Code: Success (0)
00 属性 总长
2.7.7、发布主题topic1 Qos 2
2.7.7.1、发布抓包
2.7.7.2、发布解析
#16进制表示
34200006746f70696331e45900746f7069633120516f7320322072657461696e2030
#固定报头(qos=2消息,非重传、非保留,剩余长度32个字节)
34 20
#可变报头(6个字节的主题“topic1”,标识符(e4 59)58457)
00 06 74 6f 70 69 63 31 e4 59
#有效载荷(信息 topic1 Qos 2 retain 0)
00 属性 总长
74 6f 70 69 63 31 20 51 6f 73 20 32 20 72 65 74 61 69 6e 20 30
2.7.7.3、PUBREC(收到)
2.7.7.3.1、抓包
2.7.7.3.2、解析
#16进制表示
5004e4590000
#固定报头(剩余长度2个字节)
50 04
#可变报头(报文标识符为58457)
e4 59
#有效载荷
00 Reason Code: Success (0)
00 属性 总长
2.7.7.4、PUBREL(释放)
2.7.7.4.1、抓包
2.7.7.4.2、解析
#16进制表示
6203e45900
#固定报头(剩余长度3个字节)
62 03
#可变报头(报文标识符为58457)
e4 59
#有效载荷
00 Reason Code: Success (0)
2.7.7.5、PUBCOMP(完成)
2.7.7.5.1、抓包
2.7.7.5.2、解析
#16进制表示
7004e4590000
#固定报头(剩余长度4个字节)
70 04
#可变报头(报文标识符为58457)
e4 59
#有效载荷
00 Reason Code: Success (0)
00 属性总长
2.7.8、发布主题topic2 Qos 2
2.7.8.1、发布抓包
2.7.8.2、发布解析
#16进制表示
34200006746f70696332e45a00746f7069633220516f7320322072657461696e2030
#固定报头(qos=2消息,非重传、非保留,剩余长度32个字节)
34 20
#可变报头(6个字节的主题“topic2”,标识符(e4 5a)58458)
00 06 74 6f 70 69 63 32 e4 5a
#有效载荷(信息 topic2 Qos 2 retain 0)
00 属性 总长
74 6f 70 69 63 32 20 51 6f 73 20 32 20 72 65 74 61 69 6e 20 30
2.7.8.3、PUBREC(收到)
2.7.8.3.1、抓包
2.7.8.3.2、解析
#16进制表示
5004e45a0000
#固定报头(剩余长度2个字节)
50 04
#可变报头(报文标识符为58458)
e4 5a
#有效载荷
00 Reason Code: Success (0)
00 属性 总长
2.7.8.4、PUBREL(释放)
2.7.8.4.1、抓包
2.7.8.4.2、解析
#16进制表示
6203e45a00
#固定报头(剩余长度3个字节)
62 03
#可变报头(报文标识符为58458)
e4 5a
#有效载荷
00 Reason Code: Success (0)
2.7.8.5、PUBCOMP(完成)
2.7.8.5.1、抓包
2.7.8.5.2、解析
#16进制表示
7004e45a0000
#固定报头(剩余长度4个字节)
70 04
#可变报头(报文标识符为58458)
e4 5a
#有效载荷
00 Reason Code: Success (0)
00 属性总长
2.7.9、发布主题topic3 Qos 2
2.7.9.1、发布抓包
2.7.9.2、发布解析
#16进制表示
34200006746f70696333e45b00746f7069633320516f7320322072657461696e2030
#固定报头(qos=2消息,非重传、非保留,剩余长度32个字节)
34 20
#可变报头(6个字节的主题“topic3”,标识符(e4 5b)58459)
00 06 74 6f 70 69 63 33 e4 5b
#有效载荷(信息 topic3 Qos 2 retain 0)
00 属性 总长
74 6f 70 69 63 33 20 51 6f 73 20 32 20 72 65 74 61 69 6e 20 30
2.7.9.3、PUBREC(收到)
2.7.9.3.1、抓包
2.7.9.3.2、解析
#16进制表示
5004e45b0000
#固定报头(剩余长度2个字节)
50 04
#可变报头(报文标识符为58459)
e4 5b
#有效载荷
00 Reason Code: Success (0)
00 属性 总长
2.7.9.4、PUBREL(释放)
2.7.9.4.1、抓包
2.7.9.4.2、解析
#16进制表示
6203e45b00
#固定报头(剩余长度3个字节)
62 03
#可变报头(报文标识符为58459)
e4 5b
#有效载荷
00 Reason Code: Success (0)
2.7.9.5、PUBCOMP(完成)
2.7.9.5.1、抓包
2.7.9.5.2、解析
#16进制表示
7004e45b0000
#固定报头(剩余长度4个字节)
70 04
#可变报头(报文标识符为58459)
e4 5b
#有效载荷
00 Reason Code: Success (0)
00 属性总长
2.7.10、发布(报文标志位,RETAIN=1)
发布 报文标志位RETAIN=1的主题,跟不上面测试的结果相同,不同点在固定头的第一个字节的第0位 保留位置为1。
2.8、UNSUBSCRIBE (取消订阅)
2.8.1、抓包
2.8.2、解析
#16进制表示
a20be462000006746f70696333
#固定报头(剩余长度11个字节)
a2 0b
#可变报头(报文标识符为58466)
e4 62
#有效载荷(长度为9个字节,主题长度为6,主题为“topic3”)
00 属性 总长
00 06 74 6f 70 69 63 33
其他两个主题topic2、topic1 取消一样
2.9、UNSUBCK (取消订阅应答)
2.9.1 、抓包
2.9.2、 解析
#16进制表示
b004e4620000
#固定报头(剩余长度4个字节)
b0 04
#可变报头(报文标识符为58466)
e4 62
#有效载荷
00 属性总长
00 Reason Code: Success (0)
2.10、DISCONNECT (断开连接)
2.10.1、抓包
2.10.2、解析
#16进制表示
e0020000
#固定头
e0 02
有效载荷
00 Reason Code: Normal disconnection (0)
00 属性 总长
三、总结
1、发布Qos = 0 的主题,服务端不应答。
2、发布Qos = 1 的主题,服务端应答PUBACK
3、发布Qos = 2 的主题,服务端应答PUBREC,客户端再发送PUBREL,服务端再回应PUBCOMP,发布一条主题信息,需要四个报文。
4、固定头的第一个字节,报文标志位第0位RETAIN=1,发布主题信息与RETAIN=0流程一致。
抓包文件链接
https://download.csdn.net/download/u011425939/90341178