3 Minutes NetWorking
No.66

3Minutes NetWorking

第66回DNS(5) DNSメッセージ

■ 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問い合わせ/応答QR0…問い合わせ
1…応答
4オペレーションコードOPcode0…問い合わせ
1…逆問い合わせ
2…サーバ状態要求
1オーソリティ応答AA0…反復の結果の応答
1…そのネームサーバからの応答
1切捨てTC0…データサイズ512バイト以下
1…512バイト超
1再帰要望RD0…反復問い合わせ
1…再帰問い合わせをネームサーバに要求
1再帰有効RA0…再帰不可能
1…再帰可能
3予約--すべて0
4戻りコードRcode0…応答成功
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コードだからな。
ちなみに質問名のドメインの書き方はちょっと特徴がある。こうだ。

  1. 問い合わせるドメイン名をドットで分割します。これをラベルといいます。
    • 例:www5e.biglobe.ne.jpを、www5e、biglobe、ne、jpに
  2. 各ラベルの先頭に文字の長さを1バイト(16進数)で追加します。
    • 例:0x05www5e、0x07biglobe、0x02ne、0x02jp
  3. 一番後ろに0x00を追加して一列に並べます
    • 例:0x05www5e0x07biglobe0x02ne0x02jp0x00
ネット助手

ラベルと、文字の長さ、ですか。

インター博士

そういうことだな。そして質問タイプ(Qtype)と質問クラス(Qclass)だが。
これはリソースレコードのタイプとクラスをそのまま使う。

ネット助手

ということは、例えばAレコードなら「1」、NSレコードなら「2」ってことですか?

インター博士

そう、どのリソースレコードを問い合わせるかをここに書くわけだな。

ネット助手

んん? 普通Aレコードじゃないんですか?

インター博士

ま、普通はな。だがメールサーバの問い合わせの場合はMXを入れなきゃならんだろ?

ネット助手

あぁ、そういうことですか。

インター博士

そういうことだ。クラスは普通「IN」なのでやはり「1」が入るわけだな。
では例として、「www5e.biglobe.ne.jp」のAレコードを問い合わせた場合を書いておこう。

0x05www5e0x07biglobe0x02ne0x02jp0x00
0x00010x0001

[Table66-04:質問セクション・例]

■ リソースレコードのセクション

インター博士

質問セクションの下には、回答、オーソリティ、追加の3種のリソースレコードが入る。
リソースレコードの形を覚えているか?

ネット助手

ええ〜っと、確か、こうでしたよね。

名前(Name)可変長リソースレコードの名前
タイプ(Type)16ビットリソースのタイプ
クラス(class)16ビットクラス。通常は0x0001の値をとる
TTL32ビットリソースレコードのキャッシュ時間(秒)
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を使用する。

3 Minutes NetWorking No.66

管理人:aji-ssz(at)selene.is.dream.jp