DNS协议如何从UDP转换为TCP?

DNS协议如何从UDP转换为TCP?

在有人问之前:我已经看到了DNS 查询何时使用 TCP 而不是 UDP?但它并没有回答我的问题。

我不断听到的是“如果答案太长,DNS将使用TCP“但这并不能解释它是如何发生的。

情况如下:DNS 客户端请求使用 UDP 解析记录。该记录对于 UDP 来说太长:

  1. 服务器以特定的操作码应答,让客户端切换到 TCP
  2. 服务器根本没有应答,客户端通过 TCP 重试
  3. 服务器打开与客户端的 TCP 连接(如果算上 NAT,那就太蠢了,但谁知道呢?)
  4. 客户端以某种方式(?)“知道”给定的查询应该通过 TCP 运行,因此它首先不会理会 UDP
  5. DNS 精灵在需要时神奇地将 UDP 转换为 TCP

我一直在互联网上寻找答案,但是有很多噪音(见上文),而且我似乎无法为此编写正确的 Google 查询(事实上,我也无法在 RFC 中找到信息)。

答案1

客户端事先不知道响应会太大,因此它会通过 UDP 查询服务器。
服务器将通过 UDP 进行响应,并尽可能多地包含响应内容,并设置截断报头位(“TC”http://www.networksorcery.com/enp/protocol/dns.htm)。
然后客户端可以通过 TCP 重新发送请求并获取完整的响应。

也可以看看:https://www.rfc-editor.org/rfc/rfc5966

在没有 EDNS0(DNS 0 的扩展机制)的情况下(见下文),任何需要发送超过 512 字节限制的 UDP 响应的 DNS 服务器的正常行为是截断响应以使其符合该限制,然后在响应标头中设置 TC 标志。当客户端收到此类响应时,它会将 TC 标志视为应通过 TCP 重试的指示。

和:https://www.ietf.org/rfc/rfc2181.txt

正如评论中所提到的,DNS 区域传输当然总是使用 TCP。

相关内容