少しDNSに近寄ってみる
PCで単にホスト名からIPアドレスを取得するだけなら、わざわざgetaddrinfo()を使ったプログラムを書く必要はありません。大抵、digやnslookup、hostと言ったコマンドラインプログラムがあらかじめインストールされていてDNSサーバーと対話できます。
このうちnslookupはLinuxでは廃れてdigへ移行しました。一方でWindowsには標準でnslookupしか入っておらず操作に統一感がないので、Windowsにもdigを入れると少しだけ幸せになれます。

Windowsでdigを使うには、DNSサーバーソフトウェアの大御所であるBINDをインストールします。BINDのダウンロードページに行き、安定版(Current-Stable 9.16.21、2021年9月27日現在)のZIPファイルをダウンロードし、展開したファイルの中にあるBINDInstall.exeを管理者権限で実行します。
[Options]の[Tools Only]にだけチェックを入れて[Install]を押してインストールします。
画像の例だと、C:\Program Files\ISC BIND 9\binにdigコマンドがインストールされますので、そのパスを環境変数PATHに追加すると、コマンドプロンプトやPowerShellから直接使えるようになります。
Hello, DNS!
再帰的問い合わせ
再帰的問い合わせの実験として、ここではdigを用いてGoogleが提供している誰でも利用できるオープンなキャッシュサーバー「Google Public DNS」(8.8.8.8 or 8.8.4.4)でwww.microsoft.comの名前解決を試みてみましょう。WindowsのPowerShellでは、サーバーの指定である「@8.8.8.8」をダブルクォートしなければなりませんが、コマンドプロンプト(cmd.exe)やbashなどでは不要です。
> dig "@8.8.8.8" www.microsoft.com
; <<>> DiG 9.16.21 <<>> @8.8.8.8 www.microsoft.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64966
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.microsoft.com. IN A
;; ANSWER SECTION:
www.microsoft.com. 2851 IN CNAME www.microsoft.com-c-3.edgekey.net.
www.microsoft.com-c-3.edgekey.net. 14 IN CNAME www.microsoft.com-c-3.edgekey.net.globalredir.akadns.net.
www.microsoft.com-c-3.edgekey.net.globalredir.akadns.net. 825 IN CNAME e13678.dscb.akamaiedge.net.
e13678.dscb.akamaiedge.net. 20 IN A 23.210.232.231
;; Query time: 28 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Sep 28 17:42:51 ;; MSG SIZE rcvd: 213
この様な結果が出力されました。大事な所を太字にしましたので、一つずつ見て行きましょう。
- status: NOERRORは、問い合わせに問題がなく、応答に何かしら情報が含まれていることを示してします。
- flagsの項目では、”qr“は問い合わせに対する応答、”rd“は再帰的問い合わせが行われた、”ra“は使用したサーバーが再帰的問い合わせを受け付けたか、をそれぞれ示しています。
- ANSWER: 4は4つの回答があったことを示しています。その一覧はANSWER SECTIONにあります。
- ANSWER SECTIONでCNAMEレコードは左側のFQDNの正規名は右側のFQDNであることを示してします。これを辿って行くと、www.microsoft.com.の正規名はe13678.dscb.akamaiedge.net.であることが分かります。そしてIPv4アドレスを示すAレコードでe13678.dscb.akamaiedge.net.のIPアドレスは23.210.232.231であると示され、名前が解決されました。
- Query time: 28 msecは名前解決に28ミリ秒(0.028秒)掛かったことを示しています。20~50msecは早い方に分類されます。遅いと200msec(0.2秒)とか掛かります。
反復問い合わせ
先ほどはキャッシュサーバーにwww.microsoft.comの再帰的問い合わせを行いましたが、ではキャッシュサーバーはどの様に名前を解決しているのか。それをdigコマンドを使って再現していきます。
まずはDNSの親玉であるルートコンテンツサーバーにお伺いを立てますが、ルートコンテンツサーバーのIPv4アドレスは2021年9月28日時点で13個あります(IP Anycast技術で1400台以上のサーバーが稼働しています)。今回は日本にもある198.41.0.4を利用させて頂きます。
> dig "@198.41.0.4" www.microsoft.com +norec -t A
; <<>> DiG 9.16.21 <<>> @198.41.0.4 www.microsoft.com +norec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46895
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 27
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;www.microsoft.com. IN A
;; AUTHORITY SECTION:
com. 172800 IN NS a.gtld-servers.net.
(省略)
com. 172800 IN NS m.gtld-servers.net.
;; ADDITIONAL SECTION:
a.gtld-servers.net. 172800 IN A 192.5.6.30
(省略)
m.gtld-servers.net. 172800 IN AAAA 2001:501:b1f9::30
;; Query time: 24 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Tue Sep 28 21:53:25 ;; MSG SIZE rcvd: 842
- ルートコンテンツサーバーの198.41.0.4に問い合わせます。IPv4アドレスが欲しいので-t Aを明示的に、反復問い合わせなので+norecオプションを、それぞれ付けてdigを実行しています。
- ANSWER: 0は問い合わせそのもの(www.microsoft.com.)については知らない事が示されています。
- AUTHORITY: 13は問い合わせた名前の一部について知っているコンテンツサーバーが13個あることを示しています。その一覧はAUTHORITY SECTIONにあります。
- ADDITIONAL: 27は付加情報が27個あることを示しています。その一覧はADDITIONAL SECTIONにあります。Aレコードをリクエストしている時(-t A)、大抵はAUTHORITY SECTIONで示されたコンテンツサーバーのIPアドレスです。
- AUTHORITY SECTIONにはcom.について知っているコンテンツサーバーのFQDNが示されています。NSはコンテンツサーバーを示します。今回は、a.gtld-servers.net.を選びます。
- ADDITIONAL SECTIONにa.gtld-servers.net.のAレコードがあり、IPv4アドレスが192.5.6.30であると示されているので、その情報をそのまま使うことで無駄な問い合わせを省きます。
> dig "@192.5.6.30" www.microsoft.com +norec -t A
(省略)
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 3
(省略)
;; AUTHORITY SECTION:
microsoft.com. 172800 IN NS ns1-205.azure-dns.com.
(省略)
;; ADDITIONAL SECTION:
ns1-205.azure-dns.com. 172800 IN AAAA 2603:1061::cd
ns1-205.azure-dns.com. 172800 IN A 40.90.4.205
(省略)
- 続いてcom.のコンテンツサーバーである192.5.6.30に反復問い合わせを行います。
- ANSWER: 0ですのでまだwww.microsoft.com.について何も知らない様です。
- microsoft.com.のコンテンツサーバーはns1-205.azure-dns.com.で、そのIPv4アドレスは40.90.4.205であることが分かります。
> dig "@40.90.4.205" www.microsoft.com +norec -t A
(省略)
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
(省略)
;; ANSWER SECTION:
www.microsoft.com. 3600 IN CNAME www.microsoft.com-c-3.edgekey.net.
- 引き続きmicrosoft.com.のコンテンツサーバーである40.90.4.205に反復問い合わせをします。
- flags: aaは信頼できる回答(Authoritative Answer)であることを示しています。
- ANSWER: 1はwww.microsoft.com.について知っている事を示します。
- CNAMEはwww.microsoft.com.の正規名がwww.microsoft.com-c-3.edgekey.net.であることを示しています。
com.のコンテンツサーバーのIPv4アドレスは先ほど得られましたがnet.については知らないので、またルートコンテンツサーバーに聞いてみます。今度は得られた正規名で反復問い合わせします。
以下、同じ要領ですのでコマンドだけ書いて行きます。
> dig "@198.41.0.4" www.microsoft.com-c-3.edgekey.net +norec -t A (ルートへの反復問い合わせ)
> dig "@192.5.6.30" www.microsoft.com-c-3.edgekey.net +norec -t A (net.コンテンツサーバーへの反復問い合わせ)
> dig "@193.108.91.66" www.microsoft.com-c-3.edgekey.net +norec -t A (edgekey.net.コンテンツサーバーへの反復問い合わせ)
ここでまた信頼できる回答で正規名のwww.microsoft.com-c-3.edgekey.net.globalredir.akadns.net.が返されます。net.のコンテンツサーバーについては先ほど調べたばかりなので、ルートは飛ばして192.5.6.30に反復問い合わせをします。
>dig "@192.5.6.30" www.microsoft.com-c-3.edgekey.net.globalredir.akadns.net +norec -t A (net.コンテンツサーバーへの反復問い合わせ)
>dig "@96.7.49.129" www.microsoft.com-c-3.edgekey.net.globalredir.akadns.net +norec -t A (akadns.net.コンテンツサーバーへの反復問い合わせ)
さらにまた信頼できる回答で正規名のe13678.dscb.akamaiedge.net.が返されます。まだ終われません。
>dig "@192.5.6.30" e13678.dscb.akamaiedge.net. +norec -t A (net.コンテンツサーバーへの反復問い合わせ)
>dig "@184.26.161.192" e13678.dscb.akamaiedge.net. +norec -t A (akamaiedge.net.コンテンツサーバーへの反復問い合わせ)
>dig "@23.194.201.103" e13678.dscb.akamaiedge.net. +norec -t A (dscb.akamaiedge.net.コンテンツサーバーへの反復問い合わせ)
(省略)
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
(省略)
;; ANSWER SECTION:
e13678.dscb.akamaiedge.net. 20 IN A 23.210.225.46
(省略)
ついに信頼できる回答としてIPv4アドレスを取得することができました。www.microsoft.comは三度名前を変えe13678.dscb.akamaiedge.net.となり、そのIPv4アドレスが23.210.225.46であると分かりました。キャッシュサーバーへの再帰的問い合わせの時とIPアドレスが変わっていますが、www.microsoft.comの様なたくさんのアクセスがあるようなウェブサイトでは、負荷分散のため時間経過などで得られるIPアドレスは変わってきます。
反復問い合わせでは、ここで示した様に何回も問い合わせを繰り返して名前を解決しますので、解決まで1000msec(1秒)以上掛かることもざらです。その上、世界中の各端末が反復問い合わせで名前を解決すれば、より上位のコンテンツサーバーに問い合わせが殺到してまともに機能しなくなるうえ、回線の帯域が圧迫されることになるでしょう。それを防ぐキャッシュサーバーは偉大です。
プログラマーとDNS(1)
プログラマーとDNS(2)
プログラマーとDNS(3)