■ DNSメッセージ
DNSがどういう動きをするか、わかってもらえたと思う。
再帰問い合わせと反復問い合わせですね。
うむ。ネームサーバへの問い合わせに使うのが、再帰問い合わせ。
ネームサーバが他ネームサーバへ問い合わせるのが反復問い合わせだな。
再帰問い合わせは、ネームサーバに「IPアドレスを教えて」って頼む奴ですよね。
それに応じて、ネームサーバが調べてくれるって事ですよね。
そういうことだ。
さて、具体的なDNSの中身をしるために、今回はDNSメッセージを説明しよう。
でぃーえぬえすめっせーじ?
DNSで使うデータのことですか?
うむ、その通り。
DNSメッセージの構成は以下の通り。
識別(ID) [16bit] | フラグ [16bit] |
質問の数(QD Count) [16bit] | 回答の数(AN Count) [16bit] |
オーソリティの数(NS Count) [16bit] | 追加情報の数(AR Count) [16bit] |
質問 [可変長] | |
回答リソースレコード [可変長] | |
オーソリティリソースレコード [可変長] | |
追加情報リソースレコード [可変長] |
[Table66-01:DNSメッセージ]
さて、ネット君。
これを見て気づいたことは?
固定長の部分と、可変長の部分があります。
うむ、そうだ、いいぞネット君。
他には何かあるかね?
「〜の数」ってのと、下の可変長の部分の名前が一致しています。
うむうむうむうむ。
いや、すごいなネット君。感動ものだ。
えへへ、そうですか?
我ながらよくここまでネット君を培養できたなと感慨しきりだよ。
自分の教授法が間違ってなかった事を再確認できたよ。
えへへ…………。
あれ? 僕を褒めてるわけではないんですね?
「包丁を研いだらよく切れるようになった」。さてネット君、ここで包丁を褒める奴はいないだろう?
褒められるのは研いだ人の腕だよ。包丁じゃない。
うぅぅぅ。
ともかく、だ。ネット君が指摘した、固定長の部分。いわゆるDNSヘッダと呼ばれる部分だな。
ここは 16bit × 6 で12バイトある。
です。
ここには問い合わせ・応答の内容やリソースレコードの数が明記される。
リソースレコードの数。
ヘッダの下に続く部分の数ですね。
そうだ。問い合わせに応じて、ネームサーバからいくつかのリソースレコードが返ってくるが、その数だな。これは先で話そう。
はい。
■ DNSヘッダ
12バイトのDNSヘッダだが、まずあるのが識別(ID)だな。
これは送った問い合わせと応答で同じ値が使われる。それにより、その2つを認識できるわけだ。
つまり、この問い合わせの答えが、この応答だってわかるわけですね。
そういうことだ。
次の16ビットは「フラグ」だが、これは実はもっと細かく分けられる。
ビット数 | 名前 | 意味 | |
---|---|---|---|
1 | 問い合わせ/応答 | QR | 0…問い合わせ 1…応答 |
4 | オペレーションコード | OPcode | 0…問い合わせ 1…逆問い合わせ 2…サーバ状態要求 |
1 | オーソリティ応答 | AA | 0…反復の結果の応答 1…そのネームサーバからの応答 |
1 | 切捨て | TC | 0…データサイズ512バイト以下 1…512バイト超 |
1 | 再帰要望 | RD | 0…反復問い合わせ 1…再帰問い合わせをネームサーバに要求 |
1 | 再帰有効 | RA | 0…再帰不可能 1…再帰可能 |
3 | 予約 | -- | すべて0 |
4 | 戻りコード | Rcode | 0…応答成功 3…問い合わせの名前なし |
[Table66-02:フラグ]
うわ、ずいぶんと細かいですね。
まぁ、それほど難しいことがあるわけではないのだがな。
ちゃんと今までのことを覚えていれば、わかる。
それが難しいです。
うむ。的確な自己分析だ。
フラグについては、一気に説明しよう。
[Figure66-01:フラグ詳細]
こんな感じだな。要はDNS問い合わせ/応答の状態を表すために存在する。
なるほど。
これについては、また先で出てくる。
さて、残りの「〜の数」だが、まず「質問の数(QD Count)」。これは基本的には1が入る。
ちなみに質問ってのは、問い合わせるってことですか?
そうだな、問い合わせるドメイン名の数ってことだな。
残りの3つAS Count、NS Count、AR Countは問い合わせに対する答えの数だと思ってくれればいい。
答え…。答えってことは「回答リソースレコード」だけでいいんじゃないんですか?
オーソリティとか追加ってのがなんなのかさっぱりですけど。
まぁまぁ。それについてはヘッダから下を説明してからだな。
■ 質問セクション
ヘッダの下には質問セクションが入る。
これは可変長で、以下の形だ。
質問名(Qname) [可変長] | |
質問タイプ(Qtype) [16bit] | 質問クラス(Qclass) [16bit] |
[Table66-03:質問セクション]
まぁ、そのまんまなのだが。
質問名には問い合わせるドメイン名がASCIIコードで入る。
またASCIIコードなんですか。
そうだな、やはり基本はASCIIコードだからな。
ちなみに質問名のドメインの書き方はちょっと特徴がある。こうだ。
- 問い合わせるドメイン名をドットで分割します。これをラベルといいます。
- 例:www5e.biglobe.ne.jpを、www5e、biglobe、ne、jpに
- 各ラベルの先頭に文字の長さを1バイト(16進数)で追加します。
- 例:0x05www5e、0x07biglobe、0x02ne、0x02jp
- 一番後ろに0x00を追加して一列に並べます
- 例:0x05www5e0x07biglobe0x02ne0x02jp0x00
ラベルと、文字の長さ、ですか。
そういうことだな。そして質問タイプ(Qtype)と質問クラス(Qclass)だが。
これはリソースレコードのタイプとクラスをそのまま使う。
ということは、例えばAレコードなら「1」、NSレコードなら「2」ってことですか?
そう、どのリソースレコードを問い合わせるかをここに書くわけだな。
んん? 普通Aレコードじゃないんですか?
ま、普通はな。だがメールサーバの問い合わせの場合はMXを入れなきゃならんだろ?
あぁ、そういうことですか。
そういうことだ。クラスは普通「IN」なのでやはり「1」が入るわけだな。
では例として、「www5e.biglobe.ne.jp」のAレコードを問い合わせた場合を書いておこう。
0x05www5e0x07biglobe0x02ne0x02jp0x00 | |
0x0001 | 0x0001 |
[Table66-04:質問セクション・例]
■ リソースレコードのセクション
質問セクションの下には、回答、オーソリティ、追加の3種のリソースレコードが入る。
リソースレコードの形を覚えているか?
ええ〜っと、確か、こうでしたよね。
名前(Name) | 可変長 | リソースレコードの名前 |
タイプ(Type) | 16ビット | リソースのタイプ |
クラス(class) | 16ビット | クラス。通常は0x0001の値をとる |
TTL | 32ビット | リソースレコードのキャッシュ時間(秒) |
RD長(RDLength) | 16ビット | RDATAの長さ |
RDATA | 可変長 | リソースの中身 |
[Table63-01:リソースレコードの形]
うむ、よろしい。これがそのまま入る。
あ、そうなんですか?
ただし、名前(Name)のところは先ほどの質問セクションと同じ書き方だ。
ラベルと長さですか?
そう。
ただし、同じ名前が出てきた場合、圧縮が可能だ。
圧縮?
例えば、回答のところでhoge.co.jpというドメイン名がでてきたとする。
次に、オーソリティのところでもhoge.co.jpというドメイン名がでてきた。2度書くのは無駄だろう?
まぁ、無駄と言えば無駄ですけど。
その場合、同じドメイン名が出てきた場所を表す値を書いておく。そうすれば短くて済む。
なるほど。
そして、回答セクションには質問セクションにあったドメイン名に対応したレコードを入れ、オーソリティセクションにはそのドメインのネームサーバ名が入る。
追加セクションには?
これはネームサーバの仕様によって異なることがあるが、オーソリティセクションのネームサーバのAレコードが入ることがある。
オーソリティセクションのネームサーバのAレコード?
オーソリティセクションには、NSレコード、つまりネームサーバのドメイン名が置かれる。
そのドメイン名に対してのAレコードということだ。
ははぁ。
■ DNSメッセージのやりとり
さて、簡単な形でだが、このメッセージのやりとりを説明しよう。
[Figure66-02:DNSメッセージのやりとり]
ははぁ。
まぁ、これは簡単な例だからな。
実際は自分で見てもらった方が早い。
見ることができるんですか?
うむ、nslookupというコマンドを使えば見ることができる。
へへぇ、どんなのです?
それは先の回で説明するので今回はなしだ。
今回は簡単な形だが、メッセージのやりとりの仕組みがわかればいい。
了解です。
■ TCPを使ったDNS
さて、ネット君。DNSは基本的にはUDPを使うといったな。
あ、はい。
「基本的に」といったのでわかると思うが、例外も存在する。
それはDNSメッセージが512バイトを超えた場合だ。
512バイトを超えた場合?
なんで512バイトなんですか?
いや、それは知らん。そういう風に決まっているのだ。
ともかく、応答が512バイトを超えた場合や、要求の時点であきらかに応答が512バイトを超えることがわかっている時はTCPを使う。
TCPを。
そうだ。ポートは同じ53番だ。
ここでのキーポイントは、DNSヘッダの切捨てフラグだ。動作は以下の形になる。
[Figure66-03:TCPを使ったDNS]
は〜、512バイトを超えたらTCPに切り替えるんですね。
そうだ。また明らかに応答メッセージが512バイトを超える場合は、最初からTCPを使う。
なるほど。
そういうことだ。
では今回はこれで終わり。まだまだDNSは続くぞ。
長いですね、DNS。
なんと言っても、インターネットの基幹だからな。
では、また次回。
了解です。
3分間ネットワーキングでした〜♪
- セクション
-
[section]
もしくは「質問エントリ」とも言います。
- 同じドメイン名が出てきた…
-
16ビットで先頭は「11」で始まる値。
残り14ビットで、DNSヘッダの1バイト目を0として、何バイト目に同じドメイン名が登場したかを示す。
- 応答が512バイトを超える
- nslookupで「ls -d」を実行した場合など。
- ネット君の今日のポイント
-
- DNSメッセージはDNSヘッダと質問セクション、リソースコードのセクションに分かれる。
- ヘッダには問い合わせの内容や方式、リソースレコード数が明記される。
- 質問セクションは問い合わせるドメイン名が入る。
- リソースレコードのセクションには回答としてリソースレコードが入る
- 回答セクションは問い合わせの回答のレコード。
- オーソリティセクションにはそのドメインのネームサーバのNSレコード
- 追加セクションにはネームサーバのAレコード。
- 512バイトを超える応答の場合、TCPを使用する。