在有人问之前:我已经看到了DNS 查询何时使用 TCP 而不是 UDP?但它并没有回答我的问题。
我不断听到的是“如果答案太长,DNS将使用TCP“但这并不能解释它是如何发生的。
情况如下:DNS 客户端请求使用 UDP 解析记录。该记录对于 UDP 来说太长:
- 服务器以特定的操作码应答,让客户端切换到 TCP
- 服务器根本没有应答,客户端通过 TCP 重试
- 服务器打开与客户端的 TCP 连接(如果算上 NAT,那就太蠢了,但谁知道呢?)
- 客户端以某种方式(?)“知道”给定的查询应该通过 TCP 运行,因此它首先不会理会 UDP
- 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。