13のルートDNSサーバーがある理由を説明するすべての記事では、各IPアドレスが32バイトを占めるので(13 x 32)= 416バイトで、他のプロトコル情報のために最大96バイトを残していると説明しています。例えば次のような
「DNSを設計するために使用されたIPアドレスは32ビットを含むIPv4でした。効率的なネットワーキングとより良いパフォーマンスを得るには、これらのIPアドレスを単一のパケットに収める必要があります(DNSのデフォルトプロトコルであるUDPを使用)。パケットパケットに入ることができるDNSデータは512バイトに制限されており、各IPv4アドレスには32バイトが必要なため、13台のサーバーが416バイトを使用し、残りのプロトコル情報には最大96バイトが残ります。
すべてのIPアドレスは32ビットではありませんか?上記の説明では、「IPv4アドレスごとに32バイトが必要です」とはどういう意味ですか? 32ビットアドレスが32バイトを占めるのはなぜですか?
答え1
「...各IPv4アドレスには32バイトが必要なので、13個のサーバーを保持するには416バイトが必要です。残りのプロトコル情報には最大96バイトが残ります。」
DNSプロトコルは、通常のIPアドレスのみを送信せず、DNSリソースレコードで構成されたよく構成されたクエリと応答を送信します。
A
「IPv4アドレスには32バイトが必要です」は、通常のIPアドレスのサイズではなく、DNSプロトコルで送信するためにフォーマットされたリソースレコードのサイズを意味するようです。
この値は、すべてのルートDNSサーバーが一意の非システム名を持つ場合は正確である必要があるように見えますが、現在のx.ROOT-SERVERS.NET
ルート名サーバーの名前がその形式に変更されたため、現在の状態は少し複雑です。
私はtcpdump
BIND9 DNSサーバーの起動時に実行しました。
- フルネーム
a.root-servers.net
(各ネームコンポーネントは長さが1バイトで、最後に0バイトがある=合計20バイト) - 16ビットレコードタイプコード(2バイト)
- 16ビットレコードカテゴリコード(2バイト)
- 32ビットTTL値(4バイト)
- 16ビットデータ長値(2バイト)
- 32ビットIPアドレス(4バイト)
したがって、ルートDNSサーバーからAレコードを要求すると、最初の応答レコードは実際には34バイトを占めます。
同じDNSメッセージの後続の応答レコードは、以前に言及された名前または名前の一部を参照する可能性があるため、完全に言及されているa.root-servers.net
場合は、b.root-servers.net
4バイト(部分は2バイトb
、次は2単語)セクションとして表示できます。参照サフィックスroot-servers.net
)。したがって、ルートサーバーの追加Aレコードはそれぞれ17バイトしか占有しません。
BIND9の実際の起動クエリは、dig . NS
UDPではなくTCPを介して発生し、同じです。
その結果、最初の応答レコードは、最初のルートDNSサーバーのフルネームを一覧表示する31バイトのNSレコードです。他のルートサーバーの後続のNSレコードはそれぞれ15バイトしか占有しません。追加情報として提示されたAレコードは各ルートサーバーのホスト名を完全に逆参照できるため、ルートDNSサーバーの各Aレコードは16バイトしか占有しません。応答には、ルートネームサーバーのIPv6 AAAAレコードも含まれます。それにもかかわらず、DNS応答の総長は1097バイトにすぎません。