码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【MQTT从入门到提高系列 | 09】WireShark抓包分析MQTT报文


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

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

    文章目录

    • 1. 环境配置
    • 2. 启动Wireshark监听
    • 3. 启动Mqtt broker
    • 4. 订阅主题sensors/temperature
      • 4.1 启动订阅
      • 4.2 CONNECT报文解析
      • 4.3 CONNACK报文解析
      • 4.4 SUBSCRIBE报文解析
      • 4.5 SUBACK
    • 5. 启动Broker TLS加密模式

    本文记录如何使用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
    
    • 1

    输出如下:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4. 订阅主题sensors/temperature

    4.1 启动订阅

    • 新开一个终端输入
    mosquitto_sub.exe -t sensors/temperature -q 1
    
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可以看到,有三个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
    
    • 1
    序号数据描述备注
    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加密模式

    • 启动Broker,以加密TLS模式, 详情请参考MQTT从入门到提高(二):MQTT TLS加密传输
    mosquitto.exe -c .\mosquitto.conf -v
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 订阅主题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
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • Wireshark监听
      输入过滤规则【tcp.port == 8883】,TLS加密访问的服务器监听端口为8883,可以看到消息类型已经变为TLSv1.3
      在这里插入图片描述在这里插入图片描述MQTT TLS客户端与服务端的交互流程将来再研究。

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

    • 【MQTT从入门到提高系列 | 01】从0到1快速搭建MQTT测试环境
    • 【MQTT从入门到提高系列 | 02】MQTT3.1.1TLS加密传输
    • 【MQTT从入门到提高系列 | 03】一文掌握MQTT3.1.1协议框架
    • 【MQTT从入门到提高系列 | 04】MQTT应用协议之CONNECT
    • 【MQTT从入门到提高系列 | 05】MQTT3.1.1之PUBLISH发布工作流
    • 【MQTT从入门到提高系列 | 06】MQTT3.1.1之SUBSCRIBE订阅工作流
    • 【MQTT从入门到提高系列 | 07】MQTT3.1.1之链路保活及断开
    • 【MQTT从入门到提高系列 | 08】MQTT3.1.1主题Topic详解

    写在末尾:

    • 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!
    • 专栏简介:从0到1掌握MQTT分布式协议。
    • 面向人群:零基础编程爱好者
    • 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待
      • Python零基础快速入门系列
      • 快速入门Python数据科学系列
      • 人工智能开发环境搭建系列
      • 机器学习系列
      • 物体检测快速入门系列
      • 自动驾驶物体检测系列
      • …

  • 相关阅读:
    ADAU1860调试心得(3)接口说明以及硬件搭建步骤
    基于PHP+MySQL的教室自习室预约信息管理系统#毕业设计
    FileOutputStream中和FileWriter的换行不同
    QT day1登录界面设计
    IDEA的快捷键大全
    如何保证数据库与缓存数据一致性?
    服务器——SSL/TLS协议信息泄露漏洞(CVE-2016-2183)修复办法
    定时任务报警通知解决方案详解
    Java批量修改文件名
    UE4后处理:PostProcessMaterial
  • 原文地址:https://blog.csdn.net/RobotFutures/article/details/126032312
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号