当前位置: 首页 > news >正文

用wireshark抓包分析学习USB协议

用 wireshark 抓包分析学习 USB 协议

1 框架

在这里插入图片描述
上图是使用USB协议通信的两个设备的实现细节。看起来比较复杂,可以看下面的示意图:
在这里插入图片描述
整个框架分为三层:Function Layer、USB Device Layer 和 USB Bus Interface Layer;黑色双向箭头代表实际数据通路,浅色箭头代表逻辑连接。

平时我们使用 USB 协议的拓扑结构可能是下面这样的:
在这里插入图片描述
也就是一台电脑,挂着几个USB直连设备,比如鼠标键盘;由于USB口不够用,又接了几个 USB HUB,HUB上又挂着其它 USB 设备,比如话筒。

单从通信关系上看,可以理解成下面这样:
在这里插入图片描述
就是每一个设备都看作 Endpoint,Host 和 Device 之间的连接视作数据的Pipes,通信数据流通过 Pipes 在 Host 和 Endpoints 之间交换。

这里需要提前说明一下,USB是完全由 Master 主导的。也就是说,无论是从电脑向设备发数据,还是从设备从电脑发数据,都是由电脑控制的。

不过比起拓扑,软件人员可能更关心的是协议的格式,更进一步还想知道,究竟USB连接电脑之后,会发生些什么,这是这篇文章要记叙的主要内容。

2 USB 设备的状态流

这是 USB 设备的状态机。
在这里插入图片描述
Attached 指的就是设备已经连接到电脑的 USB 接口上;

设备进入 Powered 状态;

然后 master 让设备 reset,使设备进入 Default 状态;这时候设备使用默认地址
在这里插入图片描述
接着 master 会给设备分配一个地址;后续用这个地址和设备通信,也可以理解为换了一个专用的 pipe

master 会读设备的描述符,然后对设备做一些配置,设备进入Configured 状态
在这里插入图片描述在这里插入图片描述

总线空闲一定时间之后设备会进入 Suspend 状态,以便省电;这和掉电不一样,设备的地址和配置不会丢失,唤醒之后不用重新分配地址和配置。
在这里插入图片描述

3 连接过程

在这里插入图片描述
这是 wireshark 工具抓 USB 数据包的界面,绿色框中的是发送数据包的源头,即发出方;红色框中的是数据包的接收方。


在这里插入图片描述

上图黄色箭头指向的那一行,是 host 向 设备 1.1.0 发送的一个 GET DESCRIPTOR Request;
在这里插入图片描述
上图右下框中绿色高亮的内容就是这个 request 的具体内容,数据格式可以对照下图中的表格:
在这里插入图片描述
第一个字节是 bmRequestType,用于描述请求的特性。 值为 0x80,意味着是标准设备,请求 device-to-host,即请求 device 向 host 发送数据
在这里插入图片描述
第二个字节是 bRequest,用于指明具体的请求,这里值是 6,对应着获取设备描述符 GET_DESCRIPTOR

在这里插入图片描述
因为协议文档是2.0的,和3.2的数据包不能完全对应,后面几个字段先不看了,等看3.2标准文档的时候再说。

在这里插入图片描述
紧接着有一个数据包,收发双方呼唤,应该就是 device 应答了 master 的请求。下面打开数据包可以看到回复了一个 device 描述符
在这里插入图片描述
避免歧义,这里说明一下,描述符有以下几种类型。Device 是其中的一种。
在这里插入图片描述
好,回到数据包的说明。这里有四个和CONFIGURATION相关的数据包。
在这里插入图片描述
先是 master 发了一个要求长度为 9 的
在这里插入图片描述
device 回了一个长度为 9 的,其中包含了一个长度信息 0x80
在这里插入图片描述
然后 master 发了一个要求长度 0x80 的
在这里插入图片描述
然后 device 回了一个长度为 0x80 的
在这里插入图片描述
最后 用 SET CONFIGURATION request 配置了 device

http://www.lqws.cn/news/79561.html

相关文章:

  • 04powerbi-度量值-筛选引擎CALCULATE()
  • 吴恩达MCP课程(5):research_server_prompt_resource.py
  • 光伏功率预测 | BiLSTM多变量单步光伏功率预测(Matlab完整源码和数据)
  • HTML 等价字符引用:系统化记忆指南
  • 网络攻防技术五:网络扫描技术
  • Linux中的mysql逻辑备份与恢复
  • 二叉树的层序遍历与完全二叉树判断
  • HarmonyOS鸿蒙Taro跨端框架
  • 已有的前端项目打包到tauri运行(windows)
  • AI智能体|扣子(Coze)搭建【合同/文档审查】工作流
  • SpringBoot手动实现流式输出方案整理以及SSE规范输出详解
  • 从 LeetCode 到日志匹配:一行 Swift 实现规则识别
  • 【Godot】如何导出 Release 版本的安卓项目
  • Linux服务器安装GUI界面工具
  • Grafana对接Prometheus数据源
  • LlamaIndex的IngestionPipeline添加本地存储(本地文档存储)
  • 【深度学习】实验四 卷积神经网络CNN
  • 记录一次由打扑克牌测试国内各家大模型的经历
  • 2025年5月24日系统架构设计师考试题目回顾
  • 使用 OpenCV (C++) 进行人脸边缘提取
  • 大数据-275 Spark MLib - 基础介绍 机器学习算法 集成学习 随机森林 Bagging Boosting
  • shiro使用详解
  • Java后端优化:对象池模式解决高频ObjectMapper实例化问题及性能影响
  • 链式前向星图解
  • 【C++高级主题】转换与多个基类
  • InlineHook的原理与做法
  • 【TMS570LC4357】之相关驱动开发学习记录1
  • Python-matplotlib库画不规则图
  • 【CVE-2025-4123】Grafana完整分析SSRF和从xss到帐户接管
  • Hadoop学习笔记