USB2.0令牌、事务及传输抓包分析
+ -

USB数据长度为0的DATA/IN事务

2021-10-14 2586 0

前言

使用BUSHOUND是抓不到这种包的。而且一些令牌包如SOF等这些是统计不到的。BUSHOUND是一个基本windows过滤驱动的,所以抓到的是数据已经传输的并且已经在主机方面的,所以USB总线上的一些状态是统计不到的。

其实关于控制传输的0字节长度,可详见:USB2.0 控制传输数据包PID序列 http://www.usbzh.com/article/detail-708.html 表示状态阶段

案例1-获取设备描述符

使用一些USB抓包工具,会经常看到一些传输数据长度为0的事务。不过由于没有负载有效的数据,在USB协议分析的过程中,我们经常将这种类忽略掉。但是它又是确实存在的。
如下图的获取设备描述符抓包:
获取设备描述符
可以看到,主机使用事务0发起控请求,请求的内容是获取设备描述符
然后设备通过一个IN事务,返回18个字节的设备描述符,使用的事务是1。
但是在事务1结束后,又有一个编号为2的OUT事务,也是主机发送数据给设备,不过返回的数据长度为0。

案例2-设置设置地址SetAddress

设置设置地址SetAddress
在设备枚举过程中,主机会给设备分配一个地址。这个地址是由主机直接发送给设备的。设备端不需要返回数据的。
但是在事务3之后,也有一个编号为4的IN事务。也是返回的是数据长度为0。

案例3-获取状态GetStatus

获取状态GetStatus
USB主机获取设备状态时,设备返回2字节的状态,同样也会有一个事务为37的IN事务。数据长度为0。

案例4-配置设备SetConfigure

配置设备SetConfigure
主机配置设备后,设备返回一个编号为39的IN事务,数据长度为0。

案例5-数据传输IN事务

数据传输IN事务
有效数据传输完成后,也会有一个编号为1413的IN事务,数据长度为0。

案例5-U盘的BULK传输

U盘的BULK传输
这个0长度的发生在有效数据之前。

USB数据长度为0的DATA事务的总结

  • 长度为0的包一般是用来表示一个传输结束的即多发送一个0字节的长度数据包通知USB主机没有更多的数据可以发送了。如USB主机需要从USB设备获取255个字节,但USB设备只有64字节的数据,并且USB设备端点0的最大包工度刚好是64,详仔细观察案例1中的DATA0的数据长度。
  • 或者表示数据还没有准备好,如批量传输同步传输中。
  • 这个数据阶段叫做状态阶段的数据包,并且PID必须是DATA1.

控制传输

感谢USB中文网技术交流群Always Online的贡献

控制传输是USB传输中最重要的传输。控制传输类型分为2~3个阶段:设置阶段、数据阶段(无数据控制没有此阶段)、确认阶段。

阶段一:设置阶段

都是由USB主机发起,主机从USB设备获取配置信息,并设置设备的配置值。

设置阶段的数据交换包包含了SETUP令牌包、DATA0数据包以及ACK握手包

阶段二:数据传输阶段

数据传输阶段用来传输主机与设备之间的数据。根据数据传输的方向,分为3种类型:控制读取(读取USB描述符)、控制写入(配置USB设备)以及无数据控制。

控制读取是将数据从设备读到主机上,读取的数据是USB设备描述度。首先,主机发送一个IN令牌信息包,然后设备将数据通过DATA1数据信息包回给主机,最后主机以下列方式响应:当数据正确接收时,主机送出ACK握手信息包;当主机忙碌时,发出NAK握手信息包;当发生错误时,主机发出STALL握手信息包。

控制写入是将数据从主机传到设备上,所传的数据即为对USB设备的配置信息。对每一个数据信息包而言,主机将会送出一个OUT令牌信息包表示信息要送出去。接着主机将数据通过DATA0数据信息包传递至设备。最后设备将以下列方式加以响应:当数据已经正确接收时,设备送出ACK握手信息包;当设备忙碌时,设备发出NAK握手信息包;当发生错误时,设备发出STALL握手信息包。

阶段三:确认阶段

确认阶段用来表示整个传输过程已完全结束。
确认阶段传输的方向必须与数据阶段的方向相反,即原来是IN令牌包,这个阶段应该是OUT令牌包;反之原来是OUT令牌包,这个阶段应为IN令牌包。对于控制读取而言,主机会送出OUT包,其后跟着0长度的DATA1包,此时设备也会做出相应的动作,送ACK、NAKSTALL握手包。相对地对于控制写入传输,主机会送出IN令牌包,然后设备送出表示完成状态阶段的0长度DATA1包,主机再做出相对应的动作:送ACK、NAK、STALL握手包

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

Windows下枚举系统中所有HID设备
Windows下对任何设备,文件的打开都是通过CreateFile来实现的,不过要打开一个设备得首先知道设备或文件名。由上节可知道,对于HID设备,都会注册一个接口类型为{2ACCFE60-C130-11D2-B082-00A0C91EFB8B}的GUID。我们可以通过Setup系列函数枚举出系统中......
Linux V4L2 UVC摄像头框架浅析
V4L2 :video for linux version 2 ,是 Linux 里一套标准的视频驱动,它支持 UVC 标准的摄像头。本文来分析一下它的核心框架。整个v4l2的框架分为三层:在应用层,我们可以在 /dev 目录发现 video0 类似的设备节点,上层的摄像头程序打开设备节点进行......
linux下UsbMon-WireShark之USB协议抓取分析
usbmon配置使用usbmon抓包分的,是需要 内核开启CONFIG_USB_MON=m, 重新编译内核, 编译ko :make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- CONFIG_USB_MON=m M=./drivers/usb/ ......
为什么我的USB设备如U盘从一个端口换到另一个端口会重新安装驱动?
在 Windows 2000和更高版本的操作系统中,当 USB 设备从一个端口移到另一个端口时,将创建一个新的物理设备对象 (PDO)。 如果硬件报告了唯一的 USB 序列号,则不会创建新的 PDO。若要重复使用同一 PDO 并确保设备不会改变,无论设备是否已重新插入相同的端口或新端口,硬件供应商必......
UVC Windows下UVC摄像头数据分析
这里我们分析一款UVC摄像头来进行数据分析。环境:win10 x64工具:bushound,usbviewer将摄像头插入PC后,打开usbviewer工具,可以看到关于此摄像头的相关信息。可以看到,这个摄像头其实是一个USB复合设备,所以其对应的系统驱动为USBCCGP,然后再由USB复合设......
USB2.0 数据包DATA0,DATA1,DATA2
数据包是用于传输数据的,由8位的包标识PID,数据字段和16位的循环冗余校验字段CRC组成。PID字段:用于指明不同的数据包类型。支持 4 种数据包,分别为: DATA0 、 DATA1 、DATA2 和MDATA。 在介绍的数据触发机制中,使用 DATA0 和 DATA1。SPLIT 令牌事......
Linux支持的UVC视频格式
Linux支持的UVC视频格式位于linux-5.6.11linux-5.6.11driversmediausbuvcuvc_driver.c文件下:其数组结构定义如下:static struct uvc_format_desc uvc_fmts[] = { { .n......
Windows下UVC虚拟摄像头的实现
最近在Windows10 x64环境下,开发了一个虚拟UVC摄像头驱动。确切的来说这不是摄像头驱动,而是一个虚拟USB总线驱动。使用该虚拟总线驱动使用应用软件通过IOCTL控制总线子设备的创建与卸载。驱动安装完成后,是一个单纯的USB虚拟总线。应用软件通过发送自定义IOCTL码IOCTL_BUSEN......
Windows下USB设备的枚举过程分析
1.用户把USB设备插入USB端口或给系统启动时设备上电这里的USB端口指的是主机下的根hub或主机下行端口上的hub端口。Hub给端口供电,连接着的设备处于上电状态。2.Hub监测它各个端口数据线上(D+/D-)的电压在hub端,数据线D+和D-都有一个阻值在14.25k到24.8k的下拉电阻Rp......
USB存储设备在Windows环境下使用Uaspstor.sys或Usbstor.sys那个驱动?
USB Attached SCSI (UAS) 协议是一种新的大容量存储协议,旨在通过已建立的 USB 大容量存储协议(仅批量传输)和 BOT (提高性能) 。 它通过减少协议开销、支持 SATA 本机命令队列 (NCQ) 并并行处理多个命令。 为此,UAS 使用新的 USB 3.0 功能进行称为流......
Windows10设备管理器USB设备描述符请求失败(未知的usb设备)
在电脑中插入USB设备后,有时会报USB设备描述符请求失败,导致USB设备在设备管理器中枚举失败。一种专业的解决办法见:http://www.usbzh.com/article/detail-1059.htmlUSB设备描述符请求失败现象USB设备描述符请求失败在设备管理器中发现通用串行总线......
Linux源码分析UVC摄像头的初始化流程分析
UVC摄像头的初始化发生在硬件被接入USB集线器中,设备初USB驱动识别为摄像头的后续初始化流程。和Windows的AddDevice驱动函数一样,Linux设备的创建和侦测是通过int uvc_probe函数实现的。其函数的调用关系如下://linux/v5.11.11/source/drive......
Windows对红外相机摄像头的支持
从Windows10的1607版本开始,USB视频类(UVC)驱动程序支持产生红外(IR)流的摄像头。红外摄像头相机捕捉场景的亮度值,并通过USB以未压缩格式或压缩格式传输帧。这些相机及其流通过媒体捕获管道(pipeline)导出给应用程序。红外UVC摄像头相机帧类型红外UVC摄像头相机支持的格......
USBTreeView遇到连续的转换接口描述符不解释情况说明
今天拿到一个USB摄像头,对其进行数据格式分析,出现了一个令人迷惑的问题…事情是这样的,我用POTPLAYER打开摄像头,使用BUSHOUND进行抓包,选择的备用接口是0x0c CTL 01 0b 0c 00 01 00 00 00 SET_INTERFACE为了查看该端点的数据大......
ubuntu下使用usbmon进行usb抓包
开发或者调试USB设备相关的工具或者驱动,一个调试的利器就是usbmon抓包。 在ubuntu下使用步骤如下:1 运行命令 sudo mount -t debugfs none /sys/kernel/debug ,如果提示已经挂载,则下次抓包就可以不运行这个命令了。表示系统默认会挂载。 2 ......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!