Windows ネットワークにおける「名前解決」について、いろいろ調べて分ったことを備忘録として書いておきます。
Windows ネットワークで利用されるプロトコルには、大きく分けて NetBIOS 系のプロトコルと、TCP/IP 系のプロトコルがあり、その目的に応じて使い分けられています。(はじめから通信プロトコルに TCP/IP を採用していた UNIX 系の OS では NetBIOS 名という考え方は存在しません)
もともとこれらのプロトコルはまったく別のものでしたが、NBT(NetBIOS over TCP/IP)などの技術によって両者は巧みに組み合わされ、ユーザーはその違いをほとんど意識することなく利用することができるようになっています。
従って、現在では、Windows ネットワークにおける名前解決とは NetBIOS 名またはホスト名を IP アドレスに正しくマップすることと定義してよさそうです。
Windows ネットワークにおける名前解決のための機能は複数あり、標準的に、以下の優先順位で名前解決のための各機能が利用されています。(以下の「WINS サービス」と「NetBIOS 名のブロードキャスト」の部分はノードタイプによって異なります。詳しくは @IT の記事 第19回 NetBIOS over TCP/IPプロトコル(その2) (4/4) を見てください)
NetBIOS 名前キャッシュ
↓
WINS サービス
↓
NetBIOS 名のブロードキャスト
↓
lmhosts ファイル
↓
hosts ファイル
↓
DNS サービス
以下に、各機能の説明を書きます。
(1) NetBIOS
NetBIOS は、ネットワークサービスを呼び出すための API インターフェイスです。IBM-PC 用のネットワークアダプタ上に実装されていた BIOS の API として 1980 年代前半に開発され、Windows 95/98 や Windows NT、LAN Manager などを始め、パソコン用のネットワークサービスの API として広く普及したそうです。
アプリケーションでは、NCB(Network Control Block)というデータ構造体に NetBIOS のコマンドとそのパラメータをセットし、NetBIOS インターフェイスを呼び出すことによって各種のネットワークサービスを受けることができます。
NetBIOSは、通信プロトコルの規格ではなく、API の呼び出しインターフェイスの仕様です。物理的なネットワーク媒体やその上でやり取りされるパケットの構造については決めていません。
下位ネットワークプロトコルとしては、NetBEUI (NetBIOS Extended User Interface) や TCP/IP などが利用されています。TCP/IP をベースとするものを特に NBT(NetBIOS over TCP/IP)といいます。
(2) NetBEUI
NetBIOS API を使う Windows 95 時代の通信プロトコルが NetBEUI です。ブロードキャストを多用すること、ルーティング機能が実装されていないことから、プロトコルとしては小規模な LAN 向けです。
基本的にはコンピュータが自分の NetBIOS 名を知っていて、それが(ブロードキャストで)呼ばれたら変事をするような仕組みになっています。
現在では NBTに移行されていて、NetBEUI が使われることはほとんどないそうなので、忘れてよさそうです。実際、Windows 7 から NetBEUI が廃止されています。
(3) NBT
時代の流れに乗って一気に TCP/IP に移行してしまうと、今まで使ってきた NetBEUI と NetBIOS による Windows のファイル共有やプリンタ共有ができなくなるので、Microsoft の戦略として、TCP/IP 上で NetBIOS API を使えるようにしたのが NBT(NetBIOS over TCP/IP)です。
NBT により、複数セグメントに分かれたネットワークでも、NetBIOSのアプリケーションそのままで対応可能になりました。
参考: NBTとは
(4) NetBIOS 名
NetBIOS のサービスを利用して通信する場合、各コンピュータには必ず NetBIOS 名が付けられている必要があります。通信相手を特定するのに、IP アドレスや MAC アドレスではなく、この NetBIOS 名が利用されるためです。(NetBIOS 名は 16 バイト固定で、最後の 1 バイトがサフィックスという点が、コンピュータ名とはちょっと違います)
NetBIOS名 は、システムの起動時に各マシンごとに動的に登録するようになっています。つまり、あらかじめコンピュータに割り当てられた NetBIOS 名を、システムの起動時にネットワークにブロードキャストしたり、WINS サーバに登録したりし、それが認められて初めて Windows ネットワークに参加することができます。
逆に言えば、認められなければ、サービスを提供するだけでなく、ほかのマシンのサービスを利用することもできません。この点が、IP アドレスさえ割り当てられれば動作する TCP/IP とは大きく異なります。
参考: NetBIOS名とは何か?
(5) NetBIOS 名前キャッシュ
名前解決の結果は一定時間(デフォルトで 600 秒)だけ NetBIOS 名前キャッシュに格納されます。次にまた通信を行う場合、キャッシュ中に該当するエントリがあれば、キャッシュから IP アドレスが取り出され、問い合わせパケットを送信することはありません。
NetBIOS 名キャッシュの内容は「nbtstat -c」コマンドを実行すれば確認できます。解決した NetBIOS 名とユニークかグループかの種別、IP アドレス、寿命(キャッシュの有効期限。単位は秒)の情報が表示されます。
(6) WINS サービス
WINS (Windows Internet Name Service) は、NetBIOS over TCP/IP を使うルーティングされるネットワークで、NetBIOS の名前解決から発生した問題を解決するよう設計されたものだそうです。
各コンピュータが NetBIOS 名と IP アドレスの対応付けを WINS サーバーに登録しておき、利用したい場合には WINS サーバーに相手コンピュータの NetBIOS 名で問い合わせることで、相手コンピュータの IP アドレスを取得することができます。
なお、WINS にはドメインという概念がないので、大きなネットワークでも 1 台のサーバーで管理しなくてはいけないという問題を抱えています。そのためか、Microsoft も WINS には見切りをつけていて、廃止の方向に向かっているそうです。
参考: WINS の定義
(7) NetBIOS 名のブロードキャスト
WINS サービスが利用可能だからといって、必ずしも WINS サービスを使うと言うわけではなく、NBT のノードタイプによってはWINSサーバを使わず、ブロードキャストを使う場合があります。
ノードタイプは、RFC 1001『Protocol Standard for a NetBIOS Service on a TCP/UDP Transport: Concepts and Methods』
で定義されていて、以下の通り 4 種類あります。
-
b ノード(ブロードキャスト)
-
p ノード(ピアツーピア:WINS サーバー利用)
-
m ノード(混合:ブロードキャスト ⇒ WINS サーバー利用)
-
h ノード(ハイブリッド:WINS サーバー利用 ⇒ ブロードキャスト)
参考: NetBIOS 名の解決
(8) lmhosts ファイルと hosts ファイル
Windows ネットワークにおいて静的な名前解決を行う手段としては、hosts ファイルと lmhosts (LAN Manager Hosts) ファイルの 2 つがあります。
hosts ファイルは、もともとは TCP/IP プロトコルで使われてきた名前解決手段ですが、現在では NBT 系のサービスでも利用されている、一番基本的な名前解決手段です。
lmhosts ファイルは、もともとは NBT プロトコルで利用されてきた名前解決手段で、主に NetBIOS 名と IP アドレスの対応付けを管理しています。
いずれも systemroot\System32\Drivers\Etc フォルダに格納されています。
参考: hosts と lmhostsの違い
(9) DNS サービス
Microsoft は Windows2000 で Active Directory という Windows ネットワークを管理する新しい仕組みを導入し、その中で名前解決の仕組みに DNS を導入しました。Windows ネットワークでも、本格的に TCP/IP + DNS という仕組みを採用したわけです。
しかしながら、上に述べましたように、過去の資産を継承するために NetBIOS の仕組みも存続させています。NBT も搭載していますし、NetBIOS 名の名前解決の仕組みとして WINS も存続しています。
それゆえ、Windows ネットワークは NetBIOS 名とホスト名が混在するややこしい状態になっています。
参考: NetBIOS名の登録