では実際の転送はどうか? ということで、図1がIN Transaction Bursting、つまりDevice→Hostの転送である。この場合、まずHostからDeviceにN個のPacketを転送せよというリクエストが届き、これに応じてDeviceはHostに対してN回、Packetを送出する。

ちなみに1回ごとにAckの返答がHostから返ってくるという、非常に真っ当なHandshakeを実装している。USB 2.0までと異なり、送受信を完全に全二重で行えるから、送受信の切替に要するオーバーヘッドが皆無である。なので、受信データを完全に受け取り、かつエラーがない事が確認できたら、即座にACKを返す事が出来る。なので、こうしたHandshakeでも問題がないという判断と思われる。

そして通信の終了条件は、

  • 全DATAをエラー無く転送し終わった。
  • EndpointのMaximum packet size未満のpacketを送信した。
  • Endpointのエラー。

のいずれかが発生した場合となっている。

同様にOUT Transaction Bursting、つまりHost→Deviceの転送を図2に示す。こちらは最初にHostからOut burstを指示した後は、Data Packetを延々と送り続け、その度にAckがDeviceから返されるというHandshakeになっている。

ちなみにこのBurstingは、最大16 Packetまでの転送をサポートしている。では1 Packetあたりの最大サイズは? というと、1024Bytesとなっている。これはUSB 2.0で追加された仕様である。元々USB 1.1の時には、1 Frameあたり1回の転送しか行えなかった。

Frameというのは前回ちょっと出てきた、SOFに絡む話だ。Frameとは、1 Deviceの転送に割り当てられる1回あたりの時間の事で、これが1msとされている。つまり毎秒あたり1000デバイス分の転送枠が用意されている。ただUSB 1.1の世代はこれで良かったが、USB 2.0ではこれだと時間間隔が長すぎて効率的ではない。そこでこれを更に8等分した、High Speed Micro-Frameというものが用意され(つまりFrameは125μs)、これを単位に転送を行う事になる。つまり毎秒あたり8000デバイスまでの通信が可能だ。

さて話を戻す。USB 1.1の時代は最大でも12Mbpsだったから、1msといえば12Kbit=1.5KB相当で、実際はPacketのオーバーヘッドなどを考えるとここまで性能が出ないわけで、それほどゆとりがあるという訳でもなかった。ところがUSB 2.0では480Mbpsだから、1msのFrameなら480Kbit=60KB、High Speed Micro-Frameでも60Kbit=7.5KBに相当する。これだけあれば、相当Packetを流せそうなものだが、1 Frameあたり1 Packetに制限されていると、かなり大きなPacketにしないと効果的な転送は出来ない。そこでUSB 2.0では1 Frameの中で最大3 Packetまでデータ転送を行えるように変更された(Photo01)。Packet SizeそのものをいじるとUSB 1.1との互換性が取れなくなってしまう。なのでPakcet Sizeそのものは増やさず、Packetの数を増やす形で効率をあげよう、という仕組みだ(ちなみにこの仕組みに対応したEndpointを、High-Speed, High Bandwidth Endpointと呼ぶ)。

Photo01: Universal Serial Bus Specification 2.0のFigure 5-11より抜粋

ついでにPhoto01を説明しておくと、このDATA0/DATA1/DATA2というのは、PacketのID(PID)である。これは複数Packetの同時転送を行った際にエラーを検出したとしても、全部のPacketが同じIDだと区別できないため、全てのPIDを変える事でエラー検出できるようにしよう、というものだ。

さて話をUSB 3.0に戻す。USB 3.0ではFrame/Micro-Frameの時間幅そのものは変更されない。これは互換性を考慮しての事だが、この結果さらに効率が悪化することが予測される。なにしろ今度は実効4Gbpsだから、1msで4Mbit=500KB、Micro-Frameでも62.5KBである。62.5KB分のスペースで1KBかそこら転送しても、全然性能は上がらない。

そこでUSB 3.0では、この1 Micro-Frameの間に最大16×3×1024=48KBの転送が可能になった。Packet Sizeは1024Bytesで、USB 2.0と同様に3 Packetの同時転送を許し、更にBurstでこれを16回連続して行えるようにする、というものだ。設計目標では、EndpointがAverageでBandwidthの80%程度を活用できるようにする事になっており、実際48÷62.5=0.768だから、かなり80%に近い数字になっている事が判る。

(続く)