UDP経由のDNSに512バイトの制限があるのはなぜですか?


14

私はその質問(タイトルの1つ)に対する答えを探していましたが、見つけた最高のものは次のとおりでした。

DNSプロトコル設計では、UDPトランスポートのブロックサイズ(ペイロードサイズ)は512バイトに制限されており、パフォーマンスを最適化しながら、最小限のネットワークトラフィックを生成します。

私の質問は、これがパフォーマンスをどのくらい正確に向上させ、UDPを使用するときにこの制限の他の理由があるか?


5
質問は実際には誤った前提に基づいています(少なくとも時代遅れの前提です)。512バイトのペイロード制限はもうありません。以下の私の答えをご覧ください。
-HåkanLindqvist 14

回答:


18

512バイトのペイロードにより、転送中にフラグメント化された場合にDNSパケットを再構成できることが保証されます。また、一般的に、小さいパケットがランダムにドロップされる可能性は低くなります。

IPv4の標準すべてのホストが576バイト以下のリアセンブルパケットのことができるようにしなければならないことを指定します。IPv4ヘッダー(20バイト、オプション付きで最大60バイト)と8バイトUDPヘッダーを使用すると、512バイトのペイロードを持つDNSパケットは576バイトより小さくなります。

@RyanRiesが言うように:DNSは、より大きなペイロード、ゾーン転送、およびDNSSECにTCPを使用できます。UDPとは異なり、データが流れ始める前にクライアントとサーバーの間でハンドシェイクが行われるため、TCPが機能するようになると、待ち時間が長くなります。


7
関連するメモ:13個のルートDNSリゾルバー名(a.root-servers.netからm.root-servers.netまで)が常に存在する理由は、クエリに対するDNS応答に収まる最大数であるためです。 512バイトの制限を超えないルート。したがって、ルートDNSインフラストラクチャに物理サーバーを追加しても、論理的には常に13個のルートサーバーが残ります。
フィーバス14

2
@RyanRiesが許可されたペイロードが大きいDNSSEC EDNS0の場合、実際にはTCPではなく通常の動作モードです。
–HåkanLindqvist 14

1
許可される最小のMTUは576バイトではなく、IPv4では68バイト、IPv6では1280バイトです。
カスペルド14

1
@phoebusでは、13台のサーバーが512バイトを超えないのに対し、14台のサーバーは512バイトを超えないことを教えてください。その背後にある計算は何ですか?
ティティワンサビンダムホール

1
512 + 60 + 8 = 580バイト、576ではなく?
カルロウッド

12

最近のDNSは、実際にはUDPの512バイトのペイロードに制限されていません。

EDNS0使用に大きなペイロードサイズは、一般的にも、DNSSEC対応クライアントの場合であり、特定することができます。

UDPを介したより大きなペイロードのサポートは両刃の剣でしたが、攻撃者が大きな応答を取得するクエリを使用するとより良い増幅を達成できるため、増幅攻撃にネームサーバーを使用することが一般的になった理由の一部です。

参照してくださいRFC2671 EDNS0の核心ザラザラの詳細については、


2
これは事実ですが、UDP DNSパケットを512バイトを超えてドロップするルーターとファイアウォールがまだあります。
ライアンリース14

2
@RyanRiesはい、もちろん今日の標準では正しくないと考えられている動作ですが、それでも問題を引き起こすことがあります。(理論的には、そのような制限がある場合、関連するソフトウェアを処理して、より大きな応答を送信しない/処理する能力をアドバタイズしないように構成することを知っているでしょう。)
HåkanLindqvist 14

1

クエリなどのDNS操作、およびゾーンのメンテナンス操作は、デフォルトでポート53を使用します。パフォーマンス上の理由から、クエリは512バイトのブロックサイズ制限を持つUDPプロトコルを使用します。TCPは、クエリ操作のためにトランザクションごとにオプションでネゴシエートできますが、TCPで発生するパフォーマンスオーバーヘッドのため、これは本質的に理論上の機能です。歴史的に、512バイトの応答サイズ制限を超えることは通常すべてのコストで回避され、実際、13個のIPv4ルートサーバーの制限は単一の512バイトUDPトランザクションで返すことができる最大でした。

ロンエイチソン-Pro DNSおよびBIND 10-2011


ありがとう。引用元を知ることができますか(引用元を示すため)。
ポティカリムトゥ

-2

そのQOSのこと。

UDPはステートレスであるため、パケットのエラー処理は不可能です。

したがって、パケットを最大サイズに維持することで、パケットが宛先に届くまでの変化が大きくなり、エラー処理がない場合の影響が軽減されます。


パケットが大きくても、UDPがTCPにフェールオーバーするわけではありません。あなたが言っていることを誤解していますか?
mfinni 14

あなたはおそらく正しいです。私はどこかで提案されたRFCでそれを読んだと思います。
ギャレスマクデイド14

UDPはフェイルオーバーしませんが、特にDNSの場合、UDPを使用するときに応答が大きすぎて収まらない場合、これは切り捨てられた応答になります(実際の応答にはすべてのデータが含まれておらず、これを示すために「切り捨てられた」フラグが設定されます)、クライアントは、代わりにTCPを使用して再試行できます。
-HåkanLindqvist 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.