一、USB传输、事务、包的关系
USB传输、事务、包是从不同层次上去说明一次数据交互的三个概念。
举个例子可能更好些,“某领导和一个早起的程序员进行了一次交流,说了5件事”。
OK,其实这里的"这次交流"就相当于USB的一次传输,"说了5件事"就相当于这次传输过程中的5个事务,当然每件事肯定有若干句对话,就相当于每个事务里面的各种包。
其实通讯协议就是如此,都是从现实生活中抽象出来的,任何通讯协议都可以类比现实生活中人与人之间的交流方式。
二,传输
USB协议定义了四种传输类型:控制传输、中断传输、批量传输以及等时传输。其中,批量传输、等时传输、中断传输每传输一次数据就是一个事务;控制传输分为2~3个阶段:建立阶段、数据阶段(无数据控制没有此阶段)以及状态阶段,其中建立阶段和状态阶段分别是一个事务,数据阶段则可能包含多个事务。根据数据阶段的数据传输方向,控制传输又可分为3种类型:控制读取(读取USB描述符)、控制写入(配置USB设备)以及无数据控制。
①控制传输(Control Transfers): 非周期性,突发。用于命令和状态的传输。
②中断传输(Interrupt Transfers): 周期性,低频率,允许有限延迟的通信 如人机接口设备(HID)中的鼠标、键盘、轨迹球等
③批量(大容量数据)传输(Bulk Transfers): 非周期性,突发大容量数据的通信,数据可以占用任意带宽,并容忍延迟 。如USB打印机、扫描仪、大容量储存设备等
④等时(同步)传输(Isochronous Transfers): 周期性、持续性的传输,用于传输与时效相关的信息,并且在数据中保存时间戳的信息 ,如音频视频设备
其中,批量传输、同步传输和中断传输每传输一次数据都是一个事务,控制传输包括3个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。
三,事务
在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transation)。事务通常由三个包组成:令牌包、数据包和握手包。
令牌包用来启动一个事务,总由主机发送;
数据包传送数据,可以由主机到设备或从设备到主机,方向由令牌包来指定。
握手包的发送着通常时数据的接收者,当数据正确接收时,发送握手信号,设备也可发送NAK握手包表示数据未准备好。
Transaction可以分成三类 :
Setup transaction:主机用来向设备发送控制命令
Data IN transaction:主机用来从设备读取数据
Data OUT transaction:主机用来向设备发送数据
在OUT和SETUP事务处理中,紧接在SETUP和OUT包后的是DATA包,DATA0和DATA1包是接替地发送的,在DATA包后面,设备将回应一个握手信号,(如果设备可以接受数据,就回应ACK包;如果设备忙,则回应NAK包;如果设备出错,则回应STALL包)。
在IN事务中,在IN包后面是设备发送的DATA包或NAK包或STALL包,(若设备忙或者出错,就发送NAK包或STALL包给主机;若设备数据准备好发送,则发送DATA包),DATA0和DATA1包也是交替发送的,紧接着DATA包后面的是主机发送给设备的握手包。(ACK表示主机可以接收数据,NAK包代表主机忙,STALL代表主机出错)
四,控制传输的结构
控制传输主要包括控制读传输、控制写传输、无数据控制传输三种, 如下图。
一次完整控制传输可以分为三个阶段:初始设置阶段—>数据阶段(可选)—>状态信息阶段。
(1)设置过程
初始设置阶段用于固定建立SETUP事务,标志一次控制传输的开始。
(2)数据传输过程
初始设置阶段中命令如果要求读/写数据,数据阶段就会在这一阶段来具体交换数据(如果没有数据交换要求则可省去数据阶段步骤,具体有SETUP事务标准请求命令决定,如下)。
主机如果是控制读数据请求,则数据阶段为一个或者多个IN事务;
主机如果是控制写数据请求,则数据阶段为一个或者多个OUT事务;
主机如果是无数据的控制请求,则没有数据阶段。
数据阶段是由一到多个IN/OUT事务组成。这是由于有时候存在一个事务传不完的数据,所以可能存在多个连续IN/OUT事务的情况,在同一次数据传输阶段中事务类型(读写)必定相同。
数据过程的所有数据事务必须是同一传输方向,一旦数据传输方向发生改变,就会认为是进入状态阶段。数据过程的第一个包必须是DATA1包,然后每次正确传输一个数据包后就在DATA0和DATA1之间替换。
3)状态过程
状态过程用来表示整个传输的过程已完全结束。(过程类似数据传输过程,但传输方向相反,且状态过程只使用DATA1包).
状态传输的方向必须与数据传输方向相反,即原来是IN令牌包,则这个阶段应为OUT令牌包。对于控制读取而言,主机会发送OUT令牌包,其后为0长度的DATA1封包,此时,设备也会做出相对应的动作,送ACK、NAK或STALL握手封包。对于控制写入传输,主机会送出IN令牌包,然后设备送出表示完成阶段的0长度的DATA1封包,主机再做出相应的动作;送ACK、NAK或STALL封包。
4.1 控制读传输抓包分析
控制读传输在初始设置阶段会发起一个SETUP事务,从这个SETUP事务我们可以知道是设备给主机传输数据,并且数据长度是255,这里把先控制传输理解到位,接着在数据阶段完成数据交换(因为是设备给主机传输数据,所以是数据阶段是IN事务),最后在状态信息阶段主机给设备发送一个OUT事务表明自己接收是否异常。
4.2 写控制传输抓包分析
控制写传输在初始设置阶段同样会发起一个SETUP事务,从这个SETUP事务我们可以知道是主机向设备传输数据,并且数据长度是12,接着在数据阶段完成数据交换(因为是主机给设备传输数据,所以数据阶段是OUT事务),最后在状态信息阶段主机发起一个IN事务,请求设备回答接收情况。
五,等时传输
等时(同步)传输适用在数据量大、对实时性要求高的场合,如音频设备,视频设备等,这些设备对数据的延迟很敏感。对于音频或视频设备数据的100%正确性要求不高,少量的数据错误是可以容忍的,主要是保证数据不能停顿,所以等时传输是不保证数据100%正确的。
实时传输只需要令牌和数据两个信息包,没有握手应答包,故当数据错误时,不再重传操作。数据是否正确,由数据的CRC校验来确认。同步传输也不支持PID翻转。主机在排定事务传输时,同步传输有最高的优先级。
5.1 同步传输的结构
同步传输的事务比较简单,有只有1个阶段,数据阶段。
主机如果是同步读数据请求,则数据阶段为一个或者多个IN事务(同步传输事务,事务到后面讲解);
主机如果是同步写数据请求,则数据阶段为一个或者多个OUT事务;
数据阶段是由一到多个IN/OUT事务组成。这是由于有时候存在一个事务传不完的数据,所以可能存在多个连续IN/OUT事务的情况,在同一次数据传输阶段中事务类型(读写)必定相同。
5.2 同步读传输抓包分析
因为是设备给主机传输数据,所以是数据阶段是IN事务。
因为是主机给设备传输数据,所以是数据阶段是OUT事务,和上图方式一样,只是IN变为了OUT。
六 ,批量传输
批量传输和同步传输类似,是使用批量事务(Bulk Transactions)来传输数据。批量读使用批量输入事务,批量写使用批量输出事务。批量传输通常在数据量大、对数据的实时性要求不高的场合,例如USB打印机、扫描仪、大容量存储设备等, 批量传输可以占用任意可用的数据带宽。
批量传输主要包括批量读传输、批量写传输两种, 传输事务如下图。
6.1 批量读传输抓包分析
因为是设备给主机传输数据,所以是数据阶段是IN事务。
6.2 批量写传输抓包分析
因为是主机给设备传输数据,所以是数据阶段是OUT事务,如下图
批量传输不支持在低速下,高速最大包长度为512字节,全速下为64字节。
七,中断传输
中断传输方式总是相对于设备查询的,以确定是否有数据需要传输,因此中断传输的方向总为从USB设备到主机。中断传输由IN或OUT事务组成。中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于这个时间间隔的范围内安排一次传输。这里说的中断与硬件上的中断不同,他不是由设备主动发起的一个中断请求,而是由主机保证不大于某个时间间隔内安排一次传输。
中断传输在流程上除不支持PING 之外,其他的跟批量传输是一样的。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。
主机在排定中断传输任务时,会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。
同样中断传输也采用PID翻转的机制来保证收发端数据同步。
7.1 中断传输的结构
中断传输的事务只有1个阶段,数据阶段。
主机如果是中断读数据请求,则数据阶段为一个IN事务;
主机如果是中断写数据请求,则数据阶段为一个OUT事务。
7.2 中断读传输抓包分析
因为是设备给主机传输数据,所以是数据阶段是IN事务。
八,传输总结
下图主要对四种传输不同传输速率的有效带宽、最大数据包长度、传输错误管理、事务组成进行说明