在有人问之前:我已经看到DNS 查询何时使用 TCP 而不是 UDP?它没有回答我的问题。
我一直听到的是“如果答案太长,DNS 将使用 TCP ”。这并不能解释它是如何发生的。
所以情况如下:DNS 客户端请求使用 UDP 解析记录。UDP 的记录太长:
- 服务器用特定的操作码回答,让客户端切换到 TCP
- 服务器根本不响应,客户端通过 TCP 重试
- 服务器打开到客户端的 TCP 连接(愚蠢,如果你算上 NAT,但谁知道呢?)
- 客户端以某种方式(?)“知道”给定的查询应该通过 TCP 运行,因此它首先不会打扰 UDP
- DNS pixies 在需要时神奇地将 UDP 转换为 TCP
我一直在互联网上寻找答案,但有很多噪音(见上文),我似乎无法为此编写正确的 Google 查询(就此而言,我也无法在 RFC 中找到信息) .
客户端事先并不知道响应会太大,所以会通过UDP向服务端查询。
服务器将通过 UDP 响应,并将尽可能多地包含并设置截断的标头位(“TC” http://www.networksorcery.com/enp/protocol/dns.htm)。
然后客户端可以通过 TCP 重新发送请求并获得完整的响应。
另见:https ://www.rfc-editor.org/rfc/rfc5966
并且:https ://www.ietf.org/rfc/rfc2181.txt
正如评论中提到的,当然 DNS 区域传输总是使用 TCP。