DNSプロトコルはどのようにUDPからTCPに切り替わりますか?


31

誰かが尋ねる前に:DNSクエリがUDPではなくTCPを使用するのはいつですか?それは私の質問に答えません。

私が聞き続けるのは、「答えが長すぎる場合、DNSはTCPを使用します」です。しかし、これはそれがどのように起こるかを説明しません。

状況は次のとおりです。DNSクライアントはUDPを使用してレコードの解決を要求します。レコードはUDPには長すぎます:

  1. サーバーが特定のオペコードで応答し、クライアントをTCPに切り替えます
  2. サーバーはまったく応答せず、クライアントはTCPで再試行します
  3. サーバーはクライアントへのTCP接続を開きます(NATをカウントする場合は愚かですが、誰が知っていますか?)
  4. クライアントは何らかの形で(?)与えられたクエリがTCP上で実行されるべきであることを「知っている」ので、そもそもUDPに煩わされません
  5. DNS pixiesは必要に応じてUDPをTCPに魔法のように変換します

私は答えをインターネットで探していましたが、多くのノイズがあり(上記を参照)、そのための適切なGoogleクエリを書くことはできません(RFCで情報を見つけることもできません) 。


1
私が見つけることができたのはRFC5966だけでした:「リゾルバはUDPクエリを最初に送信する必要がありますが、UDP経由で送信された場合に応答が切り捨てられることを期待する十分な理由がある場合、代わりにTCPクエリを送信することを選択できます(EDNS0の有無にかかわらず) )または他の運用上の理由により、特に、サーバーへのTCP接続が既に開いている場合。」リゾルバーは、応答が切り捨てられることを「予期」する必要がありますか?
StanTastic

6
明らかな例は、同じレコードに対する以前の要求が長すぎてUDPデータグラムに収まらない場合です。
デビッドシュワルツ

1
「切り捨てられた」というオペコードがありますよね?そして、それはそれから切り替わります-基本的に私が考えたもの、それは最も明白な解決策です。
StanTastic

1
クエリに複数の「質問」(解決するアドレス)が含まれる場合、ケース(d)が賢明な選択である可能性があります。100個のアドレスを解決する必要がある場合、単一のUDPパケットに応答を収めることはできません。
–MSalters

1
1.そして、4.の両方(状況に依存して両者のある)概ね正しいです。
カスペルド

回答:


45

クライアントは、応答が大きすぎることを事前に知らないため、UDPを介してサーバーに照会します。
サーバーはUDPを介して応答し、可能な限り多くの情報を含めて、切り捨てられたヘッダービット(「TC」http://www.networksorcery.com/enp/protocol/dns.htm)を設定します。
その後、クライアントはTCPを介して要求を再送信し、完全な応答を取得できます。

参照:https : //tools.ietf.org/html/rfc5966

EDNS0(DNS 0の拡張メカニズム)がない場合(以下を参照)、512バイトの制限を超えるUDP応答を送信する必要があるDNSサーバーの通常の動作は、サーバーが適合するように応答を切り捨てることです。その制限内で、応答ヘッダーにTCフラグを設定します。クライアントがこのような応答を受信すると、代わりにTCPで再試行する必要があることを示すものとしてTCフラグを使用します。

および:https : //www.ietf.org/rfc/rfc2181.txt

そしてコメントで述べたように、もちろんDNSゾーン転送は常にTCPを使用しています。


2
RFC 5966は、ゾーン転送には常に TCPが使用されることにも注意しています。
マットのNordhoff

@MattNordhoffそうですね、それは真実であり、言うまでもありません。これは、「UDPからTCPへの切り替えがどのように機能するのか?」に焦点を当てていました。角度。しかし、答えに追加します。
フェイカー

しかし、TCP接続がすでに存在する場合にのみTCPを使用します
ジム・B

ああ、それは面白い。では、いつUDPにフォールバックしますか?
StanTastic

@JimBそれについて確かですか?永続的なTCP接続を開いたままにするとは思わない。
バーマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.