HTTP/2 200
server: nginx
date: Fri, 03 Oct 2025 03:35:09 GMT
content-type: text/html; charset=utf-8
vary: Accept-Encoding
content-encoding: gzip
槻ノ木隆の「BBっとWORDS」
その39「DNSの原理」
■ DNSって何?
DNSとは「Domain Name System」の略で、IPアドレスとホスト名を相互変換してくれるサービスです。前回 の「デフォルトゲートウェイ」でも少し触れましたが、インターネットに接続する場合、どこかでホスト名とIPアドレスの変換を行なう必要があります。
TCP/IPにせよUDP/IPにせよ、実際にインターネットで通信を行なう際に利用するのはIPアドレスのみです。ホスト名というのは、(最近は少し事情が違ってきていますが)そもそもは「IPアドレスなんて覚えにくい」ため、「IPアドレスと対になる、人間にわかりやすい名前をつけよう」ということからはじまっています。実際、
bb.watch.impress.co.jp
pc.watch.impress.co.jp
というホスト名は、規則さえわかれば覚えやすいわけですが、
210.173.173.66
210.173.173.73
を覚えるのはやはり大変です。
ところがそうなると、今度は“bb.watch.impress.co.jp”=“210.173.173.66”であることを、誰かが教えてくれなければなりません。DNSではこの機能を提供してくれます。
■ DNS以前
図1:hostsファイルの利用
最初のうち、こうした設定は各マシンが個別に行なっていました。「hostsファイル」と呼ばれるものが、これにあたります。Unix系では伝統的に“/etc/hosts”がこのファイルの置き場所になっていますが、Windows系では例えば“C:\Windows\system32\drivers\ets\hosts”(Windows XPの場合)という具合に凄い場所に置かれていたりします。
さて、このhostsファイルを使った場合が図1の例です。HostA~HostCまで、3つのマシンがあり、お互いに通信する場合がある場合、各々のhostsファイルに自分以外の他の2台のIPアドレスとホスト名を記述しておくと、あとはアプリケーションがホスト名を指定する度にTCP/IPがこのhostsファイルを参照して、IPアドレスに変更してくれていました。
ネットワークが小規模ならば今でもこの方法は有効ですし、比較的簡単です。例えば、LAN内のサーバーに特定の名前をつけて利用する、という場合にはこれで十分でしょう。しかし、昨今のように物凄い数のマシンがインターネット上に存在する状況では、こんなことはやってられません。おまけに、ホスト名は不定期に増減したり変わったりするわけですから、これのメンテナンス作業も大変です。加えて言えば、こうした作業をすべてのマシンに行なわなければならないわけで、そのための作業量は想像もできないほど大きいものになります。
■ DNSの原理その1
こうした作業負荷を減らすために考えられた仕組みがDNS(Domain Name Service)と呼ばれる仕組みです。DNSではどんなことを可能にするかを、まず説明しましょう。図2のように、LANの中にDNSサーバーを1台追加したケースを考えます。ここでHostA→HostBに転送を行ないたい場合は、以下の手順で進行します。
・HostA上のアプリケーションが、“HostB”と指定して接続要求を出します。
・HostAのTCPソフトウェアは、DNSに対して「HostBに相当するIPアドレスを返せ」と要求を出します(1)
・DNSサーバーは自分の設定ファイルを参照し、“HostB”に相当する“192.168.1.102”をHostAに返します(2)
・HostAのTCPソフトウェアは、DNSの返答を使い、192.168.1.102にリクエストを出します(3)
これにより、すべてのマシンのhostsファイルを編集しなくても、DNSの設定ファイルを1カ所設定するだけで、ネットワーク全体でホスト名を利用できるようになるわけです。
図2:DNSの利用(その1)
■ DNSの原理その2
図3:DNSの利用(その2)
ただDNSの機能がこれだけだと、山のようにあるホスト名/IPアドレスの登録や更新の問題は解決していません。これを解決するのが、DNSの持つ「リソルバ(解決)」機能です。今、クライアントが“bb.impress.co.jp”にアクセスしたいと思った場合、1番近いDNSに問い合わせをかけるわけですが、そのDNSが必ずしも“bb.impress.co.jp”を知っているとは限りません。
こうした場合、ローカルDNSはまず「ルートサーバー」と呼ばれるサーバー(これは世界に13台あります)に問い合わせをかけます(図3)。ルートサーバーは、“bb.impress.co.jp”の最後の“jp”に着目し、“.jp”というトップドメインを管理しているDNSのIPアドレスを返してくれます。そこでローカルDNSは次に“.jp”を管理しているサーバーにリクエストを出すと、“co.jp”を管理しているサーバーのIPアドレスが返ってきます。3度目は“co.jp”を管理しているサーバーにリクエストを出し、“impress.co.jp”を管理しているサーバーのIPを得るわけで、4度目には“watch.impress.co.jp”、5度目にはついに“bb.watch.impress.co.jp”のIPアドレスを得ることができ、これをクライアントに返すというわけです。
この方式により、DNSは自分が知らないホストのIPアドレスも、問題なく取得できるようになっています。とはいえ、知らないホスト名がくるたびにリクエストを出しているとトラフィックが増えて仕方がありません。そこで、DNSにはキャッシュの仕組みが入っています。つまり「1度問い合わせた結果はキャッシュに格納することで、無駄なトラフィックを増やさない」という仕組みです。
例えば、図3の例でクライアントが“bb.watch.impress.co.jp”をリクエストするたびに、もう1度ルートサーバーからアクセスしなおすのは無駄です。そこで1回目に“watch.impress.co.jp”ドメインから“bb.watch.impress.co.jp”のIPアドレスを取得した際に、“bb.watch.impress.co.jp”=“210.173.173.66”を自分のキャッシュに蓄えておき、2度目以降はこのキャッシュをみて即座にクライアントにIPアドレスを返すという仕組みが備わっています。もちろんこのキャッシュの仕組みはDNSのみならず、クライアント側でも有効です。
ただ、キャッシュの場合は適当な頻度で更新をかけないと、データが変わっている場合があります。そこでDNSでは、値を返す際にその値の有効期限(TTL:Time To Live)も一緒に返しており、値を取得してからTTLに定められる時間が経過したあとは、キャッシュをいったん破棄してもう1度サーバーから最新の値を取得することが必要とされています。
■ DNSの現在
ここまで示したDNSの話は、基本的なものの、しかもごく一部です。DNSでは単にIPアドレスとホスト名の変換のみならず、さまざまな情報の提供を行なうこともできます。また、DNSの仕組みを利用しての負荷分散(DNSラウンドロビンと呼ばれます)も一般的に使われていますし、最近ではスパムメール対策にDNSを利用する(第29回目 で紹介したDomainKeysがこれにあたります)という話も出てくるなど、単なるIPアドレスとホスト名の変換を超えた、幅広い役割を担っています。さらに、IPv6への対応も次第にはじまっているなど、まだまだDNSは利用され続けるになるようです。
2005/05/30 10:58
槻ノ木 隆 国内某メーカーのネットワーク関係「エンジニア」から「元エンジニア」に限りなく近いところに流れてきてしまった。ここ2年ほどは、企画とか教育、営業に近いことばかりやっており、まもなく肩書きは「退役エンジニア」になると思われる。(イラスト:Mikebow)
Copyright (c) 2005 Impress Corporation, an Impress Group company. All rights reserved.