传输
不像 RS-232 和其他类似的串口协议,USB 实际上由多层协议构造而成,不过大部分底层的协议都在 Controller 端上的硬件或者固件进行处理了,最终开发者所要关心的只有上层协议。
USB Packet
在 HCI 之下,实际传输的数据包称为 Packet,每次上层 USB 传输都会涉及到 2-3 次底层的 Packet 传输,分别是:
Token Packet: 总是由主机发起,指示一次新的传输或者事件
In: 告诉 USB 设备,主机我想要读点信息
Out: 告诉 USB 设备,主机我想要写点信息
Setup: 用于开始 Control Transfer

Data Packet: 可选,表示传输的数据,可以是主机发送到设备,也可以是设备发送到主机
Data0
Data1

Status Packet: 状态包,用于响应传输,以及提供纠错功能
Handshake Packets: ACK/NAK/STALL
Start of Frame Packets

Transfer
基于这些底层包,USB 协议定义了四种不同的传输类型,分别对应上节中的四种端点类型,分别是:
Control Transfers: 主要用来发送状态和命令,比如用来请求设备、配置等描述以及选择和设置指定的描述符。只有控制端点是双向的。
Interrupt Transfers: 由于 USB 协议是主机主导的,设备端的中断信息需要被及时响应,就要用到中断传输,其提供了有保证的延迟以及错误检测和重传功能。中断传输通常是非周期性的,并且传输过程保留部分带宽,常用于时间敏感的数据,比如键盘、鼠标等 HID 设备。
Isochronous Transfers: 等时传输,如其名字所言,该类传输是连续和周期性的,通常包含时间敏感的信息,比如音频或视频流。因此这类传输不保证到达,即没有 ACK 响应。
Bulk Transfers: 用于传输大块的突发数据(小块也可以),不保留带宽。提供了错误校验(CRC16)和重传机制来保证传输数据的完整性。块传输只支持高速/全速模式。
这里以控制传输(Control Transfers)为例,来看看底层 Packet 如何组成一次完整的传输。控制传输实际上又可能最多包含三个阶段,每个阶段在应用层可以看成是一次 “USB 传输” (在Wireshark中占一行),分别是:

Setup Stage: 主机发送到设备的请求,包含三次底层数据传输

Setup Token Packet: 指定地址和端点号(应为0)
Data0 Packet: 请求数据,假设是 8 字节的 Device Descriptor Request
ACK Handshake Packet: 设备的响应, 不允许用 STALL 或者 NAK 来响应 Setup Packet

Data Stage: 可选阶段,包含一个或者多个 IN/OUT 传输,以 IN 为例,也包含三次传输
IN Token Packet: 表示主机端要从设备端读数据
Datax Packet: 如果上面 Setup Stage 是 Device Descriptor Request, 这里返回 Device Descriptor Response (的前8字节,然后再根据实际长度再 IN 一次)。
ACK/STALL/NAK Status Packet

Status Stage: 报告本次请求的状态,底层也是三次传输,但是和方向有关:
如果在 Data Stage 发送的是 IN Token,则该阶段包括:
OUT Token
Data0 ZLP(zero length packet): 主机发送长度为0的数据
ACK/NACK/STALL: 设备返回给主机
如果在 Data Stage 发送的是 OUT Token,则该阶段包括:
IN Token
Data0 ZLP: 设备发送给主机,表示正常完成,否则发送 NACK/STALL
ACK: 如果是 ZLP,主机响应设备,双向确认

每个阶段的数据都有自己的格式,例如 Setup Stage 的 Request,即 Data0 部分发送的 8 字节数据结构如下:
struct usb_ctrlrequest {
__u8 bRequestType; // 对应 USB 协议中的 bmRequestType,包含请求的方向、类型和指定接受者
__u8 bRequest; // 决定所要执行的请求
__le16 wValue; // 请求参数
__le16 wIndex; // 同上
__le16 wLength; // 如果请求包含 Data Stage,则指定数据的长度
} attribute ((packed));

下面是一些标准请求的示例:
bmRequestType bRequest wValue wIndex wLength Data
1000 0000b GET_STATUS (0x00) Zero Zero Two Device Status
0000 0000b CLEAR_FEATURE (0x01) Feature Selector Zero Zero None
0000 0000b SET_FEATURE (0x03) Feature Selector Zero Zero None
0000 0000b SET_ADDRESS (0x05) Device Address Zero Zero None
1000 0000b GET_DESCRIPTOR (0x06) Descriptor Type & Index Zero or Language ID Descriptor Length Descriptor
0000 0000b SET_DESCRIPTOR (0x07) Descriptor Type & Index Zero or Language ID Descriptor Length Descriptor
1000 0000b GET_CONFIGURATION (0x08) Zero Zero 1 Configuration Value
0000 0000b SET_CONFIGURATION (0x09) Configuration Value Zero Zero None
ref: https://www.beyondlogic.org/usbnutshell/usb6.shtml
虽然 HCI 之下传输的数据包大部分情况下对应用开发者透明,但是了解底层协议发生了什么也有助于加深我们对 USB 的理解,后文中介绍 checkm8 漏洞时候就用到了相关知识。

如果想了解更多安全知识,或者有问题,都可以关注以下公众号,私信我:

USB协议介绍二 传输相关推荐

  1. 简单说说USB协议(二)包的结构与包的分类

    无论是什么传输设备,通信的过程就涉及到传输方法,USB协议中有四种传输方式:批量传输.中断传输,等时传输,控制传输.因此在这些传输方式上传输的都是包,所以在了解传输方式前,还需要知道包是个什么东西. ...

  2. FTP文件传输协议介绍和常用命令

    学云计算的同学肯定会碰到使用FTP工具的时候,今天小千就来简单给大家介绍一下什么是FTP,和一些常见的FTP命令. Ftp 介绍 文件传输协议(File Transfer Protocol,FTP), ...

  3. USB协议详解第0讲(系列博文介绍)

    目录 1.课程目标 2.简单介绍 3.课程大纲 1.课程目标 USB协议详解旨在为大家通俗理解USB通讯协议,我会带着大家一步一步理解USB通讯中的各种概念及通讯方式,并且会借助于USB Protoc ...

  4. iOS网络经典知识点收录整理(OSI分层协议作用介绍和传输全过程)

    重要知识点目录 从URL输入到网页显示的全过程解析 TCP底层三次握手解析 OSI分层知识点记录介绍 1.链路层 2.网络层  ARP IPv4 IPv6 ICMP(异常协议) 3.传输层 4.应用层 ...

  5. TCP/IP协议十二:关于MAC地址和IP地址在传输过程中变与不变的问题

    TCP/IP协议十二:关于MAC地址和IP地址在传输过程中变与不变的问题 1. 结论 2. 原因: 3. 例子 4. 参考: 1. 结论 mac变,ip不变. mac地址在同一个广播域传输过程中是不变 ...

  6. 网络基础之传输层协议介绍(“三次握手”和“四次挥手”)

    文章目录 一.TCP/IP协议簇的传输层协议: 1.TCP和UDP 2.TCP报文段 二.TCP的"三次握手"和"四次挥手" 1."三次握手" ...

  7. 流媒体封装格式和流媒体传输协议介绍

    1.流媒体封装格式介绍 一个流媒体文件由音频流和视频流两种数据组成. h264/mpeg4等就是视频流编码格式,视频流一般以帧的单位存在,i帧.p帧.b帧,帧率(frame rate)是每秒显示帧数( ...

  8. 【AIOT】3.5 物联网传输协议介绍

    1. 介绍 常见的物联网传输协议 MQTT详细介绍 2. HTTP协议 HTTP协议是Hyper Text Transfer Protocol的缩写 处于OSI模型的应用程序层 通常的场景下,网络防火 ...

  9. USB协议详解第12讲(USB传输-初探)

    目录 1.USB传输.事务.包的关系 2.USB传输类型 2.1控制传输 2.2同步传输 2.3批量传输 2.4中断传输 3.传输总结及后期内容 1.USB传输.事务.包的关系 USB传输.事务.包是 ...

  10. MPSOC DP协议介绍

    一 DP介绍 1.1 DP介绍 DP协议(DisplayPort)是一种数字视频传输协议,用于连接计算机或其他设备与显示器或电视等显示设备.DP协议由VESA(Video Electronics St ...

最新文章

  1. 多线程中使用mktime和setenv函数
  2. 树莓派实现人脸识别需要做的那些事
  3. 为了故意刁难AI,科学家们制造了这1200个问题,超强AI被“打回原形”
  4. CentOS7性能监控系统安装
  5. bzoj 2007 海拔 —— 最短路
  6. linux简单快速启用web
  7. SpringBootAdmin
  8. gpu编程如何一步步学习_如何学习贴片机编程
  9. 死锁的产生、预防和避免
  10. **加密解密基础、PKI及SSL、创建私有CA**
  11. java 继承 extends_java中的继承 (extends) 详解
  12. PXE无人值守系统安装配置简要说明
  13. 港科大郑光廷院士问诊未来,揭露 AI 最新应用与实践
  14. [转载] python iter( )函数
  15. Java的switch case 语句
  16. 微信小程序中的倒计时
  17. 域计算机策略软件安装方法,windows域软件下发策略
  18. 齐天大圣蟠桃园吃桃子
  19. 【期末复习】计算机组成原理 袁春风
  20. 京东大客户开放平台VOP接口对接记录

热门文章

  1. 纯数学教程 Page 203 例XLI (2)
  2. sha1 java 代码_HMAC-SHA1的java源代码实现
  3. 正则表达式去除html标签
  4. python37安装失败怎么搞_Linux 安装Python37
  5. python判断字符类型例题_Python面试题:字符类型的考察
  6. A1055[The World's Richest]好题
  7. win7工作组无法查看计算机名,win7系统无法查看工作组计算机怎么解决
  8. php指令,php命令行下的常用命令
  9. Java数据结构:数组模拟的队列(Queue)和环形队列(Circle Queue)
  10. Python(七):输入输出(IO)、文件读写