在任何人问之前:我已经看到DNS查询何时使用TCP而不是UDP?它没有回答我的问题。
我所听到的只是“ 如果答案太长,DNS将使用TCP ”。但这并不能解释它是如何发生的。
因此,情况如下:DNS客户端要求使用UDP解析记录。记录对于UDP来说太长了:
- 服务器用特定的操作码回答,以使客户端切换到TCP
- 服务器根本不应答,并且客户端通过TCP重试
- 服务器打开到客户端的TCP连接(如果算上NAT,这很愚蠢,但是谁知道呢?)
- 客户端以某种方式(?)“知道”给定的查询应该在TCP上运行,因此它不会首先困扰UDP
- DNS小精灵在需要时将UDP神奇地转换为TCP
我一直在互联网上寻找答案,但是杂乱无章(请参见上文),而且我似乎无法为此编写正确的Google查询(就此而言,我也无法在RFC中找到信息) 。
1
我能在RFC5966中找到所有内容:“解析器应首先发送UDP查询,但如果有充分的理由期望响应是通过UDP发送的(无论是否带有EDNS0,则截断),则可以选择发送TCP查询。 )或出于其他操作原因,尤其是如果该服务器已经与服务器建立开放的TCP连接。”。解析器何时应“期望”响应将被截断?
—
StanTastic,2015年
一个明显的例子是,以前对同一记录的请求太长而无法容纳UDP数据报。
—
David Schwartz 2015年
所以有一个操作码说“被截断了”,对吗?然后切换-基本上是我的想法,这是最明显的解决方案。
—
StanTastic,2015年
如果查询包含多个“问题”(要解决的地址),则情况(d)可能是明智的选择。如果您需要解析100个地址,那么您将无法在单个UDP数据包中放入响应。
—
MSalters 2015年
1.
并且4.
两者都是大致正确的(两者取决于具体情况)。