与几乎所有其他类型的通信接口一样,USB被实现为协议栈。USB标准本身定义了所有或多种类型的设备共有的堆栈中的级别,这既可以实现兼容性,又可以防止每个设备进行冗余协议设计。此外,该协议的每一层都提取了下一层不需要担心的细节。因此,当您实际编写设备特定的层时,您仅具有通用的“发送”和“接收”功能即可将数据从端点A传输到端点B。作为设备设计人员,您不必在意这是怎么发生的。此外,协议栈中的较低级别可以更改实现,只要它们向其上方的层公开一个公共接口即可。这样,当协议栈的一部分发生更改时,协议栈的其余部分不必更改。在堆栈的较低级别使用哪种协议。一般而言,堆栈中的每个连续层都将在发送消息时将第二层生成的消息封装在其自身的有效负载字段中。收到消息后,每一层都会剥离与该层相关的部分,并将其有效负载转发到堆栈中的下一个适当的层。这不仅适用于USB,而且适用于几乎所有通讯总线。例如,TCP / IP /以太网堆栈可能是最常用的堆栈。给定层通常负责的任务在模型中描述,例如OSI模型。
在USB中,有一个物理层协议定义了电压状态/时序/等。以及如何解释它们。显然,此协议本身必须是USB标准的一部分,而不是特定于给定设备的(特别是因为主机无法知道将要插入给定USB端口的设备类型)。
接下来,有一个总线管理协议,用于描述谁可以在总线上通话。在OSI模型中,这称为媒体访问层。在USB中,这一层几乎可以归纳为“设备可以在主机通知时发送数据”,因此USB中的这一层没有特别复杂的协议。
接下来,有一个用于描述数据包以及如何将其从发送方路由到接收方的标准协议。该层也必须是USB标准本身的一部分,以便在主机实际知道特定类型的设备之前就可以进行初始通信,以发现已连接的设备类型。除了在此层具有特定ID的每个设备外,USB中还包含端点ID的概念。这允许任何给定的设备具有多个USB端点,这些端点通过标准USB堆栈进行多路复用和多路分解,这与套接字通过标准TCP / IP堆栈进行多路复用和多路分解的方式非常相似。应用程序可以将这些端点中的每一个视为单独的数据流。
最后,还有为设备本身定义的协议。请注意,实际上,一些通用的使用案例(例如大容量存储设备,鼠标,键盘等)已包含在USB标准中,作为USB标准的一部分,因此每个设备制造商都不必重新发明它们。轮。但是,更复杂的设备可以在此层自由设计自己的自定义协议。对于给定的传输,该层的输出在上一层作为数据包的有效负载传递。请注意,对于足够复杂的设备,协议的特定于设备的部分本身可以分为多个独立的层,但是较低的级别不必知道或关心它。他们需要知道的是,他们需要将一组给定的字节从主机传递到特定的设备端点,或从特定的设备端点传递到主机。同样,在各层之间具有标准接口可以使关注点分离,因此一层不必关心另一层的内部工作原理,而只需要关注应该传递给或期望从其上一层或另一层接收的特定数据即可。在堆栈下面。