pasasの日記: Cプログラムとリゾルバ(その2)
日記 by
pasas
answer に含まれるデータのうち、問い合わせ部は以下の情報が含まれている。
- ドメイン名(可変長)
- 問い合わせのタイプ(2オクテット)
- 問い合わせのクラス(2オクテット)
この中で問い合わせのタイプは arpa/nameser.h の中で定義されている値で、MX レコードの場合には T_MX(0x0f)になる。
問い合わせのクラスも同様に arpa/nameser.h の中で定義されているけど、この場合は C_IN(0x01)になる。
回答部、権威部、付加情報部は以下のような情報が含まれている。
- ドメイン名(可変長)
- タイプ(2オクテット)
- クラス(2オクテット)
- TTL(4オクテット)
- 資源データの長さ(2オクテット)
- 資源データ(可変長)
この中のタイプとクラスは上記の通りである。
ドメイン名は長さ・ラベルの組み合わせで表現されている。
そして、長さ 0が現れた時点でドメイン名が終了であることを示す。
つまり、
5 yahoo 2 co 2 jp 0
といった形で表現されることになる。
ところで、問い合わせをした結果、複数のエントリを返す場合が多い。
また、その中には重複するラベルが含まれている場合が多い。
そのため、以前に現れたラベルを示すポインタを置くことで、冗長なデータをなくすようにしている。
これをドメイン名の圧縮と呼ぶ(らしい)。
ポインタはメッセージの先頭からのオクテットで表す。
圧縮はラベルの長さが 63 オクテットまでに制限されていることを利用している。
つまり長さフィールドの上位 2ビットが 1 のときには、その後に続くビットと、
次のオクテットを合わせた 14ビットで長さを表している。
眠くなってきたので続きはまた次回。
Cプログラムとリゾルバ(その2) More ログイン