域名系统,从报文到加密传输
这里整理的是 DNS 的工作方式和日常会碰到的细节:一条查询怎样走完全程,报文里每个字段是什么意思,DoT、DoH、DoQ 各自解决了什么、又留下了什么,DNSSEC 的信任链怎样建立,出问题时先看哪里。每一节都写明依据的 RFC 编号,方便回到原文核对。
从哪里读起#
各页可以单独看,但有些概念会反复出现。按你手头的问题选一条路线:
- 第一次系统了解 DNS工作原理 → 资源记录 → 报文格式 → 根区与根服务器
- 想知道加密 DNS 值不值得开总览与对比 → DoH / DoT / DoQ → 隐私
- 在管自己的域名区运维 → DNSSEC → 排错与命令
- 在设备或浏览器上配置解析器系统与浏览器配置 → 清理缓存
- 只想查一个缩写或 RFC术语表 · RFC 索引,或按 / 直接搜索
速查:传输方式与端口#
| 方式 | 传输层 | 默认端口 | 规范 |
|---|---|---|---|
| 传统 DNS | UDP,必要时 TCP | 53 | RFC 1035,RFC 7766(TCP 要求) |
| DNS over TLS(DoT) | TLS over TCP | 853 | RFC 7858,RFC 8310 |
| DNS over HTTPS(DoH) | HTTP/2 或 HTTP/3 | 443 | RFC 8484 |
| DNS over QUIC(DoQ) | QUIC | 853/UDP | RFC 9250 |
| DNS over DTLS | DTLS over UDP | 853/UDP | RFC 8094(实验性,几乎没有部署) |
| 多播 DNS(mDNS) | UDP 多播 | 5353 | RFC 6762 |
速查:常被问到的几个数字#
| 项目 | 数值 | 出处与说明 |
|---|---|---|
| 单个标签长度 | ≤ 63 个八位组 | RFC 1035 §2.3.4。长度字段的高两位另作他用,所以最多 63。 |
| 完整名字长度 | ≤ 255 个八位组 | 按线上编码计算,含每个标签的长度字节和末尾的根标签。 |
| 不带 EDNS 的 UDP 报文 | ≤ 512 字节 | RFC 1035。超出时置 TC 位,客户端改用 TCP。 |
| 推荐的 EDNS 缓冲区 | 1232 字节 | 2020 年 DNS Flag Day 的建议:IPv6 最小 MTU 1280 减去 IPv6 与 UDP 头部 48 字节,尽量避免分片。 |
| TTL 的取值 | 0 – 2³¹−1 秒 | 字段是 32 位,但 RFC 2181 §8 规定最高位置位的值按 0 处理。 |
| 根服务器 | 13 个名字,12 家运营方 | a 到 m.root-servers.net,Verisign 运营其中两个;每个名字背后是大量任播实例,见根区页。 |
本站的写法约定#
- 示例域名使用
example.com、example.net一类保留名称(RFC 2606、RFC 6761),示例地址使用文档专用段192.0.2.0/24、198.51.100.0/24、203.0.113.0/24(RFC 5737)与2001:db8::/32(RFC 3849)。需要演示真实网络行为时,才会用到公共解析器的真实地址。 - 命令按 BIND 9.18 之后的
dig和 Knot DNS 的kdig语法书写,旧版本可能缺少+tls、+https等选项。 - “必须”“应当”这类词照搬 RFC 的 MUST、SHOULD 时,会在旁边注明;其余地方是普通的中文叙述。
- 各页顶部有最后修订日期。协议还在演进,凡是写着“目前”的地方,都请以原文和运营方的最新公告为准。
最近修订#
- 根区页更新根区 KSK 轮换的时间安排,并补上根服务器实例的最新数量。
- DoQ 页补充错误码与 0-RTT 的限制;加密总览加入 ECH(RFC 9849)。
- 排错页加入扩展错误码(EDE)对照表和 TTL 换算工具。
- 新增“系统与浏览器配置”一页,整理 Windows、Android、Apple 平台与 Linux 的设置位置。
- 报文格式页加入可以直接粘贴报文的解析工具。