Dev Study
← ネットワークの仕組み
レッスン 12 / 13·約 20 分·第2期 ネットワークの仕組み

名前からアドレスへ — DNSは巨大な委任の木

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP今ここ
  3. ルータ経路選択
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理
  7. 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 の担当はここ」だけ
権限を委ねる(別組織へ)
jp持っているのは「iij.ad.jp の担当はここ」だけ
さらに権限を委ねる(別組織へ)
iij.ad.jpここで初めて実際のアドレスを持っている
  • ・各段の管理者が違う。上の段は下の段の中身を知らないし、知る必要もない
  • ・上の段が答えるのは「担当はあちら」だけ。最終的な答えは持っていない

この構造だと、.jp の運用者は日本国内のドメインの中身を一切知らずに済みます。ある会社がサーバのIPアドレスを変えても、.jp に届け出る必要はありません。変更が権限の境界の内側で閉じるからです。

具体実物

実際に委任を1段ずつ降りてみる

説明だけでは腑に落ちないので、実際に打ってみます。ルートサーバに www.iij.ad.jp のアドレスを尋ねます。+norecurse は「自分で辿って答えを持ってくるな」という指示です。

$ dig +norecurse www.iij.ad.jp @198.41.0.4コマンド出力
;; ->>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.1
a.dns.jp. 172800 IN AAAA 2001:dc4::1
(以下、グルーが続く)

注目すべきは ANSWER: 0 です。ルートサーバは、尋ねられた名前について何も答えていません。代わりに権威セクションで「jp の担当はこの8台だ」と教えているだけです。

では、紹介された a.dns.jp に同じことを尋ねたらどうなるでしょうか。

$ dig +norecurse www.iij.ad.jp @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.5
dns1.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 のアドレスが要る。完全な循環です。

⇄ 2つを見比べる
具体例 A

DNSの委任チェーン

ルートは jp の中身を持たず「jp の担当はこのサーバだ」とだけ答えます。jp もまた iij.ad.jp の中身を持たず、次の担当を指すだけです。各段の運用者は別の組織で、下位の組織がレコードを書き換えても上位に届け出る必要はありません。変更が権限の境界の内側で閉じています。

各段が持っている情報と、持っていない情報表
段 持っている 持っていない
ルート(.) jp の担当サーバの名前と住所 jp 配下の実際のアドレス
jp iij.ad.jp の担当サーバ その会社のサーバのアドレス
iij.ad.jp www のIPアドレス(最終的な答え) ——
具体例 B

組織の決裁権限の委譲

本社は「この金額までは事業部長が決めてよい」と決裁権限を事業部へ委譲します。事業部長はさらに課長へ委譲します。本社に個別の稟議の中身を尋ねても答えは返らず、「それは第二事業部の管轄です」と回されるだけです。課の中で誰に何を発注したかを、本社は把握していませんし、する必要もありません。

決裁を尋ねたときに返ってくるもの表
尋ねた先 返ってくるもの
本社 「それは第二事業部の管轄です」(担当の紹介)
第二事業部 「それは開発課の決裁範囲です」(さらに紹介)
開発課 「承認済みです」(実際の答え)

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台のフルサービスリゾルバが、両方のモードを使い分ける
端末のスタブリゾルバ自力では解決できない
RD=1 で丸投げ(再帰モード)
フルサービスリゾルバこの1台が下と上で振る舞いを変える
RD=0 で1段ずつ(反復モード)
ルート紹介を返す
jp紹介を返す
iij.ad.jp答えを返す
  • ・同じ1台が、下流には「再帰的に応える側」、上流には「反復的に辿る側」
  • ・スタブリゾルバは定義上、自力でルートから辿ることはしない

端末のスタブリゾルバは、RFC 9499 の定義では "cannot perform all resolution itself"——自分だけでは解決を完遂できないものです。だから設定されたフルサービスリゾルバにRD=1で丸投げします。

受け取ったフルサービスリゾルバは、自分が再帰モードで処理を引き受け、その内部ではルート・jp・iij.ad.jp へとRD=0で問い合わせて紹介を辿ります。この1台が、下流に対しては再帰、上流に対しては反復をやっているわけです。

フラグを見れば一目で分かります。同じサーバに同じ名前を尋ねても、RDビットの有無でフラグ表示が変わります。

同じサーバ(8.8.8.8)への2回の問い合わせ、フラグの違い追跡ログ
$ 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: 1
RD が無い = 再帰を依頼していない
✓ ここまでの確認

「フルサービスリゾルバは再帰サーバ、権威サーバは反復サーバ」——この整理は妥当ですか。

具体実物

山場 — 「ルートサーバは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」をめぐる3つの数表
何の数か 値 注意
ルートゾーン上の名前 13 a〜m.root-servers.net
実際のサーバインスタンス 約2000 2026年9月時点。日々変わる
運用組織 12 13ではない

3行目にも注意してください。「13の組織が運営している」という言い方も誤りです。運用組織は12です。Verisign が A と J の2つを運用しているためで、レターの数と組織の数が一致しません。

抽象原理

では「なぜ13なのか」— 512バイト説を現在形で書かない

ここで必ず出てくるのが、「13なのは、DNS応答が512バイトに収まるようにするためだ」という説明です。すらすら読めて、いかにも根拠がありそうです。

しかし、これを現在形で書くと事実に反します。 実際に測ってみます。

ルートへの NS 問い合わせを実測(2026年9月13日)
a.root へ +noedns508バイト× NS 13本 / A 7本 + AAAA 6本
k.root へ +noedns492バイト× NS 13本 / A 13本 + AAAA 2本
a.root へ EDNS0あり811バイト○ NS 13本 / A 13本 + AAAA 13本
↓
NS 13本は512バイトに収まる。しかしアドレス26本は収まらない
  • ・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で再問い合わせできます。

ところが実測した応答のフラグは、こうでした。

$ dig @198.41.0.4 . NS +noedns のヘッダ部分コマンド出力
;; ->>HEADER<<- opcode: QUERY, status: NOERROR
;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13
;; MSG SIZE rcvd: 508
 
flags に tc が無い。ADDITIONAL は 13 しか入っていないのに、
「切り詰めた」とは通知されていない

TCフラグは立っていません。 追加セクションのアドレスは「あれば便利な補助情報」という位置づけなので、入り切らなければ黙って落とされるだけです。エラーにも警告にもなりません。

ステータスは NOERROR、TCフラグも無し。どこにも異常が現れないまま、情報が欠けているわけです。第14週で見た「便利な近似を無条件の真実として語らない」という姿勢と同じで、ここでは「エラーが出ていないから正常」という判断が通用しません。

抽象原理

「無かった」もキャッシュされる

最後に、キャッシュの話をします。DNSが現実的な速度で動いているのは、同じ問いを何度もルートから辿り直さないからです。各レコードにはTTL(生存時間)が付いていて、その秒数のあいだ再利用されます。

なお、ここで言うTTLは秒数です。第2期で既に出てきたIPヘッダのTTLとは別物なので、混同しないでください(この2つの違いは第26週で改めて扱います)。

見落とされがちなのは、「見つからなかった」という結果もキャッシュされることです。これをネガティブキャッシュと呼びます。そして否定応答には2種類あり、混同されがちです。

2種類の否定応答(RFC 2308)表
種類 意味 RCODE
NXDOMAIN 名前そのものが存在しない 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 だけを見る説明をよく見ますが、それでは不正確です。

$ dig +noall +answer jp SOA — 2つの数を読むコマンド出力
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だけを見る説明は不正確。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 4正解: 0

「ルートサーバが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)。