要約

  • NXDOMAIN は実効的な問い合わせ名の不在を示す。NODATA は名前を残したまま、要求した型だけがないことを示す。前者は名前とクラス、後者は名前・型・クラスで保存しなければならない。
  • RFC 2308 は否定応答を持ち運べる証拠にすると同時に、必ず期限切れにした。ゾーンの SOA が応答に付き、SOA の TTL と MINIMUM の小さい方が負の TTL になる。ゼロになれば再利用できない。
  • DNSSEC、NXDOMAIN cut、積極的な否定キャッシュにより、一つの検証済み証拠が答えられる範囲は広がった。だからこそ範囲と寿命の誤りは重くなる。署名は DNS 内の出所と完全性を示すが、法的権利や永久の不在は示さない。

空の回答欄は、空の世界を意味しない

service.example の A レコードを尋ね、Answer セクションに A がないとする。それだけでは名前が存在しないのか、A だけがないのか、委任先を示されているのか、サーバーが一時的に失敗したのか判別できない。タイムアウトや SERVFAIL なら、ゾーンの内容についてさらに何も言えない。

解釈を誤ってキャッシュすると、見える名前空間そのものが変わる。A の欠如を名前全体の不在として保存すれば、有効な MX や TXT まで隠れる。逆に NXDOMAIN を A だけの不在として扱えば、存在しない名前について AAAA や TXT を何度も問い合わせることになる。

NXDOMAIN は DNS の Name Error であり、CNAME をたどった後の実効 QNAME とクラスを否定する。NODATA には専用 RCODE がない。NOERROR、関連する回答の欠如、そして referral ではないと判断できる Authority セクションから推論する状態である。

RFC 2308 はこの差をキャッシュキーに刻んだ。NXDOMAIN は <QNAME, QCLASS>、NODATA は <QNAME, QTYPE, QCLASS>。後者の QTYPE が、同じ名前に残る別の RRset を守る。

CNAME は「否定された名前」を動かす

利用者が入力した別名は存在していても、その CNAME が指す正規名が存在しないことがある。この NXDOMAIN は最後の宛先に関するもので、CNAME を返した別名の不在ではない。

最初のラベルに否定を貼り付ければ、証拠の対象を勝手に広げてしまう。NODATA も同様で、正規名に要求型がないという事実は、別名の他の型や正規名の子孫まで消さない。

RFC 2308 が QNAME を慎重に定義したのは、負のキャッシュが分散した証拠の運搬だからである。「何もない」を共有する前に、「どの名前に何がないのか」を固定する必要がある。

否定を別のリゾルバーへ渡す

RFC 1034 は 1987 年に負の応答のキャッシュを記述したが、任意機能だった。検索サフィックスや自動探索は同じ失敗を繰り返す。否定を記憶すれば、応答時間と権威サーバーへの負荷を減らせる。

ただし初期仕様には伝播の弱点があった。サーバーが保持した負の応答を、同じ根拠と残り時間を保ったまま他のリゾルバーへ安全に渡せなかった。ローカルな記憶はあっても、共有できる陳述にはなっていなかった。

1998 年 3 月の RFC 2308 はこの穴を埋めた。何かをキャッシュするリゾルバーは、負の応答も扱わなければならない。権威サーバーが NXDOMAIN または NODATA を返す時、包含ゾーンの SOA を Authority セクションへ入れる。SOA は発言するゾーンを示し、再利用できる時間を運ぶ。

負の TTL は SOA 自身の TTL と MINIMUM の小さい方である。キャッシュから返すたびに滞在時間を差し引き、ゼロなら古い否定は使えない。そこで初めて、名前空間をもう一度観測する。

RFC 2308 の著者欄には Mark Andrews の CSIRO 所属が記録される。これは著者の由来であり、記事の制度的主題ではない。共有仕様と後続 RFC は IETF の文書化プロセスを通じて形成された。

リセットされる時計は期限ではない

名前空間は木でも、forwarder の関係はループを作り得る。二台の誤設定サーバーが互いを転送先にしている時、持ち運べる時計のない否定を受け取るたびに新しい TTL を付け直せば、短いはずのエラーが永久に巡回する。

RFC 2308 が SOA のない負の応答をキャッシュすべきでないとする理由はここにある。一台での短い制限も、次の一台が時計を最初から回せば意味がない。SOA は各キャッシュに、同じ証拠が減衰していく境界を継承させる。

この整理は MINIMUM の多義性も修正した。RFC 1035 の TTL 下限という説明に、実装は既定値と負の寿命という役割を重ねた。RFC 2308 は普遍的な下限を廃し、ゾーンファイルの既定値を $TTL に分離し、MINIMUM を負の TTL の入力として残した。動くコードが曖昧さを先に示し、仕様が後から共有部分だけを明確にした。

実装が先に二種類の不在へ突き当たった

RFC 2308 の歴史付録は単独発明者の物語ではない。1980 年代末の CHIVES が、検索パスから生じる大量の失敗をキャッシュした経緯を記す。1990 年代初頭の BIND では、名前エラーと NOERROR_NODATA を分け、後に SOA を保存して証拠付きで返す実装へ進んだ。

これは全インターネットの普及率調査ではない。しかし「空」が互換性のある状態として粗すぎたことは分かる。RFC 2181 の RRset の明確化と RFC 2308 のタプルは、現場の発見を共同の語彙へ変えた。

記憶は、新しいデータの到着を遅らせる

受信時に正しかった否定も、ゾーン変更後には古くなる。名前を作成する前の NXDOMAIN が残っていれば、権威側では存在しても利用者には見えない。既存名へ AAAA を追加する前の NODATA が残れば、MX は見えるのに IPv6 接続だけが遅れて現れる。

TTL は確信度ではない。問い合わせ削減と修復反映速度の交換条件である。RFC 2308 はリゾルバーがより短い上限を設けることを認め、一〜三時間を実用的な既定値として挙げ、一日超は問題になったと記録する。

キャッシュは同時に否定を受け取らず、上限も同じではない。したがって世界共通の期限切れ時刻はない。権威ゾーンを直すだけでなく、変更前にどの種類の不在が観測されたかを考えて公開計画を立てなければならない。

障害は不在から分離する。タイムアウト、到達不能、SERVFAIL は回答を得られない状態であり、名前がない証拠ではない。これを NXDOMAIN に変換すると、メール拒否やアカウント回復失敗など、一時障害を越えて残る行動を誘発する。

一つの証拠が広い範囲へ答える

DNSSEC は不在を暗号学的に検証可能にした。RFC 4034 の NSEC は名前を正規順序で結び、既存 owner の型を列挙する。RFC 4035 は NXDOMAIN と NODATA の検証方法を定める。

署名されても二つの不在は別物である。owner 間の空間は名前の不在を証明し、既存 owner の型ビットマップは型の不在を証明する。暗号が保証するのは該当する DNS 証拠の出所と完全性である。

RFC 5155 の NSEC3 は owner 名をハッシュ化し、Opt-Out を含む。Opt-Out では、範囲を覆うレコードだけで、その中のあらゆる名前が存在しないとは証明できない。

RFC 8020 は定められた境界内で NXDOMAIN を下位名にも利用できるようにした。存在しないノードの下に子は存在できない。一方 NODATA の名前には別の型も子もあり得るため、同じ cut には使えない。

RFC 8198 は検証リゾルバーに、キャッシュ済み NSEC/NSEC3 から新しい負の回答を合成することを認めた。権威へ送っていない質問にも答えられる。効率は上がるが、否定範囲内で新設した名前が TTL 終了まで隠れる影響も広がる。

DNS の証拠を現実全体へ広げない

ゾーン運用者は内容と時間を選び、権威サーバーは応答を作る。再帰リゾルバーは分類、検証、上限設定、破棄を行い、アプリケーションが利用者への結果を決める。権限は分かれており、どれも DNS 外の現実を所有しない。

DNSSEC は名前の法的所有や組織の消滅を証明しない。正しい否定を多くの利用者へ増幅できても、TTL を越えて永久化する権限は生まれない。

歴史的成果は限定的だから強い。DNS は不在の対象と種類、発言できるゾーン、再利用期限を記述できるようになった。NXDOMAIN と NODATA を分けたことで、問い合わせ節約が残存データの消去にならずに済んだ。

出典と限界

初期設計と SOA は RFC 1034 と RFC 1035、RRset の明確化は RFC 2181 による。二種類の否定、キー、SOA の時計、転送ループ、実装史は RFC 2308 に基づく。認証された不在は RFC 4034、RFC 4035、RFC 5155、後の cut と合成は RFC 8020 と RFC 8198 を参照した。後代の機能を 1987 年へ遡及させず、歴史付録を網羅的測定ともみなさない。