銀色うつ時間

思い出すたび何か胸につっかえてるだけ

DNSの仕組みについて

日頃から私達のネットを支えるDNSについて。IPアドレスに対して対応する適切な名前を返してくれるサーバー、くらいの認識しか持っていなかったのだが、理解を深めるために調べてみました。

そもそもDNSサーバー(ネームサーバー)ってなんだ

Domain Name System(ドメイン ネーム システム、DNS)はインターネットを使った階層的な分散型データベースシステムである。1983年に情報科学研究所 (ISI) のポール・モカペトリスとジョン・ポステルにより開発された。現在では主にインターネット上のホスト名や電子メールに使われるドメイン名と、IPアドレスとの対応づけを管理するために使用されている。 -wikipediaより

これは歴史的経緯から考えるとわかりやすい。TCP/IPのネットワークプロトコル下では、それぞれの ホスト(コンピュータやルータなど)は、IPアドレスによって識別され、通信が行われている。インターネットに接続されるすべてのホスト、すなわちコンピュータは固有のIPアドレスを保有しているのだ。すなはち、どのホストにアクセスする際も最終的にはIPアドレスを知る必要がある。とはいえ、IPアドレスは最大12桁(ipv4では)の十進数だがこれを把握するのは非常に難しいので、IPアドレスを人間でも覚えられるように別の文字列に置き換える機構が生まれた。これがDNSというわけだ。試しにブラウザから以下のIPアドレスを叩いてみよう。

124.83.203.233

ブラウザにはyahoo!japanのトップページが表示されるはずだ(20012/08現在)。このようにIPアドレスに対して対応する文字列(これがURL)を渡す役割をするのがDNSである。ちなみにこの仕組こそが「名前解決」という名前で呼ばれるものだ。余談だが、IPアドレスを調べるためには、hostコマンドを用いる。「host [調べたいドメイン]」と打つだけ。

【追記】

ipv4において最大12桁のアドレスは、8bit * 4 で 32bitとなる。

ドメイン構成について

世の中に存在するIPアドレスは膨大だ。どう考えてもとても1つのコンピューターで処理できる量ではない。そう考えると、DNSサーバー(ネームサーバーとも呼ばれる)も膨大な数が存在するのだろうと想像がつく。では、世界中にあるDNSサーバーはどのようにして役割分担をしているのだろうか。URLはホストとドメインの連結文となっており、ピリオド「.」で区切られていることに着目したい。例えばwww.yahoo.co.jpだと、

jp         ->トップレベルドメイン(国別コード)
|-co.jp       ->第二レベルドメイン(組織種別コード)
|-yahoo.co.jp    ->第三レベルドメイン(組織名)
|-www.yahoo.co.jp  ->第四レベルドメイン
最大255文字

となっていることが分かる。この階層構造において、yahoo.co.jpはco.jpの配下であり、jpの配下という構成で成立している。組織名は、さらに組織内の階層をピリオドで区切って指定できる。例えばwww.dev.yahoo.co.jpなどといった形式である(これをサブドメインという)。

名前解決

それぞれのネームサーバーは担当するドメインの対応表を保有しており、この木構造のノード、つまりはピリオドを辿ることで、最終的なIPアドレスが得られるという仕組みだ。ここで、「木構造の最上位には何が位置しているのか?」という疑問が生じる。我々の期待している通り、最上位には「ルートサーバー」と呼ばれるネームサーバーが全世界に13台分散配置されており、こいつらがDNS界の親玉なわけだ。とまあそんな構造をもったDNSによる名前解決、その処理の流れは以下のように完結にまとまる。

  • まず最寄の(送信元ホストと同じドメインの)ネームサーバーに問い合わせる
    • 目的のアドレスがあれば、ここで解決
  • 最寄のネームサーバーになければ、まずルートサーバーに問い合わせる
  • jpドメインのネームサーバーに問い合わせる
    • このネームサーバーはco.jpドメインを管理するネームサーバーのアドレスを返す
  • co.jpドメインのネームサーバーに問い合わせる
    • このネームサーバーはyahoo.co.jpドメインを管理するネームサーバーのアドレスを返す
  • yahoo.co.jpドメインのネームサーバーに問い合わせる
    • このネームサーバーはwww.yahoo.co.jpドメインを管理するネームサーバーのアドレスを返す
  • www.yahoo.co.jpドメインのネームサーバーに問い合わせる
    • 対応表から124.83.203.233というIPアドレスを割り出し、これをクライアントに返す

hostsとは

DNSと同じように、IPアドレスとホスト名のマッピングを行う原始的な仕組みが、「hosts」ファイルだ。各ホストがローカルファイルとしてマッピング情報を管理している。LinuxMacOSでは「/etc/hosts」に存在するファイルそれに当たる。hostsファイルとは、ローカルでホスト名をIPアドレスに変換する際に参照するファイルだ。このファイルは先に述べた名前解決の流れの中で用いられる。「google.co.jp」というホスト名を、「216.239.33.100」という実際のIPアドレスに変換する時に参照するのだが、ここで重要なポイントは、このhostsファイルの記述はDNSサーバーによる変換より優先されるということだ。/etc/hostsに以下を追加してみる。

216.239.33.100 yahoo.co.jp

hostsファイルはこのように「IPアドレス ホスト名」というように書くのだが、この場合はどうなるだろうか。結果としては、ブラウザからyahooのアドレスを打ち込んだとき、表示されるページはgoogleになる。先に述べた、DNSを参照してyahoo.co.jpのIPである124.83.203.233に辿り着く前にhostsファイルで変換されてしまい、google(216.239.33.100)に飛ばされるわけだ。hostsファイルの設定は大規模な名前解決の手段とはならないものの、特定ページへのアクセスを別の参照先に飛ばしたい場合や、ローカル環境での開発などに有用である。



以上!なにか間違いがあったら指摘ください!