USBを挿せばどのデバイスであろうと、
ドライバをインストールする必要が
ないのでとても便利です。
ある日、USBデバイスとPCが
どういう通信をしているか、
覗いてみたかったことから
wiresharkでキャプチャしてみました。
今回はどのようにキャプチャしたのか、
その方法とともに簡単に紹介します。

WiresharkでUSBメモリのパケットをキャプチャ!
まず、Wiresharkを起動させると上記のような画面が開きます。USBPcapもインストールされていると、USBもキャプチャ出来るようになります。wiresharkをインストールするときに、USBPcapも一緒にインストールするか聞かれるので、していおて損はないかと思います。
大切ではないですが、一応キャプチャした環境も簡単に載せておきます。
・SurfaceのノートPC(Windows)
・BUFFALOのUSB3.1(16GB)
次に、USBPcap1のところをダブルクリックすると、実際にキャプチャが開始されます!
今回私は、USBメモリをPCに挿し、何かフォルダを転送させるといったことはせずに、"何もしない状態"でキャプチャを開始させてみました。フォルダの転送しているときなどのキャプチャは次回やってみます。

上のキャプチャは、キャプチャ開始してから、すぐにキャプチャ停止させたものです。
Timeのところを見てください!!ただUSBメモリを接続しているだけなのに、ホスト(PC)とUSBメモリ間でこんなに高速で、しかも頻繁にPCと通信しています。PCとUSBデバイスは、いつも仕事しているんですね(笑)
ここで次に疑問に思ったのが、「どういう通信を行っているのか?」ということです。

では具体的にその中身を見てみましょう!
通信に使われていたプロトコルは上記の内容でした。当たり前なのかもしれませんが、USB規格のプロトコルだけでした。
SCSI(Small Computer System Interface)が、USBに含まれていますが、調べて分かりました。最初SCSIの文字を見たとき、「あれ、SCSIは古い規格だったよな、、、?」と思いました。調べて分かったのですが、USBプロトコルスタックの上位層でSCSIコマンドを採用しているそうです。SCSIコマンドについて少し調べてみたので、後述します。
あとはUSB Mass Storageと書いてありますが、これはUSBのクラスドライバの一つです。
そもそもUSBは、キーボード、マウス、プリンター、補助記憶装置など、様々な種類のデバイスで使われています。そこで、クラスドライバとは、USB規格と各種デバイスを紐づけるためのドライバを指します。ドライバという一見難しそうな言葉が使われていますが、要はUSBデバイス開発者がプログラミングしやすいように、ある程度の機能をまとめたものです。
そしてUSB Mass Storageは、クラスドライバの一つで、主にメモリ系に使われます。その他のクラスドライバは、キーボード・マウスに使われるUSB HID(Human Interface Device)や、プリンターに使われるUSB Imageなどがあります。
下の画像を見てください。

"SCSI:Test Unit Ready"と書かれています。
これは、SCSIコマンドの一つです。周辺機器に何か動作(例えばデータ転送など)をしてもらうためには、基本的にはPCから指令を送ってやらなくてはいけません。なので、コマンドが必要なわけですが、USB(その中でもストレージ系)は、SCSIコマンドを採用しています。
今回はSCSIコマンド中でも、"Test Unit Ready"というコマンドを使用しているのが分かります。これは、PCがUSBメモリに対して、データ転送をすぐ開始できるか問い合わせしています。一回聞いてはいっ終わりではなくて、PCはUSBメモリに定期的に聞いています。
今回は使用出てこないですが他のSCSIコマンドもあります。USBメモリをPCにデータを読み出したりすると、書き出すためのコマンドがUSBメモリに送られます。このように、データを読み書きするコマンドや、エラーに関するコマンドなどがあります。
個人的にUSBメモリをただ挿しているだけで、PCと通信している、という実感がありませんでしたが、こうしてみてみると確かに、常にPCとやり取りしているんだな、って感じました。そういえば接続しているだけで、常にUSBメモリのLEDがピコピコ光ってますよね。
あとSCSIコマンドについて、すごく勉強になった記事があったので、そちらも載せておきます。IBM DeveloperWorksというサイトです。
あとwikipediaにもSCSIコマンドの一覧が載っていました。良ければ見てみてください!
今回はここまでです。
最後まで読んでいただきありがとうございました!
・Wi-Fiの通信もキャプチャ出来る!?
wiresharkでIEEE802.11のフレームをキャプチャしてみた!