实验目的
Wireshark抓包分析MQTT协议
实验环境
实验步骤
步骤 1:安装 Mosquitto Broker
确保你已经安装了 Mosquitto Broker,这是一个流行的 MQTT 代理。 安装完成后,Mosquitto服务会自动启动。
步骤2:检查 Mosquitto 代理服务器的状态以及它是否正在监听指定的端口
由上可知,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 指定主题。
在发布消息的终端:
执行mosquitto_pub -h localhost -t "test/topic" -m "Hello, MQTT!" ,-m 指定要发布的消息。
此时,在订阅消息的窗口显示了接收到的消息。
步骤 4:启动 Wireshark 捕获数据包
在 Wireshark 中选择网络接口,并使用过滤器 mqtt 过滤显示 MQTT 相关的数据包。需要注意的是:如果你在本地机器上运行MQTT broker和客户端,你应该选择loopback接口。
步骤 5:分析 MQTT 数据包
浏览捕获的数据包,选择一个 MQTT 数据包以查看其详细信息。
数据包分析
1.消息类型(Message Type):这是MQTT协议中的一部分,它定义了数据包的类型。这可以帮助你理解MQTT会话的流程。
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消息中,主题是非常重要的部分。它定义了消息的分类,可以帮助你理解消息的目的和来源。
3.消息内容(Payload):在PUBLISH消息中,消息内容是最重要的部分。这是实际的应用数据,
4.服务质量(Quality of Service,QoS):这是MQTT协议中的一部分,它定义了消息传输的服务质量等级。这可以帮助你理解消息传输的可靠性。当一个消息被发布时,PUBLISH数据包中的QoS字段指定了这个消息应该被传递的方式。QoS等级可以是0(最多交付一次),1(至少交付一次),或2(只交付一次)。
回顾实验,并回答下面问题。
产生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的安全特性,用户名和密码是重要的参数。它们定义了客户端的认证信息,可以帮助你理解会话的安全性。