DNS 的工作原理
域名系统(DNS)把 www.example.com 这样的名称转换为计算机用来连接的 IP 地址。由递归解析器替你完成这项工作:它先询问根服务器,再询问顶级域服务器,然后询问该域名的权威服务器,并把结果缓存起来以备后用。整个过程通常只需几毫秒。
解析路径
当你打开 www.example.com 时,如果没有任何缓存,会依次发生以下步骤:
- 存根解析器。你的操作系统内置了一个小型客户端。它先检查自己的缓存和 hosts 文件,然后把问题发送给配置好的递归解析器(通常来自你的路由器、运营商,或某个公共解析器)。
- 递归解析器。它先检查缓存。如果没有答案,就从顶层开始逐级询问,直到找到最终答案。
- 根服务器。解析器向根服务器询问
www.example.com。根服务器不知道地址,但会回复负责.com的服务器。 - 顶级域(TLD)服务器。
.com服务器同样不知道地址,但会回复example.com的名称服务器(NS 记录)。 - 权威服务器。该域名的名称服务器保存着真实的记录,并返回
www.example.com的 A 或 AAAA 记录。 - 解析器把答案返回给存根解析器并存入缓存,然后浏览器发起连接。
你可以用我们的 DNS 查询工具跟踪任何域名的这条链路。
缓存与 TTL
每条 DNS 记录都有一个 TTL(生存时间),以秒为单位,告诉解析器可以把答案保留多久。TTL 为 3600 表示一小时。缓存让 DNS 更快,并减轻权威服务器的负载,但也意味着修改不会在所有地方同时生效。缓存存在于多个位置:浏览器、操作系统、路由器和递归解析器。
解析器还会缓存否定应答,例如「该名称不存在」(NXDOMAIN),缓存时间由 SOA 记录指定。
常见记录类型
| 类型 | 用途 | 示例值 |
|---|---|---|
| A | 将名称映射到 IPv4 地址 | 192.0.2.10 |
| AAAA | 将名称映射到 IPv6 地址 | 2001:db8::10 |
| CNAME | 从一个名称到另一个名称的别名。它不能与其他记录一起存在于区域顶点。 | www.example.com → example.com |
| MX | 域名的邮件服务器,带优先级(数字越小越先尝试) | 10 mail.example.com |
| NS | 区域的权威名称服务器 | ns1.example.com |
| TXT | 自由文本;用于 SPF、DKIM、DMARC 和域名验证 | "v=spf1 mx -all" |
| SOA | 起始授权:主服务器、管理员联系方式、序列号和计时器 | ns1.example.com hostmaster.example.com 2026110401 ... |
| CAA | 哪些证书颁发机构可以为该域名签发证书 | 0 issue "ca.example.net" |
| SRV | 特定服务的主机和端口 | 10 5 5060 sip.example.com |
| PTR | 反向查询:将 IP 地址映射回名称 | 10.2.0.192.in-addr.arpa → host.example.com |
正确的 MX、SPF 和 DKIM 记录对邮件投递很重要。请使用我们的邮件与黑名单工具检查邮件服务器,并查看其 IP 地址是否被列入垃圾邮件黑名单。
DNS 生效究竟是什么
「DNS 生效」(DNS propagation)是人们对这段时间的通俗说法:直到全球所有缓存都丢弃旧答案并获取新答案。并没有什么东西在互联网上被「推送」。权威服务器立即拥有新数据;解析器只是在 TTL 到期之前继续保留旧数据。因此,记录变更的最长延迟大约等于旧的 TTL,而不是新的 TTL。
在注册商处更改名称服务器会更慢,因为 TLD 区域中的 NS 记录 TTL 通常为一到两天。在此期间,有些用户访问的是旧服务器,有些则是新服务器。你可以用 WHOIS 查询检查域名的委派情况,用 DNS 查询工具检查记录本身。
如何让修改快速生效
- 在变更之前,至少提前一个旧 TTL 的时间(例如 TTL 为 86400 时提前 24 小时),把该记录的 TTL 调低到较小的值,比如 300 秒。
- 等待旧 TTL 过去,让所有缓存都持有这个短 TTL 的版本。
- 进行变更。此后解析器大约会在 5 分钟内重新查询。
- 使用 DNS 检测工具从多个地点检查结果。
- 一切正常后,再把 TTL 调高,以降低查询负载。
SOA 序列号与从服务器
大多数域名至少使用两台权威服务器。一台是主服务器,其他是通过区域传送(AXFR 或 IXFR)从主服务器复制区域数据的从服务器。这由 SOA 记录控制:
- 序列号(Serial):版本号。当主服务器上的序列号比自己的高时,从服务器就会传送区域数据。常见格式是日期加计数器,例如
2026110401。如果你修改了区域却忘记增大序列号,从服务器会继续提供旧数据。 - 刷新(Refresh):从服务器多久检查一次序列号。
- 重试(Retry):检查失败后,从服务器等待多久再重试。
- 过期(Expire):超过这段时间仍未联系上,从服务器就停止应答。
- 最小值(Minimum,否定缓存 TTL):解析器缓存「不存在」应答的时长。
如果一个域名从不同的名称服务器返回不同的结果,很可能是某台从服务器数据已过期。请比较所有 NS 服务器的序列号。
Anycast 解析器
大型服务商运营的公共解析器使用 anycast:同一个 IP 地址从许多数据中心同时发布,网络会把每个查询路由到最近的一个。这样延迟低且具备韧性。每个地点都有自己的缓存,因此使用同一个解析器地址的两个人在变更后可能短暂看到不同的结果。根服务器和许多权威 DNS 服务也使用同样的技术。