RFC 1035: DNS
DNSの電文を、ヘッダ12バイト・5セクション構成・リソースレコードの並び・ラベル符号化とポインタ圧縮・512バイト制限とTCP移行まで、1バイト単位で読み解けるようになるRFC 1035の精読ガイド。
- RFC 1035はDNSの実装仕様で、電文の形式・リソースレコードの構造・ゾーンを書くマスターファイル形式を定める。概念や名前空間設計を述べる姉妹RFC 1034と対になり、1034が「何を」なら1035は「どう並べるか」を担当する。
- 電文はヘッダとQuestion/Answer/Authority/Additionalの5部構成。レコードはNAME・TYPE・CLASS・TTL・RDLENGTH・RDATAを持ち、名前は長さ付きラベルを並べ、ルートを示す0で終える。
- 同じ名前の重複を避けるため、長さオクテットの上位2ビットが「11」なら残り14ビットをメッセージ先頭からのオフセットとみなす圧縮ポインタを使う。UDPは512バイト上限で、超えるとTCビットを立ててTCPへ移行する。
このRFCが決めたこと
横にスクロール
RFC 1035(1987年、Paul Mockapetris)は、DNS を実際に動かすための実装仕様です。姉妹編の RFC 1034 が名前空間の木構造・委任・キャッシュといった概念を述べるのに対し、1035 は電文をバイト単位でどう組み立て、リソースレコード(RR)をどう符号化し、ゾーンをどんなテキスト(マスターファイル)で書くかという具体を定めます。名前解決の考え方は DNS の基本 に譲り、ここでは電文そのものを読みます。
問い合わせも応答も、同じ単一のメッセージ形式を共有します。ヘッダの RD(再帰希望)で端末がリゾルバに再帰を頼み、応答の RA(再帰可能)でサーバーが再帰対応を示す——反復と再帰の役割分担は、ビット1本ずつに現れます。
メッセージ形式を精読する
1つのメッセージは固定 12 バイトのヘッダに続き、4つの可変セクションが並びます。
+---------------------+
| Header | 固定 12 バイト
+---------------------+
| Question | 問い合わせ(QDCOUNT 件)
+---------------------+
| Answer | 回答 RR(ANCOUNT 件)
+---------------------+
| Authority | 権威 RR(NSCOUNT 件)
+---------------------+
| Additional | 追加 RR(ARCOUNT 件)
+---------------------+
ヘッダには識別用の ID、QR(問い合わせ/応答)、Opcode、AA(権威応答)、TC(切り詰め)、RD/RA、RCODE(エラー番号)と、各セクションの件数 QDCOUNT/ANCOUNT/NSCOUNT/ARCOUNT が入ります。件数を先に読むから、可変長のセクションでも境界を見失いません。Question は問い合わせたい名前(QNAME)・型(QTYPE)・クラス(QCLASS)の3つ組です。
Answer 以降に並ぶ RR は、すべて共通の型を持ちます。
NAME 可変長 ラベル列。末尾はルートを表す 0
TYPE 16bit A=1 NS=2 CNAME=5 SOA=6 PTR=12 MX=15
CLASS 16bit IN=1(インターネット)
TTL 32bit キャッシュ可能な秒数(0=キャッシュ不可)
RDLENGTH 16bit RDATA のバイト長
RDATA 可変長 型ごとの中身(A なら 4 バイトの IPv4)
TYPE は 1035 が A・NS・CNAME・SOA・PTR・MX などを定義します(IPv6 の AAAA は後発の RFC 3596)。TTL はこの RR をキャッシュしてよい秒数で、0 はキャッシュ禁止。RDLENGTH が RDATA のバイト長を先に与えるので、パーサは未知の型でも安全に読み飛ばせます。
名前の符号化と圧縮
ドメイン名は「長さ1バイト+その長さ分のラベル」の繰り返しで、末尾のルートを表す長さ0で終わります。
www.example.com. の符号化(先頭の数字は長さオクテット):
3 w w w 7 e x a m p l e 3 c o m 0
↑ ↑
最初のラベル長 ルート(長さ0)で終端
ラベルは最大 63 バイト、名前全体は最大 255 バイト。この上限は、長さオクテットの上位2ビットの割り当てとも結びついています。
| 長さオクテット上位2ビット | 意味 | 残りビットの用途 |
|---|---|---|
| 00 | 通常ラベル | ラベル長(0〜63) |
| 11 | 圧縮ポインタ | 14ビットのオフセット |
| 01 / 10 | 予約 | 1035では未使用 |
上位2ビットが 11 のとき、その2バイトは圧縮ポインタになり、残り14ビットがメッセージ先頭からのオフセットを指します。1つの電文に何度も現れる example.com を毎回書かず、最初の1回を指すことで電文を縮められます。
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| 1 1| OFFSET (14 bit) |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
上位2ビットが 11 → 残り14ビット = メッセージ先頭からのオフセット
つまずきやすい点
UDP でのペイロードは 512 バイトに制限され、応答が収まらないとサーバーは TC(切り詰め)ビットを立てて返します。リゾルバはそれを見て、同じ問い合わせを TCP で再送します。TCP と UDP の使い分けの原理は TCP と UDP を参照。現代は EDNS0 でより大きな UDP バッファを広告して 512 の壁を回避しますが、それも 1035 の枠組みの上に載る拡張です。
圧縮ポインタでもう1つ誤りやすいのが、オフセットが絶対位置である点です。14ビットはヘッダ先頭(ID の第1バイト)からの絶対オフセットで、現在位置からの相対ではありません。ゆえに指せる範囲は先頭 16383 バイトまでに限られ、かつ既出の名前(後方)しか指せません。自前でパーサを書くと、ここでポインタのループや範囲外参照のバグを踏みがちです。
TTL はレコードごとに付き、キャッシュする側が保持してよい上限を秒で示します。短くすれば切り替えは速く反映されますが権威への問い合わせが増える、というトレードオフの原理はこの1フィールドに集約されています。SOA レコードの各タイマー(refresh/retry/expire/minimum)と混同しないことも大切です。
まとめ
RFC 1035 の核は3点です。すなわち「件数を先頭に置いた12バイトのヘッダと5セクション」、「NAME/TYPE/CLASS/TTL/RDLENGTH/RDATA という一様なリソースレコード」、そして「長さオクテットの上位2ビットで通常ラベルとポインタを分ける名前符号化」。概念を述べる RFC 1034 と対で読み、実際の電文を dig で採取して1バイトずつ突き合わせると、仕様の各フィールドが腑に落ちます。他の原典は RFC 精読 から辿ってください。
RFC精読の記事ガイド
RFC 1035: DNSを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
RFC
比較で見る軸
難易度: advanced / カテゴリ: RFC精読 / タグ数: 5
導入後に効く点
電文はヘッダとQuestion/Answer/Authority/Additionalの5部構成。レコードはNAME・TYPE・CLASS・TTL・RDLENGTH・RDATAを持ち、名前は長さ付きラベルを並べ、ルートを示す0で終える。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- RFC精読
- タグ数
- 5
判断チェックリスト
- 自社の用途が「RFC / DNS」に近いか確認する。
- 強みである「RFC 1035はDNSの実装仕様で、電文の形式・リソースレコードの構造・ゾーンを書くマスターファイル形式を定める。概念や名前空間設計を述べる姉妹RFC 1034と対になり、1034が「何を」なら1035は「どう並べるか」を担当する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。