当前位置: 首页 > article >正文

【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


http://www.kler.cn/a/533723.html

相关文章:

  • 控件【QT】
  • MySQL表的CURD
  • pthread_cond_timedwait的概念和使用案例
  • LabVIEW涡轮诊断系统
  • 鼠标拖尾特效
  • 为AI聊天工具添加一个知识系统 之85 详细设计之26 批流一体式 与数据提取器
  • MySQL表的CURD
  • Java 2024年面试总结(持续更新)
  • 侯捷 C++ 课程学习笔记:深入理解 C++ 核心技术与实战应用
  • matlab小波交叉功率谱分析源代码
  • Day36【AI思考】-表达式知识体系总览
  • P5251 [LnOI2019] 第二代图灵机 Solution
  • 防御保护作业1
  • 19.[前端开发]Day19-王者荣项目耀实战(二)
  • 【缴纳过路费——并查集】
  • 嵌入式经典面试题之操作系统(二)
  • 【Block总结】DASI,多维特征融合
  • 人工智能DeepSeek培训讲师叶梓AI大模型DeepSeek基础培训提纲
  • 【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)
  • ce修改器lua加载错误是怎么回事
  • 程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<5>
  • 优化fm.jiecao.jcvideoplayer_lib中视频横竖屏自动适配原视频方案
  • Macos给brew安装的neo4j配置apoc插件
  • R 语言植沟文件读取及保存方式
  • ubuntu重启网络服务
  • 手动计算conv1d 及pytorch源码