news 2026/7/20 14:30:59

【每周分享】USB通信中的URB是什么?好奇吗?不妨来看一看

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【每周分享】USB通信中的URB是什么?好奇吗?不妨来看一看
前段时间一直忙着和Wireshark软件打交道,目的当然不是瞎捣腾,当然是为了项目需要而动手抓取和解析一些USB通信报文,然后偶然发现,就是在每个报文中都会有下面这样一段标注为“USB URB”的数据包:
该段数据包的长度有27个字节的,也有28个字节的等等:
那到底USBURB是什么呢?在USB通信当中充当什么角色呢?我们继续往下说。
USBURB,全称USB Request Block,即USB请求数据块,其数据包长度是可变的,它是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据结构;是USB主机与设备之间传输数据的封装;一个URB包含了执行USB传输所需要的所有信息。
因此,在进行数据传输时,需要分配一个URB结构体,对其进行初始化,并将其提交给USB核心,其中USB核心负责解析URB,将控制信息提交给主机控制器,由其负责数据到设备的传输。
既然我们说URB也属于一种数据结构,那它的结构到底是什么样的呢?
按照我这边总结的,URB所包含的字段及其含义主要汇总如下:
以28字节长度为例
有一点需要注意,Wireshark上面显示的Source和Destination不包含在数据结构里面,前者指示报文发送者,比如主机host,后者指示报文接收者,比如USB设备(用类似2.18.0这种地址表示):
usb.usbpcap_header_len
USB请求快长度或者USBPcap伪报头长度,USBPcap pseudoheader length,占2个字节,从第一个字段到最后一个字段;
usb.irp_id
输入输出请求包ID,IRP ID,由主机生成的数据帧ID,占8个字节,USB设备需要记住它,在响应请求的时候返回给主机,从而保证数据通信正常:
这里解释一下IRP:
IO Request Packet,输入/输出请求包,描述了硬件设备和操作系统之间的通信机制,包含了用于请求和响应输入输出操作的详细信息。
usb.usbd_status
请求块状态信息,IRP USBD_STATUS: USBD_STATUS_SUCCESS,占4个字节,通过该字段既可以知道当前USB通信状态,列举部分码值如下:
usb.function
可以理解为请求类型,也就是下一步要做什么,URB Function,占2个字节,比如请求设备的描述符:
比如请求批量或者中断传输数据:
usb.irp_info
请求块主要信息,IRP information,目前的USB协议仅最低bit位有效,即最低位表示方向,PDO表示总线上的设备,FDO表示主机功能驱动,其中0:主机到设备,1:设备到主机:
usb.bus_id
总线ID,URB bus id,占两个字节,由主机分配,USB设备的完整地址里面的第一个字段数据就是总线ID:
usb.device_address
设备地址,Device address,占1个字节,范围在1~127,也是区分每个USB设备的依据,USB设备的完整地址里面的第二个字段数据就是设备地址:
USB每次接入主机后,得到的设备地址可能都是不一样的。
usb.endpoint_address
USB设备的端点信息,Endpoint,其中:
bit7表示数据方向,即1:IN,主机接收数据,0:OUT;
低4位表示端点号,如果是0,则表示控制端点。
比如主机请求描述符的时候,主机收到按键数据的时候,都是为IN:
而USB设备的完整地址的第三个字段即表示端点号,可能为0,1,2或者其他自定义值:
usb.transfer_type
URB传输类型,URB transfer type,占1个字节,指定该交互的USB设备的传输数据的类型,主要有四种,分别是中断传输,控制传输,批量传输和同步传输:
要详细的了解它们的话,可以去看我写的其他文章,链接如下:
https://bbs.21ic.com/icview-3517517-1-1.html
https://bbs.21ic.com/icview-3516823-1-1.html
usb.data_len
数据包长度,指示URB块下面携带的数据包长度, Packet Data Length,占4个字节,没有携带数据,则为0,有,则一一对应:
usb.control_stage
直译为控制传输阶段,Control transfer stage,指的是完成一次控制传输所经历的几个逻辑步骤,而对于一次标准的控制传输,包含了以下2到3个阶段:
建立阶段(Setup Stage):
状态阶段(Status Stage):比如完成Complete
如果你想知道更多阶段参数,可以按如下进行字段名称的搜索:
对于批量传输的,是没有这个字段的,因此才有了前文所述的27个字节的URB数据块。
以上通过结合USB的数据报文详细解释了USB URB的各个字段的含义,希望有助于有需要的人更好的理解USB协议。
另外,如果我们需要在开发过程中查看USB URB的具体内容的话,可以按照下面的方法进行:
对于Windows系统的话:
可以尝试这三种工具:
Free USBAnalyzer;
SimpleUSB Logger;
USBPcap +Wireshark;
我比较喜欢用第三种,也可能是先入为主的原因。
对于Linux系统的话:
可以使用内核自带的 usbmon 模块。:
---------------------
作者:dffzh
链接:https://bbs.21ic.com/icview-3518318-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/20 14:29:26

Spring分布式定时任务常见问题与解决方案

1. 分布式定时任务重复执行的五大典型问题在Java生态中,Scheduled注解是Spring框架提供的轻量级定时任务解决方案,但在分布式环境下使用时存在诸多隐患。根据实际项目经验,以下是开发者最常遇到的五种典型问题场景:1.1 默认单线程…

作者头像 李华
网站建设 2026/7/20 14:29:14

easyExcelJs部署指南:从开发到生产的完整流程

easyExcelJs部署指南:从开发到生产的完整流程 【免费下载链接】easyExcelJs 简单的操作生成漂亮的EXCEL,快速上手。提供漂亮模板直接使用 项目地址: https://gitcode.com/gh_mirrors/ea/easyExcelJs 想要快速生成漂亮Excel报表?easyEx…

作者头像 李华
网站建设 2026/7/20 14:29:13

统计量不是终点:数据类型与集中趋势的业务决策心法

1. 项目概述:为什么我坚持用Python手算每一步统计量,而不是直接调包?在数据科学这条路上,我带过不少刚转行的朋友,也帮不少业务部门的同事做过基础分析培训。最常听到的一句话是:“老师,pandas.…

作者头像 李华
网站建设 2026/7/20 14:28:31

Claude Code技能扩展教程:从原理到实战

1. 项目概述:Claude Code技能扩展教程Claude Code作为一款智能编程助手,其核心能力之一就是通过Skills机制实现功能扩展。Skills本质上是一组可复用的Markdown文件,通过YAML配置和自然语言指令,让开发者能够自定义Claude的行为模式…

作者头像 李华