实验目的

Wireshark抓包分析MQTT协议

实验环境 

wireshark对ip抓包_客户端

 

实验步骤

步骤 1:安装 Mosquitto Broker

确保你已经安装了 Mosquitto Broker,这是一个流行的 MQTT 代理。 安装完成后,Mosquitto服务会自动启动。

步骤2:检查 Mosquitto 代理服务器的状态以及它是否正在监听指定的端口

wireshark对ip抓包_服务器_02

由上可知,Mosquitto服务正在运行,并且在本地(127.0.0.1和[::1])监听端口"1883",这是MQTT协议的默认端口。如果您的应用程序需要与Mosquitto服务进行通信,可以使用本地主机地址(127.0.0.1或localhost)和端口"1883"。

步骤 3:使用 MQTT 客户端发布和订阅消息,产生MQTT数据包

打开两个终端窗口,一个用于发布消息,另一个用于订阅消息。先订阅消息再发布消息。

在订阅消息的终端:

执行mosquitto_sub -h localhost -t "test/topic",在这个命令中,-h 指定MQTT代理服务器的地址,-t 指定主题。

wireshark对ip抓包_客户端_03

 

在发布消息的终端:

执行mosquitto_pub -h localhost -t "test/topic" -m "Hello, MQTT!" ,-m 指定要发布的消息。

wireshark对ip抓包_网络_04

 

此时,在订阅消息的窗口显示了接收到的消息。

wireshark对ip抓包_wireshark对ip抓包_05

 

步骤 4:启动 Wireshark 捕获数据包

在 Wireshark 中选择网络接口,并使用过滤器 mqtt 过滤显示 MQTT 相关的数据包。需要注意的是:如果你在本地机器上运行MQTT broker和客户端,你应该选择loopback接口。

wireshark对ip抓包_客户端_06

 

步骤 5:分析 MQTT 数据包

浏览捕获的数据包,选择一个 MQTT 数据包以查看其详细信息。

数据包分析

 

1.消息类型(Message Type):这是MQTT协议中的一部分,它定义了数据包的类型。这可以帮助你理解MQTT会话的流程。

wireshark对ip抓包_客户端_07

CONNECT:客户端发送CONNECT数据包到服务器,请求建立连接。这个数据包包含了客户端的信息,如客户端标识符,用户名和密码(如果需要),以及其他连接参数。

CONNACK:服务器响应CONNACK数据包,确认连接请求。这个数据包包含了连接的结果,如是否接受连接,以及会话的状态。

SUBSCRIBE:客户端发送SUBSCRIBE数据包到服务器,请求订阅一个或多个主题。这个数据包包含了要订阅的主题列表,以及对应的QoS等级。

SUBACK:服务器响应SUBACK数据包,确认订阅请求。这个数据包包含了对应的QoS等级。

PUBLISH:服务器或客户端发送PUBLISH数据包,发布消息到一个主题。这个数据包包含了主题和消息内容。

PUBACK:在QoS等级为1或2的情况下,接收PUBLISH数据包的一方响应PUBACK数据包,确认收到消息。

PUBREC, PUBREL, PUBCOMP:在QoS等级为2的情况下,这些数据包用于实现消息的可靠传输。

PINGREQ 和 PINGRESP:客户端发送PINGREQ数据包到服务器,请求保持连接。服务器响应PINGRESP数据包,确认保持连接。

DISCONNECT:客户端发送DISCONNECT数据包到服务器,请求断开连接。

2.主题(Topic):在PUBLISH和SUBSCRIBE消息中,主题是非常重要的部分。它定义了消息的分类,可以帮助你理解消息的目的和来源。

wireshark对ip抓包_wireshark_08

3.消息内容(Payload):在PUBLISH消息中,消息内容是最重要的部分。这是实际的应用数据, 

wireshark对ip抓包_网络_09

4.服务质量(Quality of Service,QoS):这是MQTT协议中的一部分,它定义了消息传输的服务质量等级。这可以帮助你理解消息传输的可靠性。当一个消息被发布时,PUBLISH数据包中的QoS字段指定了这个消息应该被传递的方式。QoS等级可以是0(最多交付一次),1(至少交付一次),或2(只交付一次)。

wireshark对ip抓包_wireshark_10

回顾实验,并回答下面问题。

产生MQTT数据包还有哪些方法?

(1)MQTT客户端工具:有许多可用于生成MQTT数据包的客户端工具。其中一些工具包括MQTT.fx、MQTT Explorer、MQTT Lens等。这些工具通常提供用户界面,使您能够轻松地创建、编辑和发送MQTT消息。

(2)编程语言中的MQTT库:如果您熟悉编程,可以使用支持MQTT协议的编程语言中的MQTT库来编写脚本或程序。例如,Python有Paho MQTT库,JavaScript有MQTT.js等。   

(3)使用在线MQTT测试工具: 有一些在线工具可用于测试MQTT消息,例如HiveMQ Websocket Client。这些工具允许您通过Web界面发送和接收MQTT消息。

wirshark捕获不到MQTT数据包的原因有哪些?

(1)网络接口选择错误:确保你在Wireshark中选择了正确的网络接口。如果你在本地机器上运行MQTT broker和客户端,你应该选择loopback接口(在Windows上通常是`Npcap Loopback Adapter`,在Linux上通常是`lo`)。

(2)过滤器设置不正确:在Wireshark的过滤器框中,你需要输入`mqtt`以过滤出MQTT协议的数据包。如果你没有设置过滤器或者设置的过滤器不正确,你可能会看到很多其他协议的数据包,从而无法找到MQTT数据包。

(3)MQTT通信没有成功:如果你的MQTT客户端和broker没有正确地建立连接或者没有成功地发送消息,你可能无法在Wireshark中看到MQTT数据包。你可以检查你的MQTT客户端和broker的日志,看看是否有任何错误信息。

(4)MQTT使用了加密:如果你的MQTT通信使用了SSL/TLS加密(例如,使用了mqtts协议),你需要在Wireshark中配置SSL解密参数,才能看到MQTT数据包的内容。如果你没有配置SSL解密参数,你只能看到加密的TCP数据包,而看不到MQTT数据包。

(5) 网络安全策略或防火墙阻止了数据包的捕获:某些网络安全策略或防火墙可能会阻止Wireshark捕获数据包。你可以检查你的网络安全设置,看看是否有这样的限制。

3. 在分析MQTT数据包时,还有哪些可能需要关注的内容?

(1)保持连接(Keep Alive):在CONNECT消息中,保持连接是一个重要的参数。它定义了客户端和服务器之间的心跳间隔,可以帮助你理解会话的活动状态。

(2)会话状态(Session State):在CONNACK消息中,会话状态是一个重要的参数。它定义了会话的当前状态,可以帮助你理解会话的生命周期。

(3)客户端标识符(Client Identifier):在CONNECT消息中,客户端标识符是一个重要的参数。它定义了客户端的唯一标识,可以帮助你理解会话的来源。

(4)用户名和密码(Username and Password):在CONNECT消息中,如果启用了MQTT的安全特性,用户名和密码是重要的参数。它们定义了客户端的认证信息,可以帮助你理解会话的安全性。