关于 DNS 的 512 字节

date
Jun 20, 2023
updateDate
slug
dns-512-bytes
status
Published
tags
DNS
Network
summary
翻阅 DNS 的 RFC1035 的时候注意到一句话,通过 UDP 传输的消息被限制在 512 字节以内 Messages carried by UDP are restricted to 512 bytes (not counting the IP or UDP headers). Longer messages are truncated and the TC bit is set in the header.
type
Post
翻阅 早期 DNS 的 RFC1035 的时候注意到一句话
💡
Messages carried by UDP are restricted to 512 bytes (not counting the IP or UDP headers). Longer messages are truncated and the TC bit is set in the header. 通过 UDP 传输的消息被限制在 512 字节以内(不包括 IP 或 UDP 头部)。超过长度的消息将被截断,并在头部设置 TC 位。

为什么要这样

我们知道 DNS 使用 UDP 协议,但是 UDP 协议不处理 MTU 这些东西。
UDP 是一种无连接的协议,没有建立连接的过程,因此如果 DNS 返回的数据大小响应的长度超过了 MTU(Maximum Transmission Unit),那么就需要进行在 IP 层进行分片重组,这个是一个及其消耗资源的行为,网络上传输尽可能的避免分片(例如 TCP 依靠 握手阶段协商 MSS 避免 IP 分片)。 限制 512 bytes,能保证数据可靠和稳定。
 
💡
为什么是 512 bytes 看到一个说法是 IP协议(IPv4),对数据包的大小也有限制。例如,IPv4规定,无论数据包的实际大小如何,所有主机都必须能够处理长度至少为 576 字节的数据包。 - IP header:20 bytes - IP Option:0-40 bytes - UDP header:8 bytes 所以留给 DNS 大小 512 bytes 是一个比较合理的值,绝大多数情况下都能正常到达。

超过后会发生什么

超过后按照协议,会在头部设置 TC 位,DNS 协议转为 TCP (DNS Over TCP),发起 DNS Query。
dig +bufsize=512 1024.size.dns.netmeister.org @1.1.1.1 # 下面抓包结果。dns response 请求设置了 Truncated flag。之后的转为 TCP 请求。
notion image
notion image
 

扩展

512 字节在现在的网络环境下,当前是肯定不够用的,大部分的网络的设备 MTU 在 1500左右,所以后来引入了 EDNS(Extension Mechanisms for DNS)扩展机制。
可以给 DNS query 设置多个 flag,来达到定制的目的。
可能注意到 上面示意 dig 命令的 +bufsize 参数,设置 payload size。比如设置 1024,上述 DNS 不会再发生 Truncate
notion image
 

© Zzde 2020 - 2024