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

之前有人问:我见过什么时候DNS查询使用TCP而不是UDP? 它不回答我的问题。

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

所以情况如下:DNS客户端要求使用UDPparsinglogging。 UDP的logging太长了:

  1. 服务器回答特定的操作码,让客户端切换到TCP
  2. 服务器根本不应答,而客户端则重新尝试TCP
  3. 服务器打开TCP连接到客户端(愚蠢的,如果你数NAT,但谁知道?)
  4. 客户端以某种方式(?)'知道'给定的查询应该通过TCP运行,所以它不会首先与UDP打扰
  5. 在需要的时候,DNS小魔术神奇地将UDP转换为TCP

我一直在寻找所有的互联网上的答案,但有很多噪音(见上文),我似乎无法编写适当的谷歌查询(也不能在RFC中find的信息) 。

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

另见: https : //tools.ietf.org/html/rfc5966

如果缺lessEDNS0(DNS 0的扩展机制)(请参见下文),则任何需要发送超过512字节限制的UDP响应的DNS服务器的正常行为都是为了使服务器截断响应,使其适合于在该限制内,然后在响应头中设置TC标志。 当客户端收到这样的响应时,它将TC标志作为它应该重试TCP的指示。

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

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