次にData-out(Host→Device)の転送シーケンスである。大雑把な枠組みはData-inの場合と非常に似ている。まずPhoto01がUSB 2.0の場合で、まずCommandを受け取ったUAS DriverはITr(Stat)とOTr(CIU)を発行、EHCI Controllerはこれを分解してまずIN(Stat)を発行、NAK(Stat)を受け取った後でOUT(Cmd)とDATA(CUI)を発行し、DeviceからまずCmdのACKを受け取った後に、今度はDATAでWRIU(Write Ready Information Unit)を受け取る。RRIUがWRIUに変わるのがData-inとの唯一の相違点である。

Photo01: USB Attached SCSI Protocol(UASP) Revision 1.0のFigure 4から抜粋

実際の転送も、Data-inの場合によく似ている。再びITr(Stat)と、今度はOTr(Data-Out)をUAS Driverは発行する。これをEHCI ControllerはIN(Stat)の後にOUT(Data-out)をまず発行、次いでDATA(Data-out)でデータそのものを送り出す。Deviceはこの2つを正しく受信したらACK(Data-out)を送り返して、正しく受信できたことをECHI Controllerに通知する。以後データが続く限りこのシーケンスが繰り返されるわけだ。

データ送出が完了したら、最後にECHI ControllerはIN(Stat)を送り出し、これに対してSIUが返されることで転送は終了である。制御は再びECHI Driver経由でUAS Driverまで戻され、ここで最終的に書き込み完了を上位アプリケーションに返すという仕組みとなっている。

これがUSB 3.0になるとハンドシェイクがぐっと減る、ということもまた同じである。Photo02がUSB 3.0の場合であるが、UAS DriverはITr(Stat)とOTr(Data-Out)、OTr(CIU)をまとめて発行する。これをxHCI Controllerは順に発行する形になるが、まず発行されるIN ACK(Stat,Prime)はData-in pipeをIdle stateに遷移させることになり、これによりDeviceにデータ受信の用意をさせる。次いで発行されるDP(Data-out)も、結果としてData-out pipeをPrime stateに遷移させると共に、Deviceに対してHostがデータ送信準備完了状態にあることを通知する。続いて送られるDP(Cmd)に対してACKを返す時点でData-out pipeは再びidle stateに戻り、あとはデータ転送開始を待つだけである。

Photo02: USB Attached SCSI Protocol(UASP) Revision 1.0のFigure 8から抜粋

Device側の準備が整ったら、DeviceはERDYをHostに返し、これを受け取ったらHost(というかxHCI Controller)はDPでテータを転送、DeviceはACKを送り返して正常受信を伝達する。このハンドシェイクが、データ書き込みが終わるまで続くわけだ。所定量のデータ転送が完了したら、Deviceは(直前に受信したDPに対する)ACKを返した後で、ERDY(stat)を送り出し、これにより転送は完了する。最後にERDYに対するACKをxHCI Controllerが送り出し、DeviceがDP(SIU)を送り出して終了である。xHCI ControllerはSIUをITc(Stat)として上位に返し、これが最終的にUAS Driverまで渡され、書き込み完了を上位アプリケーションに送り返して終了という事になる。

オーバーヘッドがどの程度減るか、というのは(これもData-In同様に)Deviceの種類に依存するだろう。たとえばDeviceがWrite Cacheを持っている場合は、すぐにでも転送が掛けられるだろうから、USB 3.0の場合だとACK(Cmd)を返した直後にERDY(Data-out)を返すことも理論上は可能である。こうした場合は、要求を出してから実際に転送を行うまでの時間が大幅に減るため、USB 3.0でのオーバーヘッド削減の効果は体感しやすいだろう。また実際に転送をかけているときの帯域で言えば、USB 2.0ではOUT(Data-out)→DATA(Data-out)→ACK(Data-out)という3-Way handshakeになるが、USB 2.0ではDP(Data-out)→ACK(Data-out)という2-Way handshakeとなる。転送量そのものでいえばOUT(Data-out)はたいした分量ではないが、転送を1回余分に掛ける必要があるのは間違いなく、これを省ける分だけ性能を上げやすいと思われる。

もっとも転送のBandwidthはプロトコルよりもむしろDeviceのCacheの種類や容量に依存しそうだ。もしDeviceが十分な量のWrite back Cacheを持っていれば、転送は全て一旦キャッシュに蓄えられ、その後時間を掛けてDeviceに書き戻される形になるから、早期にUSBは開放される。が、キャッシュの容量が不十分とかWrite Throughだった場合、DATA(Data-out)なりDP(Data-out)なりで1回分の転送を行うと、そこから実際にDeviceへの書き戻しを行い、完了したところでACKが返されることになる。従って実際にはDeviceのAccess速度がモロに効いて来る形になる。こちらもやはりHDDでは明確な差は出にくく、やはりSSDでその性能差が明確に見える形になるだろう。

(続く)