DNSとアドレス
インターネットでメールを送ったりWWWを使ったりするときに必ずお目にかかるのがwww.xxx.co.jpというような文字によるアドレス表記。これはいったいどんな仕組みになっているのでしょうか。
IPアドレスという住所
インターネットにつながっているコンピュータ(の接続口)には、データをやりとりするときの宛先の指標となるよう、全て32ビットの識別番号が与えられています。この番号をIPアドレスと呼びます。前回説明したTCP/IPでは、この数値アドレスを頼りにデータをバケツリレーしていくのです。
32ビットというとかなり大きな数ですから、例えば「あなたのアドレスは2078937700です」と言われても間違える危険が大。そこで、少し扱いやすくするため32ビットをバイト(8ビット)ごとに4つの部分に区切って表記します。さっきの例なら123.234.18.100という具合です[*1]。初めてインターネットに接続するとき、「ネーム・サーバーの設定」という作業で、このような数字を打ち込みましたね。これは、プロバイダのネーム・サーバーのIPアドレスを、こういうかたちで登録したのです。
名付けシステムDNS
数字で表現するアドレスは、コンピュータには都合が良くても、人間にとっては不便で仕方ありません。電話番号だって覚えにくいから「4126ヨイフロ」などと語呂合わせするわけで、世界中のコンピュータが交流するには何か分かりやすい住所表記の手段が欲しいところです。
そこで、コンピュータにドメイン名という名前を付ける方法が考えられました。そして、ネット上に名前と住所(IPアドレス)の対応表を用意しておき、利用者がドメイン名を指定すると、表を調べてIPアドレスに置き換えてやろうというのです。この名前と住所の変換を行うのがDNS(ドメイン・ネーム・システム)という仕組みで、先ほど登場したネーム・サーバーがその仕事を司っています(だからこの設定が正しくないと、住所が調べられず接続できないという事態になるのです)。
階層的な住所表記
ネットワークの規模が小さいときは、各コンピュータに単純な名前を付けるだけで何とかなりました。同じ部署やクラスの友達が「○○くん」と名前で呼ぶだけでちゃんと通じているようなものです。ところがこれが次第に広がりをみせ、遠隔地のネットワークと接続するようになると、「どこの」誰なのかが分かるような識別が必要になります。「経理部の斉藤さん」とか「広報部の太田さん」という具合に、所属をつけて呼ぶわけです。それで、ドメイン名も階層的な構造にして、コンピュータ名(たとえばwww)の後ろに組織名、そして大学ならac、会社ならcoなどという属性名を付加するようになりました。さらに、国際的な接続をするために、国を示すjpとかukなどのもう一段上位の識別子が加わります。こうして、www.xxx.co.jpのような形の、ピリオドでつながれた「所属付き」名前ができあがったのです(米国は国識別子を使わず、属性名も大学=edu、会社=comなどやや異なる)。
こういう大きな仕組みになってくると、めいめいが勝手な名前を付けていては、ドメインが重複して、住所表記としての役割を果たさなくなる恐れがあります。そこで、これらの住所(IPアドレス)と名前(ドメイン)がきちんと一意に割り当てられるよう、世界的な管理機構を設け、その下部組織である各国のNIC(ネットワーク・インフォメーション・センター)が、実際の申請の受け付けや割り当てを行っています。
誰が住所を知っているのか
DNSはドメイン名とIPアドレスを対応させるというわけですが、すると各地のネーム・サーバーは膨大な数のアドレスを全て記憶しているのでしょうか? いえいえ、そんなことはありません。表記法と同じく、情報の管理も階層的な分業が行われているのです。ネーム・サーバーは、xxxという組織レベルの情報を管理するものや、その上位のco(属性)のレベル、またjpという国のレベルを扱うものと役割を分担しています。自分の段階で分からなければ上位のサーバーに問い合わせていくことで、どんなドメインのアドレスも得られるという仕組みです。
それぞれのネーム・サーバーが自分の領域の情報に関して責任を持ち、互いに協力し合うことで広大なネットワークがはじめて機能する。DNSは、分業と自律というインターネット方式の、代表例のひとつといって良いでしょう。
(NetFan, December 1996)
関連するRFC
注
ドット10進法という表記法で、32ビットを8+8+8+8の4つのブロックに分け、それぞれを0〜255までの10進数で表し(8ビットだから最大でも255)、ドットでつないだもの。123.234.18.100を32ビット10進数に換算すると、
123*256^3 + 234*256^2 + 18*256 + 100 = 2078937700
となる。