DNS协议如何从UDP切换到TCP?

Sta*_*tic 40 domain-name-system rfc

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

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

所以情况是这样的:DNS 客户端要求使用 UDP 解析记录。UDP 的记录太长:

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

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

fak*_*ker 50

客户端事先不知道响应会太大,所以会通过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 标志。当客户端收到这样的响应时,它会将 TC 标志作为它应该通过 TCP 重试的指示。

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

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

  • RFC 5966 还指出 TCP *总是* 用于区域传输。 (2认同)