それでは実際のSMB/CIFSプロトコルの例を見てみよう。以下は、クライアント(UXPC23というコンピュータ)からサーバ・コンピュータ(SERVER07)のCという公開リソースに接続して、ファイルを書き込もうとしているところである。ネットワーク・モニタでパケットをキャプチャして解析してみた。
[説明]欄の最初に表示されている[C]と[R]の文字は、それぞれ「Command(コマンド)」と「Response(応答)」を表している。CとRが交互に並んでいることから分かるように、クライアントから送信したコマンドに対して、サーバ側から応答を返し、それが何度も繰り返されて処理が進む。
このファイル・アクセスの大まかな流れを述べると、次のようになる。最初の3つの処理については前回の記事も参照にしていただきたい。
(1)プロトコルのネゴシエーション
サーバのリソースを利用するためには、最初にお互いのサポートしているSMB/CIFSプロトコルのバージョンのすり合わせを行わなければならない。これを行うのが「Negotiate」というコマンドである(図中の(1))。クライアントが自身のサポートしているダイアレクトの一覧をサーバに渡すと(このクライアントは「NT LM 0.12」という最高レベルのダイアレクトまでサポートしている)、それに対して「Dialect # = 5」という応答を返している。これは「NT LM 0.12」をサポートしているということを表している。
(2)セッション・セットアップ
次はサーバとクライアント間でSMB/CIFSプロトコルの通信のためのセッションを開設する。それが「session setup & X」というコマンドである。最後に付いている「& X」という文字列は、先ほどのコマンド一覧にある「SMB_COM_SESSION_SETUP_ANDX」の最後の「_ANDX」を意味している。_ANDXは、その後にまだ別のコマンドが続くので、それらは連続して(不可分に)実行しなければならない、ということを表している。
(3)IPC$リソースへのツリー・セットアップ
セッションを開設したら、次はサーバ側のリソースに、「ツリー・セットアップ」という操作を行う。Windows OSでは、最初に「IPC$」というリソースに接続し、この時点でユーザー名とパスワードを使った認証を受ける。これが許可されればそのリソースへのアクセスが許可される。この例では、「R connect & X, Type = IPC」という応答が戻ってきているが、これはエラーが発生せずに、正しく接続できたということを表している。このコマンドに限らず、何らかのエラーが発生した場合は、この[説明]欄に「R コマンド名 - error, code = (番号) エラー・メッセージ」といったメッセージが表示されるので、すぐに分かるようになっている。
(4)Cドライブ・リソースへのツリー・セットアップ
(3)はユーザー認証のためのツリー・セットアップであったが、この認証が許可されると今度は、実際に利用したいリソースに対するツリー・セットアップを行う。この例では「\\SERVER07\C」というリソースに対してツリー・セットアップを行い、ファイルを書き込もうとしている。
(5)ファイルの作成要求の送信
「C NT create & X, File = ファイル名」は、ファイルを書き込みモードで作成するというコマンドである。コピー先のファイルをこうやって用意し、そこにデータを書き込むことによって、ファイル・コピーを実現している。コマンドの応答の「R NT create & X, FID = 番号」にあるFIDとは、ファイルをアクセスするためのID番号(File ID)である。ファイルのオープンや作成が成功すると、サーバからFID番号が返ってくるので、以後のファイル・アクセスではこの番号を指定してファイルを特定し、データを読み書きする。
(6)ファイル・データの書き込み
ファイルの作成が成功したら、次は「C write &X, FID = 番号、Write サイズ at オフセット」コマンドを使って順次データを書き込む。「番号」はFID、「サイズ」は、書き込みデータのサイズ(SMBパケットで送信するデータ部分のサイズ)、「オフセット」はファイル上の書き込み位置をそれぞれ表している。この例では、ファイルの先頭(オフセット0x00000000の位置)から、0x7a00 bytes書き込もうとしている。
以上で解説した以外にも、サーバとクライアント間でいくつかのSMB/CIFSコマンドがやりとりされているが、これらは、エクスプローラや(コマンド・プロンプトの)COPYコマンドが、コピー前にファイルが存在するかどうかや、ファイルの一覧などを確認するために実行しているものである。エクスプローラやコマンド・プロンプトなどでファイル・サーバをアクセスし、その様子をネットワーク・モニタでキャプチャすると、おどろくほど多くのパケットがやりとりされていることが分かるだろう。特にエクスプローラでは、ファイル名を表示するだけでなく、場合によってはファイルの概要をポップアップ表示させたりするために、ファイルの一部を読み出すこともあるので、非常に多くのネットワーク・トラフィックが発生する可能性がある。
今度はある1つのSMB/CIFSパケットの構造について、より詳しく見てみよう。上の(5)のファイル作成コマンドを詳細表示させたのが次の画面である。
このコマンドに対するサーバ側の応答は次のようになっている。ファイルを作成すると、サーバはFID(ファイルID)と呼ばれる数値を返す(この例では0x4007となっている)。以後のファイル・アクセスでは、このFIDを指定してコマンドをやりとりする。
以上簡単であるが、SMB/CIFSプロトコルに関する解説は今回で終わりとする。これ以上の詳細(各コマンドの動作の詳細やパラメータ、エラー・コードなど)については、前回挙げたリンクを参考にしていただきたい。またドキュメントを参照するだけでなく、Windows Server OSに付属のネットワーク・モニタを使って、実際のネットワーク・パケットをキャプチャして調査するのもよい勉強になるだろう。
次回は、ブラウザ・サービスについて解説する。
Copyright© Digital Advantage Corp. All Rights Reserved.