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


31

在任何人问之前:我已经看到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
我能在RFC5966中找到所有内容:“解析器应首先发送UDP查询,但如果有充分的理由期望响应是通过UDP发送的(无论是否带有EDNS0,则截断),则可以选择发送TCP查询。 )或出于其他操作原因,尤其是如果该服务器已经与服务器建立开放的TCP连接。”。解析器何时应“期望”响应将被截断?
StanTastic,2015年

6
一个明显的例子是,以前对同一记录的请求太长而无法容纳UDP数据报。
David Schwartz 2015年

1
所以有一个操作码说“被截断了”,对吗?然后切换-基本上是我的想法,这是最明显的解决方案。
StanTastic,2015年

1
如果查询包含多个“问题”(要解决的地址),则情况(d)可能是明智的选择。如果您需要解析100个地址,那么您将无法在单个UDP数据包中放入响应。
MSalters 2015年

1
1.并且4.两者都是大致正确的(两者取决于具体情况)。
kasperd

Answers:


45

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

另请参阅:https : //tools.ietf.org/html/rfc5966

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

并且:https : //www.ietf.org/rfc/rfc2181.txt

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


2
RFC 5966还指出,TCP 始终用于区域传输。
Matt Nordhoff 2015年

@MattNordhoff对,这是真的,值得一提。这更针对“从UDP到TCP的切换如何工作?”。角度。但我将其添加到答案中。
骗子2015年

但是,如果已经有TCP连接,它将仅使用TCP
Jim B

哦,那很有趣。那么什么时候回落到UDP?
StanTastic,2015年

@JimB您确定吗?我认为它不会保持持久的TCP连接打开。
Barmar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.