SMB/CIFSプロトコルのパケットの構造やコマンド・コードの詳細。Windowsネットワークのトラシューには必須の情報だ。
■連載目次
第1回 Windowsネットワークの舞台裏
第2回 レイヤ・モデルとファイル共有
第3回 NetBIOSを理解する(1)
第4回 NetBIOSを理解する(2)
第5回 NetBIOSの通信の実際
第6回 TCP/IP始めの一歩
第7回 IPアドレスとネットマスク
第8回 アドレス・クラスとIPアドレス
第9回 IPルーティング
第10回 IPパケットの構造
第11回 MACアドレスを解決するARP
第12回 TCP/IPを支えるICMP
第13回 データグラム通信を実現 UDP
第14回 信頼性を実現するTCP(1)
第15回 信頼性を実現するTCP(2)
第16回 信頼性を実現するTCP(3)
第17回 LLCとNetBEUI
第18回 NetBIOS over TCP/IP(1)
第19回 NetBIOS over TCP/IP(2)
第20回 ファイル共有SMB/CIFS(1)
第21回 ファイル共有SMB/CIFS(2)
第22回 ファイル共有SMB/CIFS(3)
第23回 ブラウザ・サービス
今回はSMB/CIFSプロトコル解説の最後として、SMB/CIFSパケットの構造やコマンド・コード、SMB/CIFSプロトコルの例について見ていく。
SMB/CIFSプロトコルで定義されているコマンドの一覧は、いくつかのカテゴリに分けられる。主なカテゴリとしては次のようなものがある。
セッション管理 | SMB/CIFSサーバの利用開始におけるセッションの接続や切断などの管理 |
---|---|
ファイル/フォルダ操作 | ファイルやフォルダの読み出しや書き込み、作成、削除などの操作。SMB/CIFSのバージョン(ダイアレクト)により、サポートされている機能に差がある(以下同じ) |
属性操作 | ファイル属性の読み出しや設定 |
スプール操作 | プリンタ・スプールの操作 |
ファイル・ロック操作 | 多重アクセス時の排他制御 |
セキュリティ/認証 | ユーザー認証やアクセス・コントロール・リストの設定/操作など |
DFSサポート | 分散ファイル・ステムDFSの操作。Windows NT以降のOSでのみ利用可能 |
プロセス間通信(IPC) | メール・スロット(ファイルと似た操作でメッセージをマルチキャストする機能)や名前付きパイプ(ファイルと似た操作で相互通信する機能)による、プロセス間通信機能(2つのプロセス間で通信を行う機能)のサポート |
デバイス・サポート | COM:ポートなどのハードウェア・デバイスのサポート |
主なSMB/CIFSプロトコルの機能 |
なおSMB/CIFSプロトコルでは、物理的なファイルのほかに、名前付きパイプやメール・スロットといったプロセス間通信機能も扱うことができるが、RPCや、より高度なネットワーク・サービス(WINSやネットワーク・ブラウザ・サービスなど)については特に規定されているわけではない。これらのサービスはSMB/CIFSプロトコル上で名前付きパイプなどを使って実装されたサービスであり、SMB/CIFSプロトコルから見れば、単なる上位アプリケーションにすぎない。
SMB/CIFSプロトコルにおける通信の形態は、いわゆるサーバ/クライアント方式であり、図にすると次のようになる。
クライアントから送信されたコマンドはサーバで1つずつ処理され、結果がクライアントに返される。一般的なコマンドでは1つのコマンドに対して1つの応答が返されて処理が完結するが、場合によっては複数回のコマンドのやりとりが発生することがある。例えば転送効率を上げるために大きなデータ・ブロックで読み書きすることもあるし、ファイル名の検索結果を返す場合には、一致するパス名をすべて返すために、何度かやりとりが行われる。またこれとは逆に、パケットの送受信回数の総数を抑えるために、連続する何個かコマンドをまとめて1つのパケットにまとめる場合もある。
SMB/CIFSプロトコルは、下位のトランスポート層プロトコルとして、NetBIOSのセッション・サービスを利用するものと、TCPのポート445番を直接利用するものの2種類があることはすでに述べた。この2つを分類して、前者をSMB、後者をCIFSと呼ぶことがあるが、現在では特に区別せず、まとめてSMB/CIFSプロトコルと呼ばれている。本連載でも、特に断らない限り同じものを指すことにする。
SMB/CIFSプロトコルで利用されるパケット構造は、以下に示すように、SMBでもCIFSでもほぼ同じであるる。トランスポート層のペイロード部分(データ格納領域)の先頭には、SMBの「データ長」を表すフィールドが用意されている。このデータ長は、SMBのヘッダ部分とSMBのデータ部分を合わせたサイズを表しており、トランスポート層プロトコルからペイロード部分を取り出しても、そのSMB/CIFS部分のサイズを容易に知ることができる。
データ長フィールドに続いてSMBのデータ(ヘッダ+データ)が置かれている。具体的なパケットの構造は次のようになっており、先頭の32bytesはコマンドによらずほぼ同じ内容になっている。33byte目から先は、コマンドで利用するパラメータや読み書きするデータなどに使われ、コマンドごとにその内容は異なっている。
以下簡単に、SMB/CIFSヘッダ中の各フィールドについて説明しておく。
■IDデータ(先頭4bytes)
SMBパケットの先頭には、SMB/CIFSプロトコルのパケットであることを示す4bytesの特別な識別用文字列データが置かれている。先頭は0xffで、その後に“SMB”と続いているので、パケットをダンプして解析したりする場合には、パケットの先頭を見つける目印として役に立つ。
■コマンド(1byte)
サーバに対するコマンドを表すコード(番号)を指定する。SMB/CIFSプロトコルでは100個近いコマンドが定義されている。詳細は後述。
■エラー・クラス(1byte)
エラーのクラス(種類)。DOSエラーやサーバ側のエラー、ハードウェア・エラーなどの分類を表す。エラーなしの場合は0。
■エラー・コード(2bytes)
エラー・コード。エラーなしの場合は0。エラー・クラスごとにエラーの原因を表すコード。詳細は後述。
■フラグ/フラグ2(1byte/2bytes)
コマンドに対する補助フラグ・データ。例えばこのパケットがクライアントからサーバへのコマンドか、それともその逆の応答であるかどうかや、パス名の大文字/小文字を無視するかどうかの設定といった設定が含まれる。
■ツリーID(TID)(1byte)
ツリーID。詳細については前回の記事を参照。
■プロセスID(PID)(1byte)
プロセスID。このSMB/CIFSプロトコルを呼び出したプロセスの識別番号。詳細については前回の記事を参照。
■ユーザーID(UID)(1byte)
ユーザー(セッション)ID。このSMBセッションで利用される認証ユーザーの情報。詳細については前回の記事を参照。
■マルチプレックスID(MID)(1byte)
マルチプレックスID。同一のサーバ/クライアント間で、複数のコマンドを多重化(マルチプレックス)して送受信する場合に、どのプロセスから送受信されているかを識別するためのID。
■ワード・データとバイト・データ(可変長)
コマンドごとのパラメータや読み書きするデータ、拡張コマンド・コードなど。コマンドごとに内容は異なる。それぞれデータ部分の長さを表す「ワード・カウント」と「バイト・カウント」に続いて、データ部が続く。
Copyright© Digital Advantage Corp. All Rights Reserved.