DNS 是把域名翻译成 IP 地址的应用层协议,本质是一个分层、分布式的数据库。理解它要抓住三件事:谁来回答(根、顶级域、权威、本地递归解析器)、怎么问(递归与迭代)、以及答案长什么样(各类资源记录)。

为什么不能只有一本集中的电话簿

早期互联网确实用一份集中维护的 hosts 文件做域名映射,但主机数量爆炸之后,集中式方案在更新分发、负载和一致性上全部失效。DNS 的解法是分层加委托:把名字空间按点号切成层级,每层只负责给出下一层的指路信息,具体记录分散在各级权威服务器上,任何单点都不必存全量数据,还能水平扩展。

真正发起 DNS 网络查询之前,其实还有几级本地缓存:浏览器缓存、操作系统缓存、hosts 文件。全部未命中,才轮到下面的解析链路。

域名层级与四类服务器角色

以 www.example.com. 为例(末尾的点代表根,书写时通常省略),从右往左依次是根、顶级域 com、二级域 example.com,对应四类角色:

  • 根服务器:只知道各顶级域服务器在哪里。逻辑上有 13 个命名标识(a 到 m),但每个标识通过任播(Anycast)在全球部署了大量物理实例,”全球只有 13 台根服务器”是流传已久的误解。
  • 顶级域服务器(TLD):管理 com、org、cn 这类后缀,返回目标域权威服务器的地址。
  • 权威服务器:真正持有某个域的记录,给出权威答案。
  • 本地递归解析器:一般由运营商或公共 DNS(如 223.5.5.5、8.8.8.8)提供,替客户端跑完整条查询链并缓存结果。它是查询侧角色,不在权威层级之内。

一次完整解析:递归与迭代

两种查询方式的区别在于”谁负责跑到底”:

  • 递归查询:客户端把问题丢给本地解析器,要求必须带回最终答案,解析器替你逐级问下去。
  • 迭代查询:被问的服务器不代劳,只回答”我不知道,但你可以去问谁谁谁”。

实际链路是两者组合:主机到本地解析器走递归,本地解析器到根、TLD、权威走迭代:

主机              本地解析器              根        TLD       权威
|-- 递归查询 ---> | | | |
| |-- 迭代: com 在哪? --> | | |
| |<-- 去问 TLD --------- | | |
| |-- 迭代: example.com 权威在哪? --> |
| |<-- 去问权威 ----------|---------| |
| |-- 迭代: www 的 A 记录? ------------------> |
| |<-- 返回 93.184.216.34 ------------------- |
|<-- 返回结果 ---- | (沿途各级缓存,TTL 内直接复用)

每一级答案都带 TTL,本地解析器与各级缓存在有效期内直接复用,所以真实世界里绝大多数查询根本到不了根。

常见记录类型

DNS 数据库的条目叫资源记录(RR),是 (Name, Type, Value, TTL) 四元组,常用类型:

  • A:域名到 IPv4 地址,最基础的映射。
  • AAAA:域名到 IPv6 地址。
  • CNAME:别名,指向另一个域名而非 IP;CDN 和多环境调度大量使用。
  • MX:邮件交换记录,指定接收该域邮件的服务器及优先级。
  • TXT:任意文本,常用于域名所有权验证和 SPF 反垃圾邮件策略。

注意 CNAME 总是指向域名:查询命中 CNAME 时,解析器会顺着规范名继续查 A 记录,最终仍返回 IP。

为什么用 UDP,何时切 TCP

DNS 查询是典型的一问一答:报文小、时延敏感,UDP 没有握手开销,天然合适,默认走 53 端口。但两种情况必须切 TCP:

  1. 响应超过 UDP 报文大小限制(传统 512 字节,EDNS0 可扩展):服务器置 TC 截断位,客户端改用 TCP 重查。
  2. 区域传送(Zone Transfer):主从权威服务器之间同步整个区域数据,数据量大且要求可靠,用 TCP。

DNS 劫持与污染

  • DNS 劫持:攻击者控制解析路径——篡改路由器或本机的 DNS 配置、搭建恶意解析器、运营商插广告——直接返回伪造 IP,把用户引到钓鱼站。
  • DNS 污染(缓存投毒):向递归解析器抢答注入伪造应答,让错误记录进入缓存,TTL 到期前所有使用该解析器的用户都被带偏。

防护思路:客户端用可信解析器并开启 DoH/DoT 加密查询通道;权威侧部署 DNSSEC 给记录签名;对关键域名监控解析结果是否异常。

实践要点

  • 排查用 dig 或 nslookup,dig +trace 能完整复现从根开始的迭代链路。
  • 区分权威答案与缓存答案:看应答 flags 里的权威标志位,缓存答案的 TTL 会随时间递减。
  • 域名变更前先把 TTL 调小,避免旧记录滞留缓存;变更完成后再调回较大值,降低解析延迟和权威压力。

小结

  • DNS 靠分层委托把映射数据分散到各级权威服务器,根和 TLD 只负责指路。
  • 主机到本地解析器递归、解析器向上迭代,缓存加 TTL 承担了绝大多数流量。
  • A/AAAA/CNAME/MX/TXT 覆盖最常见的映射需求;查询默认 UDP 53,截断或区域传送时切 TCP。
  • 劫持与污染的本质都是伪造应答,防护依赖可信解析器、加密通道与 DNSSEC。