为什么通过UDP的DNS限制为512字节?


14

我一直在寻找这个问题的答案(标题中的那个),而我发现的最好的事情是:

在DNS协议设计中,UDP传输块大小(有效负载大小)已限制为512字节,以优化性能,同时生成最少的网络流量。

我的问题是:这究竟如何提高性能?使用UDP时是否还有其他限制的原因?


5
这个问题实际上是基于一个错误的前提(至少是过时的前提)。512字节的有效负载限制不再存在,请参阅下面的答案。
哈坎·林奎斯特

Answers:


18

512字节有效负载保证DNS数据包在传输过程中发生碎片时可以重新组合。同样,一般而言,较小的数据包被随机丢弃的可能性较小。

IPv4的标准指定每个主机必须能够以576个字节以内重组的工作。如果使用IPv4标头(20字节,尽管可以带选项最高为60字节)和8字节UDP标头,则具有512字节有效负载的DNS数据包将小于576字节。

正如@RyanRies所说:DNS可以将TCP用于更大的有效负载以及区域传输和DNSSEC。TCP起作用时会有更多的延迟,这是因为与UDP不同,在任何数据开始流动之前,客户端和服务器之间都会进行握手。


7
一个相关的注释:之所以总是有13个根DNS解析器名称(a.root-servers.net到m.root-servers.net),是因为这是DNS响应查询的最大数目不超过512字节限制的根目录。因此,即使我们在根DNS基础结构中添加了更多物理服务器,从逻辑上讲,仍然将始终保留十三台根服务器。
phoebus 2014年

2
@RyanRies对于有效载荷较大的DNSSEC EDNS0,实际上是正常的操作模式,而不是TCP。
哈坎·林奎斯特

1
允许的最小MTU不是576字节,在IPv4中为68字节,在IPv6中为1280字节。
kasperd 2014年

1
@phoebus您能告诉我13台服务器如何不超过512字节而14台服务器如何吗?它背后的计算是什么?
蒂蒂·旺萨·本·丹莫尔

1
512 + 60 + 8 = 580字节,不是576字节,不是吗?
卡罗·伍德

12

现代DNS实际上不再将UDP的有效载荷限制为512字节。

使用EDNS0时,可以指定更大的有效负载大小,这对于支持DNSSEC的客户端通常也是这种情况。

通过UDP支持更大的有效负载是一把双刃剑,但这在一定程度上是使用名称服务器进行放大攻击的原因,因为如果攻击者使用能够获得较大响应的查询,则可以实现更好的放大。

有关EDNS0的详细信息,请参见rfc2671


2
的确如此,但是仍然有路由器和防火墙丢弃超过512个字节的UDP DNS数据包。
Ryan Ries 2014年

2
@RyanRies是的,尽管按照当今的标准,这当然是不正确的行为,但仍然偶尔会引起问题。(理论上,如果有人设置了这样的限制,则人们会知道配置相关软件,而不是宣传处理/不发送较大响应的能力。)
HåkanLindqvist 2014年

1

默认情况下,DNS操作(例如查询和区域维护操作)使用端口53。出于性能原因,查询使用UDP协议,且块大小限制为512字节。可以选择在逐个事务的基础上为查询操作协商TCP,但是由于TCP产生的性能开销,从本质上讲这是一种理论上的能力。从历史上看,通常不惜一切代价避免超过512字节的响应大小限制,实际上13个IPv4根服务器的限制是单个512字节UDP事务中可以返回的最大值。

罗恩·阿奇森(Ron Aitchison)-Pro DNS和BIND 10-2011


谢谢。我们能否知道报价的来源(注明出处)?
Pothi Kalimuthu

-2

这是一个QOS。

由于UDP是无状态的,因此无法对数据包进行错误处理。

因此,通过将数据包保持为最大大小,它们将到达目的地有更大的变化,从而减少了没有错误处理的影响。


较大的数据包并不意味着UDP故障转移到TCP。我是不是误会了你的意思?
mfinni 2014年

你也许是对的。我想我在某个地方的RFC建议中读到了它。
Garreth McDaid 2014年

UDP不会进行故障转移,但是对于DNS而言,特别是如果使用UDP时响应太大而无法容纳,这将导致响应被截断(实际响应不包含所有数据,并且设置了“截断”标志来表明这一点),然后,客户端可以改为使用TCP重试。
哈坎·林奎斯特
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.