为什么需要 DNS

计算机在网络上靠 IP 地址定位彼此,但人类记不住一串数字。DNS(域名系统)就是一张分布式的"域名 → IP"映射表。

一次完整的查询过程

当你访问一个域名时,大致会发生这些事:

第一步:查本地缓存。 浏览器缓存 → 操作系统缓存 → 本机 hosts 文件。任何一层命中就直接返回。

第二步:向递归解析器查询。 通常是你的运营商 DNS,或者你手动设置的公共 DNS。这个解析器承担了大部分工作。

第三步:递归解析器逐级查询(如果自己也没缓存):

  1. 询问根域名服务器:".com 的顶级域名服务器在哪?"
  2. 根服务器返回 .com 的 TLD 服务器地址;
  3. 询问 TLD 服务器:"example.com 的权威服务器在哪?"
  4. TLD 服务器返回该域名的权威域名服务器地址;
  5. 询问权威域名服务器:"www.example.com 的 IP 是多少?"
  6. 权威服务器返回 A 记录(IPv4 地址)或 AAAA 记录(IPv6 地址)。

第四步: 递归解析器把结果返回给你的设备,并按 TTL(生存时间)缓存一段时间。

关键设计:分层与缓存

全球根域名服务器只有 13 个逻辑集群(背后有大量镜像节点),之所以能支撑整个互联网,靠的就是分层授权 + 广泛缓存。

绝大多数查询在缓存层就被应答了,真正走到根服务器的请求比例很低。

常见记录类型

  • A:域名 → IPv4 地址;
  • AAAA:域名 → IPv6 地址;
  • CNAME:域名别名,指向另一个域名;
  • MX:邮件交换记录,指定接收该域名邮件的服务器;
  • NS:指定该域名的权威服务器;
  • TXT:任意文本,常用于域名所有权验证、SPF 反垃圾邮件配置等。

传统 DNS 的问题与改进

问题一:明文传输。 传统 DNS 查询是明文的,中间人可以窥探你访问了哪些域名,甚至篡改应答(DNS 劫持/污染)。

改进:DNS over HTTPS(DoH)把查询封装在 HTTPS 里;DNS over TLS(DoT)则用 TLS 加密 DNS 连接。

问题二:响应速度。 递归查询需要多次往返。改进办法是解析器端的积极缓存和预取。

一个实用场景

修改域名解析后,为什么有时要等很久才生效?答案是 TTL。各级缓存会按记录里声明的 TTL 保留旧结果,因此变更前的合理做法是先降低 TTL,改完再调回来。

说明:本文为 DNS 原理的公开知识整理。