他のほぼすべてのタイプの通信インターフェイスと同様に、USBはプロトコルスタックとして実装されます。。すべてまたは複数のタイプのデバイスに共通するこのスタック内のレベルは、USB標準自体によって定義されます。これにより、互換性が可能になり、各デバイスが冗長なプロトコル設計を行うことができなくなります。さらに、プロトコルの各層は、次の層が心配する必要のない詳細を抽象化します。したがって、実際にデバイス固有のレイヤーを作成するときは、エンドポイントAからエンドポイントBにデータを取得する汎用の「送信」および「受信」機能が必要です。デバイス設計者は、気にする必要はありません。それがどのように起こるか。さらに、プロトコルスタック内の下位レベルは、上位のレイヤーへの共通インターフェイスを公開している限り、実装を変更できます。このように、プロトコルスタックの一部が変更されても、スタックの残りの部分は必ずしも変更する必要はありません。これはプロトコルスタックのいくつかの低レベルで使用されています。一般的に言えば、スタックの下の各連続層は、メッセージが送信されるときに、自身のペイロードフィールド内で次に高い層によって生成されたメッセージをカプセル化します。メッセージが受信されると、各レイヤーはそのレイヤーに関連する部分を剥離し、そのペイロードをスタックの次の適切なレイヤーに転送します。これは、USBだけでなく、ほぼすべての通信バスにも当てはまります。たとえば、TCP / IP / Ethernetスタックがおそらく最も一般的に使用されています。与えられたレイヤーが一般的に担当するタスクは、OSIモデルなどのモデルで説明されています。
USBには、電圧状態/タイミングなどを定義する物理層プロトコルがあります。ワイヤ上でどのように解釈されるべきか。このプロトコルは、明らかに、特定のデバイスに固有ではなく、USB標準自体の一部である必要があります(特に、ホストは特定のUSBポートに差し込まれるデバイスの種類を知る方法がないため)。
次に、誰がいつバスで話すことができるかを説明するために使用されるバス管理プロトコルがあります。これは、OSIモデルではメディアアクセスレイヤーと呼ばれます。USBでは、この層は「ホストから指示されたときにデバイスが送信できる」と要約できるため、USBのこの層には特に複雑なプロトコルはありません。
次に、データのパケットと、送信者から受信者へのルーティング方法を記述するための標準プロトコルがあります。この層は、USB標準自体の一部である必要もあるため、特定の種類のデバイスがホストによって実際に認識される前に、どの種類のデバイスが接続されているかを検出するための初期通信を行うことができます。この層に特定のIDを持つ各デバイスに加えて、USBにはエンドポイントIDの概念もあります。これにより、特定のデバイスが複数のUSBエンドポイントを持つことができ、それらは標準のUSBスタックによって多重化および逆多重化されます。これは、標準のTCP / IPスタックによってソケットが多重化および逆多重化されます。アプリケーションは、これらの各エンドポイントを個別のデータストリームとして扱うことができます。
最後に、デバイス自体に対して定義されたプロトコルがあります。実際には、大容量記憶装置、マウス、キーボードなどの一般的なユースケース用のUSB標準の一部として含まれているいくつかの一般的な事前に設計されたものがあるため、すべてのデバイスメーカーが再発明する必要はありませんホイール。ただし、より複雑なデバイスは、この層で独自のカスタムプロトコルを自由に設計できます。特定の伝送に対するこの層の出力は、前の層でデータパケットのペイロードとして渡されます。十分に複雑なデバイスの場合、プロトコルのデバイス固有の部分自体が複数の独立したレイヤーに分割される場合がありますが、下位レベルはそれについて知ったり気にしたりする必要はありません。知っておく必要があるのは、ホストから特定のデバイスエンドポイントまたは特定のデバイスエンドポイントからホストに特定のバイトセットを渡す必要があるということだけです。繰り返しますが、レイヤー間に標準インターフェースがあることで懸念を分離できるため、あるレイヤーは別のレイヤーの内部動作を気にする必要はありませんが、すぐ上のレイヤーまたはスタック内のその下。