第4回 NetBIOSを理解する(その2):基礎から学ぶWindowsネットワーク(3/3 ページ)
NetBIOSネットワークでは、TCP/IPにおけるIPアドレスの役割を「NetBIOS名」という16bytesの文字列が担っている。
NetBIOSネットワークに接続するコンピュータは、自分自身を識別するためのNetBIOSユニーク名を、ネットワークへの接続時に登録する決まりになっている。この際、すでに同じ名前を登録しているコンピュータがネットワーク内に存在するときはエラーが発生し、登録が拒否される。ただし名前の登録といっても、名前登録を一括して請け負うようなサーバが存在するのではなく、ネットワークに接続する(名前を登録する)各コンピュータが自身で名前テーブルを保持しており、自分が管理するNetBIOS名をそのテーブルの内部に記録(登録)する。新たに名前を登録しようとするコンピュータは、ブロードキャストを使って、その名前が衝突しないかどうかを検査する。
■登録に成功するケース
それでは、NetBIOS名の登録が成功する例と、失敗する例をそれぞれ図で説明しよう。まずは登録に成功する例から。
NetBIOS名の登録――登録に成功するケース
「PC02」と「PC03」というコンピュータ名を持つコンピュータが接続されたNetBIOSネットワークに対し、「PC01」という名前を登録するケース。名前の衝突は起こらないので、登録は成功する。
図から分かるとおり、これはネットワーク内に「PC02」と「PC03」というNetBIOSユニーク名を付けたコンピュータが存在しているところに、「PC01」という名前を登録するところである。コンピュータ「PC01」は、ネットワークの接続時に(システムの起動時に)、「PC01」という名前をパラメータとして指定し、NetBIOS名前関連サービスの「ADD NAME」APIを呼び出し、名前「PC01」が登録可能かどうかを調査する(名前「PC01」を登録しようとしていることを通知する)。するとNetBIOSトランスポート・ドライバは、ブロードキャストによって、ネットワーク内に存在するすべてのコンピュータ(つまりこの例なら「PC02」と「PC03」)に対し、「PC01」というNetBIOS名が登録可能かどうかを問い合わせるネットワーク・フレームを送信する。この送信処理は(ネットワークの設定などにもよるが)6回から10回繰り返される。
PC01からの名前登録通知を受けたPC02とPC03のNetBIOSトランスポート・ドライバは、それぞれ、自分がローカルで管理しているNetBIOS名前テーブルを検査し、これから登録されようとしている名前「PC01」と衝突する名前がすでに登録されていないかどうかをそれぞれ調査する。この例では、「PC02」「PC03」ともに名前の衝突はないので、いずれのコンピュータも特に応答は行わない。するとPC01のNetBIOSトランスポート・ドライバは、「PC01」という名前が登録可能だと判断し、自身がローカルに管理するNetBIOS名前テーブルに名前「PC01」を登録する。その後トランスポート・ドライバは、「ADD NAME」API呼び出しからリターンし、登録が正常に終了したことをパラメータとして返す。以上で名前「PC01」の登録が完了する。
■登録に失敗するケース
次は名前が衝突し、登録に失敗するケースを見てみよう。
NetBIOS名の登録――登録に失敗するケース
「PC01」と「PC03」というコンピュータ名を持つコンピュータが接続されたNetBIOSネットワークに対し、「PC01」という名前を登録するケース。すでに「PC01」という名前は登録されているので、先に「PC01」を登録したコンピュータが衝突を報告する。
登録が成功する先ほどのケースとの違いは、すでに登録されているコンピュータ名が「PC02」と「PC03」ではなく、「PC01」と「PC03」であることだ。先ほどと同じく、「PC01」を登録するための「ADD NAME」APIが呼び出されると、NetBIOSプロトコル・ドライバは「PC01」という名前が登録可能かどうかを問い合わせるフレームをブロードキャストによってネットワーク内の全コンピュータに送信する。
このブロードキャストを受信した各コンピュータは、要求された「PC01」という名前が、各自が管理するNetBIOS名前テーブルに登録されていないかを検査する。先ほどと異なり、今度はすでに「PC01」という名前を登録しているコンピュータがおり、このコンピュータは、名前「PC01」がすでに登録済みであることを、やはりブロードキャストによって通知する。名前「PC01」をあとから登録しようとしたコンピュータのNetBIOSプロトコル・ドライバは、名前の衝突が発生したことを知り、登録処理を中止してエラーを返す。
これまでの説明で分かるとおり、登録を要求する(正確には、ほかのコンピュータが該当する名前を持っていないかどうかを確認する)ブロードキャスト・フレームの送出や、これを受け取った各コンピュータによる名前テーブルの検査、衝突検出時の応答フレームの送出などは、すべてNetBIOSプロトコル・ドライバによって(非同期に)処理され、NetBIOSの上位にあるネットワーク・アプリケーションはこれらの処理には関知しない。
TCP/IPをベースとしたNBT(NetBIOS over TCP/IP)環境でWindowsネットワークを利用しているなら、各コンピュータが管理しているNetBIOS名前テーブルをコマンドラインのnbtstatコマンドで簡単に確認することが可能だ(NBT以外では、簡単にテーブルの内容を見るコマンドは用意されていない)。ローカル・コンピュータのNetBIOS名前テーブルの内容を確認するには、コマンド・プロンプトを起動して、「nbtstat -n」を実行すればよい。以下は、筆者が所属するWindowsドメイン・ネットワークのドメイン・コントローラ上でコマンドを実行した結果である。
ドメイン・コントローラ上でnetstat -nを実行したところ
netstatコマンドを使えば、現在のNetBIOS名前テーブルの内容を簡単に確認できる。「-n」オプションはローカル・コンピュータの名前テーブルを表示するオプション。
(1)ローカル・コンピュータのNetBIOS名前テーブルを表示するには、-nオプションを指定する。
(2)登録されている名前一覧。<00>などは、リソース・タイプの値。
(3)NetBIOSユニーク名か、NetBIOSグループ名かの区別。UNIQUEはこのコンピュータに固有のユニークな名前。GROUPの場合は、ほかのコンピュータ上にも同じ名前のエントリが存在することがある。
(4)各エントリの状態。「Registered(登録済み)」は正常に登録されたエントリという意味。名前の登録が失敗していると、「Conflict(衝突)」などと表示されることがある。
ローカル・コンピュータのNetBIOS名前テーブルを確認するには、「-n」オプションを付けてnbtstatコマンドを実行する。これ以外にも、「-a」オプションや「-A」オプションを使えば、リモート・コンピュータのテーブルの内容を参照することも可能である。
一覧にある「D-ADVANTAGE」は、筆者が参加しているドメイン・ネットワークのドメイン名、「SERVER01」はこのコンピュータ名である。リストを見ると、「SERVER01」という名前がワークステーション・サービス(<00>)やファイル・サーバ・サービス(<20>)のユニーク名として登録され、「D-ADVANTAGE」という名前がドメイン・コントローラ(<1C>)のグループ名などとして登録されていることが分かる。
次回は、NetBIOSでのセッションの確立、データグラムによるブロードキャスト通信などが、NetBIOS APIレベルでどのように実行されるのかを詳しく説明する予定である。
Copyright© Digital Advantage Corp. All Rights Reserved.