为什么需要 DNS
计算机在网络上靠 IP 地址定位彼此,但人类记不住一串数字。DNS(域名系统)就是一张分布式的"域名 → IP"映射表。
一次完整的查询过程
当你访问一个域名时,大致会发生这些事:
第一步:查本地缓存。 浏览器缓存 → 操作系统缓存 → 本机 hosts 文件。任何一层命中就直接返回。
第二步:向递归解析器查询。 通常是你的运营商 DNS,或者你手动设置的公共 DNS。这个解析器承担了大部分工作。
第三步:递归解析器逐级查询(如果自己也没缓存):
- 询问根域名服务器:".com 的顶级域名服务器在哪?"
- 根服务器返回 .com 的 TLD 服务器地址;
- 询问 TLD 服务器:"example.com 的权威服务器在哪?"
- TLD 服务器返回该域名的权威域名服务器地址;
- 询问权威域名服务器:"www.example.com 的 IP 是多少?"
- 权威服务器返回 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 原理的公开知识整理。