[麦麦茶水间] 【每周分享】USB数据传输类型有哪些?我们一起来学习和了解吧!

[复制链接]
1162|0
dffzh 发表于 2026-5-15 15:49 | 显示全部楼层 |阅读模式
, , , ,
#申请原创# #技术资源#  


@21小跑堂

对于USB(通用串行总线)这个词,大家耳熟能详,基本上工作时都要与其打交道,也会使用很多USB设备,比如USB键盘,鼠标,U盘,摄像头和USB HUB等等。那对于不同的USB设备,数据通信方式是一样的吗?也就是说什么又是USB的数据传输类型呢?通俗一点来说,其实就是USB主从设备在进行数据通信时,通过什么方式来进行数据交互的,我们就以一张通过wireshark软件抓取的USB报文截图来开始这篇文章:

上图里的“URB transfer type:URB_INTERRUPT (0x01)”指的就是当前报文数据是通过什么数据类型进行传输的,很明显,直译过来就是中断方式,其中的0x01对应中断方式。
标准USB协议其实是定义了四种主要的数据传输类型,包括:
控制传输(Control Transfer);
中断传输(Interrupt Transfer);
批量传输(Bulk Transfer);
同步传输(Isochronous Transfer).
对于这四种数据传输方式的特点、用途和典型设备,我们通过下面这个表格来对比看下就比较清楚了:
  
数据传输类型
  
特点
用途
典型设备
  
控制传输
  
可靠,有保证;
  
双向传输
主要用于设备识别和配置
所有USB设备的必备功能
  
中断传输
  
可靠,有保证;
  
低延迟
用于传输小规模、但不希望有太大延迟的数据
鼠标、键盘和游戏手柄等
  
批量传输
  
可靠,有保证
用于传输数据量大、但对时间不敏感的数据,保证数据内容100%正确(有错误会重传)
USB串口设备、U盘(读写文件)、USB外置硬盘、打印机和扫描仪等
  
同步传输
  
无差错检测/重传机制,不可靠;
  
保证实时性
用于流媒体,允许偶尔丢帧,但不能容忍因重传造成的卡顿或延迟
USB摄像头(实时画面)、USB麦克风和USB音响/耳机(音频流)等
另外,数据传输类型这个字段在USB协议里面一般定义为transfer_type,被封装在URB数据块里面,如下所示:

USB其实是通过一个称为URB(USB Request Block,USB请求块)的东西和所有的USB通信;USB数据传输都是以URB请求、URB生成、URB递交、URB释放为主线。
所以你看到的报文,数据传输类型都在URB树下面,也可以称之为URB数据传输类型:

接下来我们结合wireshark抓取的报文数据再来逐个认识一个几个数据传输类型吧。
1、控制传输:类型码0x02
当USB设备插入主机时,主机都是通过控制传输先读取设备的相关描述符,然后分配地址和加载驱动程序等,也就是说几乎所有USB设备都必须支持控制传输的端点0。下面的报文就是插入一个USB键盘到电脑上时抓取的报文:

带“GET”字样的报文一般就是USB主机(电脑)向USB设备(USB键盘)请求获取相关描述符信息,“Request”是主机到设备的请求,“Response”是设备到主机的数据响应。我们看下请求设备描述符的报文:

再看下响应配置描述符的报文:

其他请求描述符也是一样,USB数据传输类型都是控制传输(URB_CONTROL 0x02)。
2、中断传输:类型码0x01
当你操作USB按键或者操作USB鼠标的时候,交互的数据类型就是中断传输。比如我们操作几次按键对应的报文如下:
当然,为了方便查看报文,你可以加入过滤报文的命令,比如当你通过描述符数据知道对应USB设备的设备地址(device address)为10后,就可以加入usb.device_address == 10命令来只抓取和显示此设备的报文:

USB按键的按下和松开都会发送报文数据,其实不用看具体报文内容,在Info栏都能直接看出是中断传输了吧。
我们来看下报文也可以:

另外,如果你对传输类型字段的名称和类型码比较熟悉,也可以按照设置过滤命令的方法来快速找到对应类型的报文:usb.transfer_type == 类型码

3、批量传输:类型码0x03
当你通过U盘进行文件等拷贝的时候,应该就能看到批量传输的报文了,不过这里我不用这种方式抓取,我正在开发的一款USB键盘板子上有一个串口,通过USB转串口工具连接到了电脑上,按键时会有数据打印到串口助手,正好可以来查看,CH340的USB转串口工具也是一个USB设备:

按照上面的方法,输入过滤命令usb.transfer_type == 0x03进行查找:

果然确实有,这种方法其实很高效的:

如果你好奇这段批量数据是什么,可以用工具将hex格式转成ascii格式查看一下:

就是串口打印数据的一部分内容:

4、同步传输:类型码0x04
对于实时性要求比较高的场景和设备,比如USB摄像头等等,都是通过同步传输实现的。大家可以想想通信领域的同步概念(比如串口USART等),其实主要目的就是为了保证通信数据的实时性。
由于手头上没有这类设备,所以就没办法看一看报文了,真是抓不到:

我这边从网上找了一个同步传输的报文,大家也可以看一下,基本都是类似的:

感兴趣的坛友们如果正好有对应的USB设备的话,不妨一试,然后把抓到的同步传输报文发来一起看看。
USB设备里面涉及的USB HID协议的内容其实是非常丰富的,如果你正在学习,不妨可以通过这种抓包结合的方式来深入学习,我觉得会有事半功倍的效果呢,也欢迎随时讨论。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

533

主题

3826

帖子

26

粉丝
快速回复 在线客服 返回列表 返回顶部
0