DNS その2
目次
ドメイン
DNS(Domain Name Service)は、ホスト名からIPアドレスに変換する、つまり名前解決の仕組みですというお話でした。そのときにはDNSサーバを利用しています。DNSサーバにホスト名とIPアドレスの対応を登録し、各コンピュータは必要に応じて、IPアドレスの問い合わせを行っています。
このDNSの仕組みはインターネットでも利用されています。でも・・・インターネット上のすべてのコンピュータの名前を登録する必要があるの???って思います。ちょっと考えると、そんなことはとても効率が悪くなるし、たえず大きくなっていっているインターネットでは不可能です。それにそんなことをしていたら、hostsファイルを使っているのとたいして変わりません。
そこで、インターネット上でうまく分散させているんですね。DNSはインターネット上の大規模な分散データベースを構成しています。
ホスト名とIPアドレスの管理の単位をドメインと呼びます。ドメイン内には少なくとも1台のDNSサーバを置きます。このDNSサーバにドメイン内のコンピュータのホスト名とIPアドレスを登録しておきます。ドメインは日本語では領域とか、範囲とか言う意味です。これまでだとブロードキャストドメインやコリジョンドメインなど「ドメイン」という言葉が出てきていますが、DNSのドメインとこれらはまた違います。さらにWindowsでもドメインという言葉が出てきますが、こちらもDNSのドメインとは違うので注意してください。
ドメインの階層構造
このドメインをインターネット上で階層的に構成しています。その様子が次の図です。図の中の雲の形ひとつひとつがドメインと考えてください。
一番上の階層はルートドメインです。特別に名前がついているわけじゃないのですが、便宜上「.」で表します。その下の階層はgTLD(general Top Level Domain)と呼ばれます。アメリカの各種機関や国別にドメインが規定されています。おなじみの、「com」とか「jp」ですね。代表的なgTLDは次のようになります。
com | 営利を目的とした組織。でも、最近ではとくにこまかい規定はされていません。 個人名で取得するドメインはだいたいこのcomですね。 |
edu | 教育を目的とした組織。アメリカの大学はこのドメインを取得しています。 |
gov | 政府関連の組織。これもアメリカ政府関連の組織ですね。 NASAなんかもこのドメインです。(nasa.gov) |
mil | 軍関連の組織。 アメリカ海軍(navy.mil)やアメリカ陸軍(army.mil)など |
net | ネットワークを運営している組織。 とありますが、こちらもいまは特に規定されていません。 |
org | 非営利組織。 |
int | 国際的な組織。NATO(nato.int)はこのドメインを使っているそうです。 |
また、ISOの国別コードを元にして各国々をあらわすgTLDが決められています。
jp | 日本 |
uk | イギリス |
at | オーストラリア |
in | インド |
fr | フランス |
br | ブラジル |
ca | カナダ |
kr | 大韓民国 |
などまだまだたくさんあります。
さらにその下に各ドメインが連なる階層構造になっています。
各ドメインのDNSサーバには自分のドメインのホスト名とIPアドレスの対応に加えて、ひとつ下の階層のドメインにあるDNSサーバとルートドメインのDNSサーバのIPアドレスを登録します。(場合によってはgTLDのDNSサーバのIPアドレスも登録します)
FQDN(Fully Qualified Domain Name)
そして、よく「www.yahoo.co.jp」のような表記を見かけます。これは、yahoo.co.jpドメインにあるwwwというコンピュータを表すホスト名です。ホスト名とドメイン名を「.」で区切って上にさかのぼっていくようなイメージです。
この表記をFQDN(Fully Qualified Domain Name)と呼んでいます。日本語では完全修飾ドメイン名です。つまり、早い話がフルネームのことですね。Webサーバはだいたい、wwwというホスト名をつけます。wwwにしなくてはいけないという決まりはないのですが、慣例的につけることが多いようです。
wwwだけで考えると、名前はダブってしまうのですがFQDNでは必ず一意になります。
太郎さんっていう名前の人がたくさんいても、苗字も含めたフルネームで個人個人を見分けることができるのと同じですね(同姓同名があるじゃん!っていう突っ込みはご遠慮ください(笑))。
名前解決のプロセス
さて、この階層構造のドメインを利用して名前解決をしていくプロセスを見ていきましょう。
ドメイン内の各コンピュータは自分のドメインにあるDNSサーバに問い合わせを行うのですが、そのDNSサーバに登録がない場合、階層構造の頂点のルートから順番にたどっていきます。
具体的に次の例を見てみましょう。
companyドメイン内のあるコンピュータからyahooドメインのWebサーバにアクセスしたいというケースを考えます。
- companyドメイン内のDNSサーバに対して、www.yahoo.co.jpのIPアドレスを問い合わせます。
- companyドメインのDNSサーバにはwww.yahoo.co.jpの登録はありません。ですが、ルートのDNSサーバは知っているのでルートに対して問い合わせます。
- ルートのDNSサーバにもwww.yahoo.co.jpの登録はありませんが、jpドメインのDNSサーバについては知っています。そこで「jpドメインの DNSサーバに聞いてね」と返事を返します。
- 今度はjpドメインのDNSサーバに対して問い合わせます。ここでもやっぱりwww.yahoo.co.jpの登録はありません。
- coドメインのDNSサーバについては知っているので、「coドメインのDNSサーバに聞いてね」と返します。
- するとcoドメインのDNSサーバに対して問い合わせます。やっぱり登録がありませんが、yahooドメインは知っています。
- 「yahooドメインのDNSサーバに聞いて」と返事が返ってきます。
- そしてyahooドメインのDNSサーバに問い合わせると、ここには登録があります。
- やっと目的のwww.yahoo.co.jpのIPアドレスが返ってきます。
- その後、companyのDNSサーバは最初に問い合わせをしてきたコンピュータに、www.yahoo.co.jpのIPを教えてあげます。
- そして、実際にwww.yahoo.co.jpに対してアクセスをしていきます。
とりあえず知らなかったら知ってそうなところへたらい回しにしていってるんですね。これはルーティングのルートの集約にも同じような考え方を見ることができます。
また、毎回毎回インターネット上を問い合わせていくのは非効率になるので、名前解決をした結果はDNSサーバで一定時間保存しておきます。