【MQTT从入门到提高系列 | 09】WireShark抓包分析MQTT报文

这是机器未来的第37篇文章

原文首发地址:https://blog.csdn.net/RobotFutures/article/details/126032312


本文记录如何使用WireShark来抓取MQTT报文,分析报文并于MQTT3.1.1规约印证。

1. 环境配置

详见MQTT从入门到提高(一):从0到1快速搭建MQTT测试环境

2. 启动Wireshark监听

  • 启动后,点击【捕获选项】按钮,如图1,然后点击回环网卡【BSD loopback】,如图2,然后点击【开始】按钮,如图3

    注意:本测试Broker与客户端均运行于本地,因此捕获网卡为本地回环网卡。配置可根据实际情况使用响应网卡。

在这里插入图片描述

  • 启动后,输入过滤规则【tcp.port == 1883】,注意大小写敏感,1883是MQTT Broker无加密时的监听端口
    在这里插入图片描述

3. 启动Mqtt broker

启动【terminal】终端命令行工具,输入

 mosquitto.exe -v

输出如下:

PS C:\Users\25267> mosquitto.exe -v
1648199085: mosquitto version 2.0.14 starting
1648199085: Using default config.
1648199085: Starting in local only mode. Connections will only be possible from clients running on this machine.
1648199085: Create a configuration file which defines a listener to allow remote access.
1648199085: For more details see https://mosquitto.org/documentation/authentication-methods/
1648199085: Opening ipv4 listen socket on port 1883.
1648199085: Opening ipv6 listen socket on port 1883.
1648199085: mosquitto version 2.0.14 running

4. 订阅主题sensors/temperature

4.1 启动订阅

  • 新开一个终端输入
mosquitto_sub.exe -t sensors/temperature -q 1
  • Broker的输出如下:
1648199291: New connection from 127.0.0.1:12245 on port 1883.
1648199291: New client connected from 127.0.0.1:12245 as auto-1744742D-43CA-CFDB-7C5D-19BE38B45F05 (p2, c1, k60).
1648199291: No will message specified.
1648199291: Sending CONNACK to auto-1744742D-43CA-CFDB-7C5D-19BE38B45F05 (0, 0)
1648199291: Received SUBSCRIBE from auto-1744742D-43CA-CFDB-7C5D-19BE38B45F05
1648199291:     sensors/temperature (QoS 1)
1648199291: auto-1744742D-43CA-CFDB-7C5D-19BE38B45F05 1 sensors/temperature
1648199291: Sending SUBACK to auto-1744742D-43CA-CFDB-7C5D-19BE38B45F05

可以看到,有三个MQTT相关的命令:CONNACK、SUBSCRIBE、SUBACK

  • Wireshark监听记录如图:

在这里插入图片描述
可以看到wireshark已经监听到4个MQTT报文:Connect、Connect Ack、Subscribe Request、Subscribe Ack。接下来,依次分析4个报文。

在这里插入图片描述Wireshark工具自带MQTT解析功能,下方是MQTT原始报文,上方是MQTT解析后的数据描述。

4.2 CONNECT报文解析

  • Connect控制报文的协议规约为

在这里插入图片描述

  • 手撕Connect报文
10 0C 00 04 4D 51 54 54 04 02 00 3C 00 00
序号数据描述备注
110Fixed Header, 高4位为报文消息标识符,0x01代表Connect
20CRemaining Length, 剩余长度,不包含长度域本身,包含可变消息头和负载的长度,
0C到0x00的长度正好是12
300 04Protocol Name Length, 协议名称的UTF-8字符串的长度域,MSB在前,LSB在后,其值为4Bytes
44D 51 54 54Protocol Name Value,为ASCII编码,对应的值为MQTT,为协议名称UTF-8字符串的值域
504Protocol Level, 协议级别,值为4,对应MQTT3.1.1的协议版本
602ConnectFlags,连接标志,bit1为1,即CleanSession为1,表示会话为清洁会话,
之前服务器存储的历史会话都不会继承,会创建新的会话。
700 3CKeepAlive, 保活时间,值为60,表示客户端和服务器之间至少60s通讯一次,如果空
闲则发送PINGREQ报文
800 00Client Identifier,客户端标识符,必须存在

4.3 CONNACK报文解析

  • CONNACK报文规约

在这里插入图片描述

  • CONNACK Wireshark解析

在这里插入图片描述

4.4 SUBSCRIBE报文解析

  • SUBSCRIBE报文规约

在这里插入图片描述

  • SUBSCRIBE Wireshark解析

在这里插入图片描述

4.5 SUBACK

  • SUBACK协议规约

在这里插入图片描述

  • SUBACK Wireshark解包分析

在这里插入图片描述
注意:返回码为01,表示成功,其对应的SUB QoS=1.详见【MQTT从入门到提高系列 | 03】一文掌握MQTT3.1.1协议框架 P4.9章节。

5. 启动Broker TLS加密模式

mosquitto.exe -c .\mosquitto.conf -v

Broker输出如下:

PS D:\110_Work_ProductsResearch\111-Router\mosquitto> mosquitto.exe -c .\mosquitto.conf -v
1648202386: mosquitto version 2.0.14 starting
1648202386: Config loaded from .\mosquitto.conf.
1648202386: Opening ipv6 listen socket on port 8883.
1648202386: Opening ipv4 listen socket on port 8883.
1648202386: mosquitto version 2.0.14 running
  • 订阅主题hello
 mosquitto_sub.exe --cafile D:\110_Work_ProductsResearch\111-Router\mosquitto\cert\ca.crt -t hello -h 127.0.0.1 -u demo -P 123456 -v

Broker输出如下:

1648202564: New connection from 127.0.0.1:24723 on port 8883.
1648202564: New client connected from 127.0.0.1:24723 as auto-EEA03522-3A30-0904-F73B-A3854D233BC3 (p2, c1, k60, u'zsm').
1648202564: No will message specified.
1648202564: Sending CONNACK to auto-EEA03522-3A30-0904-F73B-A3854D233BC3 (0, 0)
1648202564: Received SUBSCRIBE from auto-EEA03522-3A30-0904-F73B-A3854D233BC3
1648202564:     hello (QoS 0)
1648202564: auto-EEA03522-3A30-0904-F73B-A3854D233BC3 0 hello
1648202564: Sending SUBACK to auto-EEA03522-3A30-0904-F73B-A3854D233BC3
  • Wireshark监听
    输入过滤规则【tcp.port == 8883】,TLS加密访问的服务器监听端口为8883,可以看到消息类型已经变为TLSv1.3
    在这里插入图片描述在这里插入图片描述MQTT TLS客户端与服务端的交互流程将来再研究。

《MQTT快速入门系列》快速导航:

写在末尾:

  • 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!
  • 专栏简介:从0到1掌握MQTT分布式协议。
  • 面向人群:零基础编程爱好者
  • 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器未来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值