DNSについて学習してみた
DNSとは
DNSとは、「Domain Name System」の略で、ドメイン名とIPアドレスを紐づけて管理する仕組みのことを指します。
ドメイン名とIPアドレスって?
ドメイン名とは、簡単に言うとインターネット上の住所のことです。普段スマートフォンやパソコンを触っていると「〇〇.jp」や「△△.com」という表記をみたことがあるかと思いますが、これがドメイン名と呼ばれるものです。ドメイン名には会社名やサービスの名称が含まれることが多く、人にとって覚えやすいものになっています。
一方、IPアドレスですが、こちらもネットワーク上の機器に割り当てられるインターネット上の住所のようなものになります。Webページの閲覧やメールの送受信を行うためには、通信相手を識別する必要があり、この識別に使われるものがIPアドレスです。IPアドレスは「192.168.0.0」のような形で表示されることが多いです。
特徴 | 表記例 | |
---|---|---|
ドメイン名 | ネット上の住所を表した文字列 | example.com, sample.jp |
IPアドレス | 通信相手を識別するために必要な番号 | 192.168.0.0 |
ドメイン名とIPアドレスを使い分ける理由
ドメイン名とIPアドレス、どちらもインターネット上の住所を表していますが、なぜ使い分けられているかと言うと、人がIPアドレスを覚えるよりもドメイン名を覚える方が簡単だからです。
TCP/IPのネットワークでは、IPアドレスで通信相手を識別するため、IPアドレスが必要なのですが、12桁ほどの数字を覚えるのは大変かと思います。そこで、人間はドメイン名という名前を使用し、ルーターはIPアドレスを使用するという方法が考え出され、その方法が定着しました。
ドメイン名がわかればIPアドレスがわかる、逆にIPアドレスがわかればドメイン名がわかるというふうにドメイン名とIPアドレスを紐づけてくれているのがDNSになります。
このDNSの仕組みを提供し、ドメイン名とIPアドレスの変換を行うサーバーをDNSサーバーと呼びます。
ドメイン名からIPアドレスを取得する流れ
私たちがブラウザでWebページを閲覧などをするとき、ブラウザはドメイン名からIPアドレスを取得するために、最寄りのDNSサーバーに「example.comというサーバーのIPアドレスを教えてください」と問い合わせます。それに対して、DNSサーバーが「そのサーバーのIPアドレスはxxx.xxx.xxx.xxxだよ」と教えてくれます。DNSの仕組みを使ってIPアドレスを調べることを名前解決と呼び、この時DNSサーバーに問い合わせを送るプログラムのことをリゾルバと呼びます。
もう少し内部まで見ていきます。
リゾルバの動き
リゾルバはブラウザなどのアプリケーションから呼び出されると、
- DNSサーバーへの問い合わせメッセージを作成
- 問い合わせメッセージをDNSサーバーに送信
- DNSサーバーの返答を受信
- 返答からIPアドレスを取り出し、メモリー領域に格納
の順番で処理していきます。
- DNSサーバーへの問い合わせメッセージを作成
ブラウザがWebサーバーに送るHTTPのリクエスト・メッセージを作成するのと同じように、DNSの仕様に従って「example.comというサーバーのIPアドレスを教えてください」という意味を持つデータを作成します。
DNSのメッセージは文字ではなく、2進数のデータであるバイナリ・データで表現されています。 - 問い合わせメッセージをDNSサーバーに送信
メッセージの送信をリゾルバ自身で実行するのではなく、OS内部に組み込まれたプロトコル・スタック(ネットワーク制御用ソフトウェア)を呼び出して実行を依頼します。 - DNSサーバーの返答を受信
DNSサーバーの返答はプロトコル・スタックを経由してリゾルバに渡され、リゾルバが中身を確認します。 - 返答からIPアドレスを取り出し、メモリー領域に格納
返答メッセージの中身を解読し、そこからIPアドレスを取り出してアプリケーションにIPアドレスを渡します。正確にいうと、リゾルバを呼び出すときに指定したメモリー領域にIPアドレスを格納します。
これでリゾルバの動作が終了し、制御がアプリケーションに戻ります。
DNSサーバーの動き
次は、リゾルバが問い合わせメッセージを送信した後のDNSサーバーの動きについて見ていきます。
リゾルバからの問い合わせメッセージには下記の情報が含まれています。
- 名前
サーバーやメール配送先などの名前。 - クラス
インターネット以外のネットワークでの利用を考慮し、クラスという情報が用意されているが、現在ではインターネット以外では利用しないため、常にインターネットを表す「IN」という値になる。 - タイプ
名前にどのタイプの情報が対応づけられているかを表す。タイプによって回答する情報が異なる。
DNSサーバーは上記の情報に紐付けて返答する項目を登録しておきます。そして、この登録内容から問い合わせメッセージに該当するものを探して、クライアントに返答します。
社内ネットワークなど数が限られている場合は、その情報を1台のDNSサーバーに登録できるため、上の図のように動作するかと思います。
しかし、インターネットにはたくさんのサーバーがあるため、1台のDNSサーバーに全てを登録することは不可能です。そこで、最寄りのDNSサーバーに情報が登録されていない場合の動きも説明します。
DNSサーバーに情報が登録されていない場合
最寄りのDNSサーバーに情報が登録されていない場合、求める情報が登録されているDNSサーバーを探す必要があります。
探し出す方法の前に、DNSサーバーの登録の仕組みを説明します。
実は、DNSで扱うドメイン名は、ドットで区切られており、右に位置するものが上位の階層を表すことになっています。
「example.com」というドメインを例に挙げると、comというドメインの下にexampleというドメインがあるというような形です。
この階層化されたドメインの情報をDNSサーバーに登録するのですが、その際に1つのドメインをひとまとまりのものとして扱います。つまり、一つのドメインの情報をひとまとめにしてDNSサーバーに登録します。
ここから、DNSサーバーに登録した情報を探し出す方法を説明します。
インターネットにはDNSサーバーが何万台もあるため、しらみつぶしに探し回るわけにはいきません。
そこで、次のような方法をとることにしました。
まず、下位のドメインを担当するDNSサーバーのIPアドレスを、その上位のDNSサーバーに登録します。そして、その上位のDNSサーバーをさらに上位のDNSサーバーに登録するというように順に登録していきます。例えると、example.comというドメインを担当するDNSサーバーをcomドメインのDNSサーバーに登録するというようにします。このようにすれば、上位のDNSサーバーに行けば下位のDNSサーバーのIPアドレスがわかり、そこに問い合わせメッセージを送ることができます。
なお、上記説明のcomなどのドメインをトップレベル・ドメインと呼び、これが最上位のように見えますが、もう一つ上位のルート・ドメインと呼ぶドメインがあります。ルート・ドメインにはドメイン名がないため、ドメイン名を書く時は省略します。(example.com.というようにピリオドをつけることで明示的に書くこともできます)
ルート・ドメインにはcomやjpなどのDNSサーバーを登録することで、ルート・ドメインから下位の方へ順に辿っていくことができるようになります。
さらに、このルート・ドメインをインターネット上のすべてのDNSサーバーに登録することで、どのDNSサーバーからでもルート・ドメインのDNSサーバーにアクセスできるようになります。その結果、クライアントがどこかのDNSサーバーにアクセスすれば、そこから、ルート・ドメインを経由して、ドメインの階層をたどっていき、最終的に目的のDNSサーバーにたどり着けます。
DNSの階層構造
最後に実際のドメイン名からIPアドレスを取得する流れを見ていきましょう。
ここでは、クライアントの最寄りにあるDNSサーバーにexample.comというWebサーバーに関する情報を問い合わせることにします。
まず、クライアントは最寄りのDNSサーバーに問い合わせますが、example.comに関する情報は登録されていないため、ルート・ドメインから順に階層をたどっていきます。
すべてのDNSサーバーにはルート・ドメインが登録されていますので、最寄りのDNSサーバーはルート・ドメインへ、クライアントの問い合わせメッセージを転送します。
ルート・ドメインにはexample.comという名前は登録されていませんが、名前からcomドメインの下にあることは分かりますので、ルート・ドメインのDNSサーバーは、comドメインのDNSサーバーのIPアドレスを送り返します。
そうしたら、最寄りのDNSサーバーは次に、comドメインのDNSサーバーに問い合わせメッセージを送ります。comドメインのDNSサーバーにexample.comのサーバー情報が登録されているため、そのIPアドレスを返答します。
クライアントから問い合わせメッセージを受信したDNSサーバーはこのようにしてIPアドレスを調べます。
該当するIPアドレスが取得できたら、その情報をクライアントへ返答し、クライアントは目的のWebサーバーにアクセスできるようになります。
DNSの動きまとめ
おわりに
今回はドメインとIPアドレスを紐付けて管理するDNSの仕組みについてまとめてみました。
細かい部分は抜けているかもしれないですし、完璧に理解できたかというと怪しい部分もありますが、大まかな仕組みは理解できたかと思います。
もし、間違っている箇所などありましたら、ご指摘いただけますと幸いです。
Discussion