はじめに
ブラウザでWebサイトを表示する際、最初に行われるのがDNS(Domain Name System)による名前解決。
これは、人間が理解しやすい「www.google.com」のようなドメイン名を、コンピュータが理解できるIPアドレス「172.217.161.68」に変換する仕組みである。
ちなみに、
dig www.google.com
をターミナルで出力すると、IPアドレスが返ってくる。
DNS解決の流れ
例として「www.google.com」にアクセスする場合のフローを見ていく。
1. DNSキャッシュによるチェック
まず、www.google.comがブラウザ内でクリックされると、以下の順番でキャッシュをチェックする。
- ブラウザのDNSキャッシュ
- ローカルDNSキャッシュ
- ルーターのDNSキャッシュ (設定されている場合)
これらは、最近アクセスしたサイトの情報が一時的に保存される場所。「一時的に」なので、設定された有効期限を過ぎるとその情報は破棄される。有効期限は、TTL(Time To Live)といい、秒単位で設定される。
ローカルDNSキャッシュとは、ローカルマシン(あなたが使用しているMacBookなど)のOSレベルのキャッシュのこと。
もし直近で同じサイトにアクセスしたことがあり、これらのキャッシュに情報が残っていたら、情報が取得できた地点でWebサイトが表示される。
(補足)
TTL(Time To Live)は、ドメインの管理者が設定する。ちなみに、冒頭で紹介したコマンド「dig www.google.com」を実行してみると、下記の記述部分があった。
;; ANSWER SECTION:
www.google.com. 27 IN A 172.217.161.68
この「27」は、TTLの残り時間を示している。通常、googleは300秒のTTLを設定しているみたい。つまり、このコマンドを打ったのは、www.google.comにアクセスしてから273秒後だった、ということ。
2. ISPのDNSサーバーへの問い合わせ
1のローカルDNSキャッシュに情報がなかった場合、次にISP(Internet Service Provider、 NTTとか)のDNSサーバーに問い合わせる。
ISPは日本全国の各地域にDNSサーバーを設置しており、負荷分散と冗長性のため、通常はプライマリとセカンダリの2つのサーバーが設定されている。
もしこのDNSサーバーに情報があったら、ここから情報を取得してWebサイトが表示される。
⚠︎これ以降のプロセスは、ISPのDNSサーバーが代わりに行う。
3. ルートDNSサーバーへの問い合わせ
もしISPのDNSサーバーにもなかったら、ルートDNSサーバーに問い合わせる。
ルートDNSサーバーとは、道案内役みたいなもの。www.google.comというドメインに対して、TLD(トップレベルドメイン)は「.com」だからこのサーバーにアクセスしてみてね、という情報を返す。
ちなみに、よく「ルートDNSサーバーは世界に13台」と言われているが、これは語弊がある。物理的なサーバーが13台しかないというわけではないからだ。13個あるのは、ルートDNSサーバーアドレス。同じアドレスを持ったサーバーが世界中に分散されており、もっとも近いサーバーに誘導される。
4. TLDサーバーへの問い合わせ
ルートDNSサーバーからTLDサーバーの情報を受け取ると、ここに辿り着く。
TLDサーバーは、特定のトップレベルドメイン(.com、.org、.netなど)を管理しているサーバー。ここでは、www.google.comの「google.com」部分を担当するDNSサーバーの情報を提供する。このサーバーは、最終的なIPアドレスを持つサーバーの場所を教えてくれる。
5. オーソリティDNSサーバー
TLDサーバーから情報を取得すると、このオーソリティDNSサーバーに辿り着く。
オーソリティDNSサーバーは、ドメインレジストラ(例:お名前.com)が提供するDNSサーバーで、そのドメインの正式な(権威のある)情報を持つサーバーである。ここから最終的な「www.google.com」に対応するIPアドレスが返され、ブラウザは目的のWebサーバーに接続することができるようになる。
最後に
以上が、ブラウザがWebサイトを表示するまでの、DNSのフローである。
これらの ルートDNSサーバー ⇨ TLSサーバー ⇨ オーソリティDNSサーバー という階層的な構造により、世界中の膨大な量のドメインが効率的に管理され、キャッシュの活用により高速な名前解決が実現されている。
ただ、留意が必要なのは、実際は「3. ルートDNSサーバーへの問い合わせ」以降はISPのDNSサーバーが代わりに行う、ということ。また、通常はこれらのプロセスがミリ秒単位で実行されるため、ユーザーがこの複雑な過程を意識することはない。