- ブラウザURL入力
- DNS名前→IP今ここ
- ルータ経路選択
- ロードバランサ振り分け
- Nginx受け口
- アプリ処理
- DB保存
第2期はここまで、フレーム・IPアドレス・経路選択と、「宛先IPが分かっている前提」で下から積み上げてきました。今回はその前段、人間が打った名前がIPアドレスに変わるところを扱います。地図の上では2番目の段ですが、仕組みとしては最後に置くのが自然です。委任・キャッシュ・往復といった要素が、ここまでの回より複雑だからです。
まず結論
DNSの木は、単に階層が深いのではありません。各ノードで**権限そのものが別の組織に移譲**されています。上位は下位の中身を持たず、「あちらに聞け」と紹介を返すだけです。
そして「再帰」と「反復」はサーバの種類ではなく、**1回の問い合わせのモード**です。同じサーバが、下流には再帰的に答え、上流へは非再帰で辿ります。
「ルートサーバは世界に13台ある」——この説明は正しいでしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
階層ではなく、権限が移っていく木
ここまでの第2期は、「宛先IPアドレスは分かっている」という前提で進めてきました。フレームの区切り方、IPアドレスの割り方、ルータの経路選択——どれも宛先IPが決まった後の話です。今回はその前段、人間が打った名前がIPアドレスに変わるところを扱います。
DNSを「階層構造の名前空間」と説明した図はよく見ます。右から左へ、jp → ad.jp → iij.ad.jp と絞り込んでいく木の絵です。間違いではありませんが、この絵はDNSでいちばん大事なことを描けていません。
大事なのは、木が深いことではなく、各ノードで権限そのものが別の組織に移っていることです。
RFC 1034 §4.2.1 は、委任の境界(カット)の周りにあるNSレコードについて、はっきりこう書いています。それらは親ゾーンの "NOT part of the authoritative data"——親の権威データの一部ではない、と。親は子の中身を持っていません。持っているのは「この先は別の担当だ」という道案内だけです。
- ・各段の管理者が違う。上の段は下の段の中身を知らないし、知る必要もない
- ・上の段が答えるのは「担当はあちら」だけ。最終的な答えは持っていない
この構造だと、.jp の運用者は日本国内のドメインの中身を一切知らずに済みます。ある会社がサーバのIPアドレスを変えても、.jp に届け出る必要はありません。変更が権限の境界の内側で閉じるからです。
実際に委任を1段ずつ降りてみる
説明だけでは腑に落ちないので、実際に打ってみます。ルートサーバに www.iij.ad.jp のアドレスを尋ねます。+norecurse は「自分で辿って答えを持ってくるな」という指示です。
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38991;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 8, ADDITIONAL: 16;; QUESTION SECTION:;www.iij.ad.jp. IN A;; AUTHORITY SECTION:jp. 172800 IN NS a.dns.jp.jp. 172800 IN NS b.dns.jp.jp. 172800 IN NS c.dns.jp.(以下、計8本);; ADDITIONAL SECTION:a.dns.jp. 172800 IN A 203.119.1.1a.dns.jp. 172800 IN AAAA 2001:dc4::1(以下、グルーが続く)
注目すべきは ANSWER: 0 です。ルートサーバは、尋ねられた名前について何も答えていません。代わりに権威セクションで「jp の担当はこの8台だ」と教えているだけです。
では、紹介された a.dns.jp に同じことを尋ねたらどうなるでしょうか。
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52591;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 5;; AUTHORITY SECTION:iij.ad.jp. 86400 IN NS dns0.iij.ad.jp.iij.ad.jp. 86400 IN NS dns1.iij.ad.jp.;; ADDITIONAL SECTION:dns0.iij.ad.jp. 86400 IN A 210.130.0.5dns1.iij.ad.jp. 86400 IN A 210.130.1.5
またしても ANSWER: 0。今度は「iij.ad.jp の担当はこの2台だ」という、次の紹介です。.jp の運用者もまた、その先の中身を持っていません。
上位は誰も最終的な答えを持っていない。 これが委任の木の実像です。答えを持っているのは、いちばん下の権威サーバだけです。
ルートサーバに `www.iij.ad.jp` のアドレスを尋ねると、何が返ってきますか。
鶏と卵 — グルーレコードがなぜ要るのか
さきほどの出力で、追加セクションにネームサーバのIPアドレスが一緒に入っていました。これをグルーレコードと呼びます。なぜ、わざわざアドレスまで付けてくるのでしょうか。
RFC 1034 §4.2.1 の説明が見事なので、そのまま引きます。委任先のネームサーバの名前が、その委任先のゾーン自身の中にある場合——
in order to learn a name server's address, we should contact the server using the address we wish to learn
「ネームサーバのアドレスを知るためには、まさにそのこれから知ろうとしているアドレスを使って、そのサーバに問い合わせなければならない」。
iij.ad.jp の担当は dns0.iij.ad.jp です。その dns0.iij.ad.jp のアドレスを知るには iij.ad.jp に聞く必要があり、iij.ad.jp に聞くには dns0.iij.ad.jp のアドレスが要る。完全な循環です。
DNSの委任チェーン
ルートは jp の中身を持たず「jp の担当はこのサーバだ」とだけ答えます。jp もまた iij.ad.jp の中身を持たず、次の担当を指すだけです。各段の運用者は別の組織で、下位の組織がレコードを書き換えても上位に届け出る必要はありません。変更が権限の境界の内側で閉じています。
段 持っている 持っていないルート(.) jp の担当サーバの名前と住所 jp 配下の実際のアドレスjp iij.ad.jp の担当サーバ その会社のサーバのアドレスiij.ad.jp www のIPアドレス(最終的な答え) ——
組織の決裁権限の委譲
本社は「この金額までは事業部長が決めてよい」と決裁権限を事業部へ委譲します。事業部長はさらに課長へ委譲します。本社に個別の稟議の中身を尋ねても答えは返らず、「それは第二事業部の管轄です」と回されるだけです。課の中で誰に何を発注したかを、本社は把握していませんし、する必要もありません。
尋ねた先 返ってくるもの本社 「それは第二事業部の管轄です」(担当の紹介)第二事業部 「それは開発課の決裁範囲です」(さらに紹介)開発課 「承認済みです」(実際の答え)
DNSの委任と、組織の決裁権限の委譲。この2つに共通する構造は何でしょうか。そして、その構造は何を可能にしているでしょうか。
「上位に尋ねたとき、何が返ってくるか」と、「下位が中身を変えたとき、上位に何が起きるか」の2点で比べてください。
ここが最大のつまずき — 再帰と反復はサーバの種類ではない
DNSの解説でいちばん多く出会う混乱が、ここです。「再帰サーバ」「反復サーバ」という言い方が広まっているせいで、サーバに2つの種類があると思い込みやすくなっています。
そうではありません。RFC 9499 §6 は、再帰的問い合わせ(recursive query)を次のように定義しています。
A query with the Recursion Desired (RD) bit set to 1 in the header.
RDビット(Recursion Desired)が1になっている問い合わせ、それが再帰的問い合わせです。つまり再帰か否かは、問い合わせる側が1問ごとにヘッダのビットで指定するモードであって、サーバの属性ではありません。
- ・同じ1台が、下流には「再帰的に応える側」、上流には「反復的に辿る側」
- ・スタブリゾルバは定義上、自力でルートから辿ることはしない
端末のスタブリゾルバは、RFC 9499 の定義では "cannot perform all resolution itself"——自分だけでは解決を完遂できないものです。だから設定されたフルサービスリゾルバにRD=1で丸投げします。
受け取ったフルサービスリゾルバは、自分が再帰モードで処理を引き受け、その内部ではルート・jp・iij.ad.jp へとRD=0で問い合わせて紹介を辿ります。この1台が、下流に対しては再帰、上流に対しては反復をやっているわけです。
フラグを見れば一目で分かります。同じサーバに同じ名前を尋ねても、RDビットの有無でフラグ表示が変わります。
$ dig @8.8.8.8 www.iij.ad.jp;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1~~ RD が立っている = 再帰を依頼した$ dig @8.8.8.8 +norecurse www.iij.ad.jp;; flags: qr ra ad; QUERY: 1, ANSWER: 1RD が無い = 再帰を依頼していない
「フルサービスリゾルバは再帰サーバ、権威サーバは反復サーバ」——この整理は妥当ですか。
山場 — 「ルートサーバは13台」はどこが誤りか
DNSについて最も広く流布している誤りが、これです。
IANAのルートサーバのページは、こう説明しています。ルートサーバとは "a network of hundreds of servers"(数百のサーバからなるネットワーク)であり、それが "configured in the DNS root zone as 13 named authorities"(DNSルートゾーン上は13の名前付き権威として構成されている)、と。
13は名前の数です。 a.root-servers.net から m.root-servers.net までの13の名前。実際に稼働しているインスタンスの数はまったく別で、root-servers.org が公表しています(2026年9月時点で約2000。日々変動するので、数を書くなら時点を添えてください)。
何の数か 値 注意ルートゾーン上の名前 13 a〜m.root-servers.net実際のサーバインスタンス 約2000 2026年9月時点。日々変わる運用組織 12 13ではない
3行目にも注意してください。「13の組織が運営している」という言い方も誤りです。運用組織は12です。Verisign が A と J の2つを運用しているためで、レターの数と組織の数が一致しません。
では「なぜ13なのか」— 512バイト説を現在形で書かない
ここで必ず出てくるのが、「13なのは、DNS応答が512バイトに収まるようにするためだ」という説明です。すらすら読めて、いかにも根拠がありそうです。
しかし、これを現在形で書くと事実に反します。 実際に測ってみます。
- ・512バイト世界でも、NSレコード13本はどのインスタンスでも全部入る
- ・入り切らないのはアドレス。しかも「どれが削られるか」は応答したインスタンスによって違う
- ・EDNS0を有効にすると811バイトになり、A13本+AAAA13本がすべて入る
読み取れることは2つです。
1つ目。NSレコード13本自体は、512バイトに収まっています。 ここまでは512バイト説と矛盾しません。
2つ目。しかし13台ぶんのアドレスは収まりません。 a.root では A が7本・AAAA が6本まで、k.root では A が13本・AAAA が2本まで。合計本数すら違います。どれが残るかは、たまたま応答したインスタンス次第なのです。
これは実測だけの話ではなく、RFC 8109 §4.2 も「AとAAAAのRRセットの合計サイズは元の512オクテットのペイロード上限を exceeds(超える)」と明言しています。
エラーに見えない不完全さ
512バイトの話には、もう1つ実務的に重要な続きがあります。
アドレスが入り切らなかったとき、応答はどうなるでしょうか。DNSにはTCフラグ(Truncated、切り詰められた)という、「入り切らなかった」ことを示す仕組みがあります。これが立てば、問い合わせ側はTCPで再問い合わせできます。
ところが実測した応答のフラグは、こうでした。
;; ->>HEADER<<- opcode: QUERY, status: NOERROR;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13;; MSG SIZE rcvd: 508flags に tc が無い。ADDITIONAL は 13 しか入っていないのに、「切り詰めた」とは通知されていない
TCフラグは立っていません。 追加セクションのアドレスは「あれば便利な補助情報」という位置づけなので、入り切らなければ黙って落とされるだけです。エラーにも警告にもなりません。
ステータスは NOERROR、TCフラグも無し。どこにも異常が現れないまま、情報が欠けているわけです。第14週で見た「便利な近似を無条件の真実として語らない」という姿勢と同じで、ここでは「エラーが出ていないから正常」という判断が通用しません。
「無かった」もキャッシュされる
最後に、キャッシュの話をします。DNSが現実的な速度で動いているのは、同じ問いを何度もルートから辿り直さないからです。各レコードにはTTL(生存時間)が付いていて、その秒数のあいだ再利用されます。
なお、ここで言うTTLは秒数です。第2期で既に出てきたIPヘッダのTTLとは別物なので、混同しないでください(この2つの違いは第26週で改めて扱います)。
見落とされがちなのは、「見つからなかった」という結果もキャッシュされることです。これをネガティブキャッシュと呼びます。そして否定応答には2種類あり、混同されがちです。
種類 意味 RCODENXDOMAIN 名前そのものが存在しない Name Error (§2.1)NODATA 名前はあるが、そのタイプが無い NOERROR (§2.2)
NODATA の RCODE は NOERROR です。 エラーではありません。RFC 2308 §2.2 の表現では「RCODEがNOERRORにセットされ、関連する回答が無い」状態です。実際に引き比べると違いがはっきりします。
$ dig @8.8.8.8 nonexistent-xyz-987654.iana.org;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN;; ANSWER: 0, AUTHORITY: 1 ← 名前自体が無い$ dig @8.8.8.8 a.root-servers.net MX;; ->>HEADER<<- opcode: QUERY, status: NOERROR;; ANSWER: 0, AUTHORITY: 1 ← 名前はある。MXが無いだけ;; AUTHORITY SECTION:root-servers.net. 86400 IN SOA ... 14400 7200 1209600 3600000
では、この「無かった」をどれだけキャッシュしてよいのでしょうか。ここにも広く流布した誤りがあります。
RFC 2308 §3 は、SOAの MINIMUM フィールドと、SOAレコード自身のTTLの、小さい方と規定しています。MINIMUM だけを見る説明をよく見ますが、それでは不正確です。
jp. 86400 IN SOA z.dns.jp. root.dns.jp. 1789295402 3600 900 1814400 900~~~~~ ~~~SOA自身のTTL = 86400 MINIMUM = 900→ 小さい方は 900。ネガティブTTLは 900 秒
実際に存在しない jp 配下の名前を引くと、返ってくるSOAのTTLはちょうど 900 でした。規定どおりです。
なお RFC 2308 §5 は運用上の目安として、「1〜3時間の値がうまく機能することが分かっている」「1日を超えるのは問題含み」とも述べています。
この先の学びにどう繋がるか
DNSは、層の中のどこか一箇所にある仕組みではありません。層の外側から全体に効いています。 名前が引けなければ、どれだけIP層やトランスポート層が健全でも通信は始まりません。この性質が切り分けの順序にどう効くかは、第2期の最終回である第26週で扱います。
語彙とレコードタイプの網羅は、本コースでは扱いません。既存のDNSクイズ群に譲ります。本コースが扱うのは一貫して「なぜその仕組みが必要になったのか」だけです。
この章のまとめ
- DNSの木は、単に階層が深いのではなく、各ノードで権限が別組織に移譲されている。RFC 1034 §4.2.1 は委任先のNSレコードを親ゾーンの "NOT part of the authoritative data" と明記している。
- 上位は最終的な答えを持っていない。 ルートに問い合わせても回答は0本で、返るのは「jp に聞け」という紹介だけ。これは組織の決裁権限の委譲と同じ構造で、変更を権限の境界の内側に閉じ込める。
- グルーレコードは鶏と卵を断ち切る仕掛け。「アドレスを知るために、そのこれから知ろうとしているアドレスを使って問い合わせる」という循環を避けるため、親が例外的にアドレスを添える。
- 再帰と反復はサーバの種類ではなく、1回の問い合わせのモード。 RFC 9499 の定義は「RDビットが1の問い合わせ」。同じフルサービスリゾルバが、下流には再帰的に応え、上流へはRD=0で反復的に辿る。最大のつまずきどころ。
- 「ルートサーバ13台」は誤り。 13は a〜m の論理名の数。IANAは「数百のサーバが13の名前付き権威として構成されている」と説明する。実インスタンスは約2000(2026年9月時点、日々変動)。運用組織は12(VerisignがAとJ)。
- 「13なのは512バイトに収まるから」を現在形で書かない。 実測では NS 13本は収まるが、アドレス26本は収まらない(a.rootで508バイト・A7+AAAA6、k.rootで492バイト・A13+AAAA2)。RFC 8109 §4.2 も "exceeds" と明言。IPv4のみだった時代の歴史的経緯として語る。決定文書は未確認。
- 入り切らなくてもTCフラグは立たない。 追加セクションは黙って削られ、エラーにも警告にもならない。「エラーが出ていない=正常」が通用しない実例。
- EDNS0 でも512は消えていない。 RFC 6891 §6.2.3 は「512未満の値は512として扱うMUST」。EDNS0はオプトインで、RFC 7766 §5 によりTCP対応も必須。
- NXDOMAIN と NODATA は別物。 前者は名前が無い(RCODE=Name Error)、後者は名前はあるがタイプが無い(RCODE=NOERROR)。
- ネガティブTTLは、SOAのMINIMUMとSOA自身のTTLの小さい方(RFC 2308 §3)。MINIMUMだけを見る説明は不正確。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
「ルートサーバが13なのは、DNS応答が512バイトに収まるようにするためである」——現在の事実として、この説明の評価はどれですか。
用語集(7語)
- 委任 (delegation)
- あるゾーンの一部分について、権限を別のサーバ(多くは別組織)に預けること。親ゾーンは子ゾーンの中身を持たず、「子ゾーンの担当はこのネームサーバだ」というNSレコードだけを持つ。
- 権威サーバ (authoritative server)
- あるゾーンの内容を、他から教わったのではなく自分の手元の知識として知っているサーバ。RFC 9499 の表現では「ローカルな知識からゾーンの内容を知っている」サーバ。
- スタブリゾルバ (stub resolver)
- 端末側にある簡易なリゾルバ。RFC 9499 の定義では「自分だけでは解決を最後まで実行できない」もので、設定されたフルサービスリゾルバに丸投げする。自力でルートから辿ることはしない。
- 再帰モード / 反復モード
- サーバの種類ではなく、1回の問い合わせのモード。再帰的問い合わせは「RDビットが1にセットされた問い合わせ」(RFC 9499)。反復モードでは紹介(referral)が返る。同じサーバが下流に再帰、上流に非再帰という使い分けをする。
- グルーレコード (glue record)
- 委任先ネームサーバの名前が、その委任先ゾーン自身の中にある場合に、親が追加セクションで一緒に返すアドレス。これが無いと「アドレスを知るために、そのアドレスを使って問い合わせる」という循環に陥る。
- NXDOMAIN / NODATA
- NXDOMAIN は名前自体が存在しない応答(RCODE=Name Error、RFC 2308 §2.1)。NODATA は名前は存在するが問い合わせたタイプのレコードが無い応答で、RCODEは NOERROR(§2.2)。別物。
- ネガティブキャッシュ
- 「無かった」という結果をキャッシュすること。保持してよい時間は、権威セクションで返るSOAのMINIMUMフィールドと、そのSOAレコード自身のTTLの、小さい方(RFC 2308 §3)。
出典(一次ソース)
- RFC 1034 §4.2.1 — ゾーンのカットと委任、グルーが必要な理由 ↗
- RFC 9499 §6 — 再帰モード・反復モード・スタブリゾルバの定義 ↗
- RFC 2308 — NXDOMAIN / NODATA とネガティブキャッシュのTTL ↗
- RFC 6891 §6.2.3 — EDNS0(512未満の値は512として扱う) ↗
- RFC 8109 §4.2 — ルートのアドレスセットが512オクテットを超えること ↗
- RFC 7766 §5 — 汎用DNS実装はUDPとTCPの両方を実装しなければならない ↗
- IANA — Root Servers(13の名前付き権威と、数百のサーバ) ↗
- root-servers.org — ルートサーバの実インスタンス数 ↗