【MQTT协议 03】 抓包分析

news2025/2/6 12:20:41

一、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.coloradmin.cn/o/2293777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机上运行AI大模型(Deepseek等)

最近deepseek的大火,让大家掀起新一波的本地部署运行大模型的热潮,特别是deepseek有蒸馏的小参数量版本,电脑上就相当方便了,直接ollamaopen-webui这种类似的组合就可以轻松地实现,只要硬件,如显存&#xf…

电商项目-分布式事务(四)基于消息队列实现分布式事务

基于消息队列实现分布式事务,实现消息最终一致性 如何基于消息队列实现分布式事务? 通过消息队列实现分布式事务的话,可以保证当前数据的最终一致性。实现思路:将大的分布式事务,进行拆分,拆分成若干个小…

leetcode_双指针 160.相交链表

160.相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 思路: 本题中,交点不是数值相等,而是指针相等 双指针遍历两遍后必定相遇&#xff0c…

深入理解浮点数:单精度、双精度、半精度和BFloat16详解

文章目录 深入理解浮点数:单精度、双精度、半精度和BFloat16详解 🔢简介 🌟1. 单精度(Single Precision)🎯应用场景 🚀 2. 双精度(Double Precision)💪应用场…

Verilog基础(三):过程

过程(Procedures) - Always块 – 组合逻辑 (Always blocks – Combinational) 由于数字电路是由电线相连的逻辑门组成的,所以任何电路都可以表示为模块和赋值语句的某种组合. 然而,有时这不是描述电路最方便的方法. 两种always block是十分有用的: 组合逻辑: always @(…

拍照对比,X70 PRO与X90 PRO+的细节差异

以下是局部截图(上X70P下X90PP) 对比1 这里看不出差异。 对比2 X90PP的字明显更清楚。 对比3 中下的字,X90PP显然更清楚。

Node.js与嵌入式开发:打破界限的创新结合

文章目录 一、Node.js的本质与核心优势1.1 什么是Node.js?1.2 嵌入式开发的范式转变二、Node.js与嵌入式结合的四大技术路径2.1 硬件交互层2.2 物联网协议栈2.3 边缘计算架构2.4 轻量化运行时方案三、实战案例:智能农业监测系统3.1 硬件配置3.2 软件架构3.3 核心代码片段四、…

使用java调用deepseek,调用大模型,处理问题。ollama

废话不多&#xff0c;直接上代码 Testpublic void test7171111231233(){// url:放请求地址String url "http://localhost:11434/api/generate";HttpRequest request HttpUtil.createPost(url);Map<String, String> headers new HashMap<>();String a…

Linux驱动---字符设备

目录 一、基础简介 1.1、Linux设备驱动分类 1.2、字符设备驱动概念 二、驱动基本构成 2.1、驱动模块的加载和卸载 2.2、添加LICENNSE以及其他信息 三、字符设备驱动开发步骤 3.1、分配主次设备号 3.1.1 主次设备号 3.1.2静态注册设备号 3.1.3动态注册设备号 3.1.4释…

php7.3安装php7.3-gmp扩展踩坑总结

环境&#xff1a; 容器里面为php7.3.3版本 服务器也为php7.3.3-14版本&#xff0c;但是因为业务量太大需要在服务器里面跑脚本 容器里面为 alpine 系统&#xff0c;安装各种扩展 服务器里面开发服为 ubuntu 16.04.7 LTS (Xenial Xerus) 系统 服务器线上为 ubuntu 20.04.6 LTS (…

javaEE-8.JVM(八股文系列)

目录 一.简介 二.JVM中的内存划分 JVM的内存划分图: 堆区:​编辑 栈区:​编辑 程序计数器&#xff1a;​编辑 元数据区&#xff1a;​编辑 经典笔试题&#xff1a; 三,JVM的类加载机制 1.加载: 2.验证: 3.准备: 4.解析: 5.初始化: 双亲委派模型 概念: JVM的类加…

大语言模型轻量化:知识蒸馏的范式迁移与工程实践

大语言模型轻量化&#xff1a;知识蒸馏的范式迁移与工程实践 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 摘要 在大型语言模型&#xff…

数据结构:时间复杂度

文章目录 为什么需要时间复杂度分析&#xff1f;一、大O表示法&#xff1a;复杂度的语言1.1 什么是大O&#xff1f;1.2 常见复杂度速查表 二、实战分析&#xff1a;解剖C语言代码2.1 循环结构的三重境界单层循环&#xff1a;线性时间双重循环&#xff1a;平方时间动态边界循环&…

[创业之路-276]:从燃油汽车到智能汽车:工业革命下的价值变迁

目录 前言&#xff1a; 从燃油汽车到智能汽车&#xff1a;工业革命下的价值变迁 前言&#xff1a; 燃油汽车&#xff0c;第一次、第二次工业革命&#xff0c;机械化、电气化时代的产物&#xff0c;以机械和电气自动化为核心价值。 智能汽车&#xff0c;第三次、第四次工业革…

vue页面和 iframe多页面无刷新方案和并行 并接入 micro 微前端部分思路

前: 新进了一家公司,公司是做电商平台的, 用的系统竟然还是jsp的网站,每次修改页面还需要我下载idea代码,作为一个前端, 这可不能忍,于是向上申请,意思你们后台做的太辣鸡,我要重做,经领导层商议从去年6月开始到今年12月把系统给重构了 公司系统采用的是每个jsp页面都是一个ifr…

Python 自学秘籍:开启编程之旅,人生苦短,我用python。

从2009年&#xff0c;用了几次python后就放弃了&#xff0c;一直用的php&#xff0c;现在人工智能时代&#xff0c;完全没php什么事情。必须搞python了&#xff0c;虽然已经40多岁了。死磕python了。让滔滔陪着你一起学python 吧。 开启新世界 在当今人工智能化的时代&#xff…

每日一题洛谷P5721 【深基4.例6】数字直角三角形c++

#include<iostream> using namespace std; int main() {int n;cin >> n;int t 1;for (int i 0; i < n; i) {for (int j 0; j < n - i; j) {printf("%02d",t);t;}cout << endl;}return 0; }

解决DeepSeek服务器繁忙问题:本地部署与优化方案

deepseek服务器崩了&#xff0c;手把手教你如何在手机端部署一个VIP通道&#xff01; 引言 随着人工智能技术的快速发展&#xff0c;DeepSeek等大语言模型的应用越来越广泛。然而&#xff0c;许多用户在使用过程中遇到了服务器繁忙、响应缓慢等问题。本文将探讨如何通过本地部…

【后端开发】系统设计101——通信协议,数据库与缓存,架构模式,微服务架构,支付系统(36张图详解)

【后端开发】系统设计101——通信协议&#xff0c;数据库与缓存&#xff0c;架构模式&#xff0c;微服务架构&#xff0c;支付系统&#xff08;36张图&#xff09; 文章目录 1、通信协议通信协议REST API 对比 GraphQL&#xff08;前端-web服务&#xff09;grpc如何工作&#x…

Java基础——分层解耦——IOC和DI入门

目录 三层架构 Controller Service Dao ​编辑 调用过程 面向接口编程 分层解耦 耦合 内聚 软件设计原则 控制反转 依赖注入 Bean对象 如何将类产生的对象交给IOC容器管理&#xff1f; 容器怎样才能提供依赖的bean对象呢&#xff1f; 三层架构 Controller 控制…