EDNS 与缓冲协商
原始 DNS 规定 UDP 响应不超过 512 字节,超出就置 TC 标志让你改用 TCP。EDNS(0) 通过附加区里的 OPT 伪记录把上限拿出来协商,让大响应能直接走 UDP。问题是过大的 UDP 响应会被 IP 分片,而分片在中间设备上常被丢弃或拦截,于是业界形成共识:协商值 1232 字节(DNS Flag Day 2020),在减少 TCP 回退与避免分片之间取平衡。
基本信息
| 承载方式 | 附加区 OPT 伪记录 |
|---|---|
| 协商内容 | UDP 载荷上限、扩展标志、EDE 等选项 |
| 社区共识值 | 1232 字节 |
| 旧值 | 512 字节(无 EDNS 时的硬上限) |
| 超限后果 | 置 TC 标志,解析器改用 TCP |
验证协商结果
验证协商结果
dig +bufsize=1232 example.com +noall +comments # 观察 udp 行通告的上限
dig +bufsize=4096 example.com +noall +comments # 对比大缓冲的实际生效值
dig example.com +ignore # 忽略截断,看完整响应
dig +tcp example.com +noall +comments # 强制 TCP 对照常见缓冲值与含义
| 通告值 | 来源 | 含义 |
|---|---|---|
| 512 | 无 EDNS 或老设备 | 一旦超限就回 TC,强制走 TCP |
| 1232 | 现代解析器与服务端 | 避免分片,同时覆盖绝大多数响应 |
| 4096 / 65535 | 部分开放解析器 | 容易被分片拦截,反而更易失败 |
| 0 | 个别实现 | 表示不支持 EDNS 扩展 |
典型使用场景
- DNSSEC 环境:签名记录体积大,512 字节下几乎必然 TC 回退到 TCP
- 大 MX、TXT 与 CDN 多值解析:记录集天然超过经典上限
- 防火墙策略审查:确认是否误拦了必要的分片或 TCP 53
- 解析器调优:核对服务端实际生效的缓冲值与文档写在纸面的是否一致
- 排障对比:用固定 bufsize 复现问题,缩小变量范围
中间防火墙拦掉 IP 分片同时又禁掉 TCP 53,会让大响应域名的解析随机失败——这正是 1232 共识要解决的问题。若必须放宽 UDP 缓冲,请先确认链路上没有丢分片的策略。
OPT 记录还承载扩展错误码(EDE)等选项:服务端可以带上具体原因,如签名过期、网络不可达、被策略拦截,比只回一个 SERVFAIL 有用得多。抓包时若在附加区完全看不到 OPT 记录,说明对端根本不支持 EDNS,行为会回退到 512 字节的经典限制。