Domain IP Lookup

“传播”其实只是缓存过期

0 分钟

您保存了更改

0-5 分钟

您的 DNS 托管商完成更新

最长到 TTL

旧答案仍在缓存中

TTL 之后

所有人都看到新答案

没有任何内容被推送出去,只是各个缓存不再复用自己的副本

DNS 基础

DNS 传播:为何变更要等这么久,实际发生了什么

3 分钟阅读

您更新了一条 A 记录。新网站在手机上能打开,在笔记本电脑上却不行。外地的同事看到的仍是旧站点。有人告诉您要“等待传播完成”。

这个说法极具误导性,信以为真只会让问题更难理清。没有任何东西在传播。没有任何数据被分发到任何地方。

核心要点

您的 DNS 变更在保存的那一刻就已经生效了。您等待的,是成千上万个相互独立的缓存,各自持有一份旧副本,并各自走到被设定的过期时间。这里没有推送、没有同步,也没有队列。

实际发生了什么

解析器查询您的域名时,会把应答连同 TTL 一起保存,TTL 是一个以秒为单位的倒计时。在倒计时归零之前,解析器一直从内存中作答,不会再联系您的域名服务器。

“传播”其实只是缓存过期

0 分钟

您保存了更改

0-5 分钟

您的 DNS 托管商完成更新

最长到 TTL

旧答案仍在缓存中

TTL 之后

所有人都看到新答案

没有任何内容被推送出去,只是各个缓存不再复用自己的副本

每个缓存都独立过期,各按自己的时间表,起点是它碰巧取得该记录的那一刻。

因此,当您修改一条记录时:

  1. 您的权威域名服务器会立即更新,之后任何人来查询,得到的都是新值。
  2. 每个缓存了旧值的解析器,都会继续返回旧值,直到自己的倒计时结束。
  3. 这些倒计时的起点各不相同,即各个解析器首次获取该记录的时刻,所以过期时间也各不相同。
  4. 每个解析器在过期时去获取新值,它的用户就在那一刻切换过去。

这种参差不齐的结果,看起来就像变更在“扩散”,其实只是许多相互独立的计时器陆续走完而已。

实际要等多久

最长等待时间,就是您修改之前这条记录上设置的 TTL。正是这个细节,让传播时间变得可以预测。

旧 TTL最长等待时间典型用途
300(5 分钟)5 分钟正在进行迁移期间
3600(1 小时)1 小时合理的默认值
86400(24 小时)24 小时很少变更的稳定记录
172800(48 小时)48 小时TLD 层级的 NS 委派

规划 DNS 变更的正确方式

  1. 提前一天:调低 TTL

    把 TTL 改为 300 秒,其他一律不动。至少等待与旧 TTL 相同的时间,让每个缓存都获取到较短的值。

  2. 确认低 TTL 已经生效

    运行 dig example.com,查看应答部分中的 TTL。一旦它从 300 而不是 3600 开始倒计时,说明所有解析器都已改用较短的计时。

  3. 进行实际变更

    更新记录。现在任何人最长只需等待五分钟,而不是一小时。

  4. 从多个观测点验证

    直接查询几个公共解析器。它们是相互独立的缓存,能为您提供不同用户实际看到的内容的真实样本。

  5. 再次调高 TTL

    流量稳定到新值之后,把 TTL 调回 3600 或更高。TTL 过低意味着更多的查询,也会让所有人的查询略微变慢。

查看不同解析器看到的内容

询问多个相互独立的解析器
dig +short example.com @1.1.1.1
dig +short example.com @8.8.8.8
dig +short example.com @9.9.9.9
询问权威来源,绕过所有缓存
dig +short example.com @ns1.example.com

最后这条命令最重要。如果权威服务器返回了新值,说明您的变更正确且已完成。其余的一切都只是等待,而不是修复。如果它返回的仍是旧值,说明变更没有保存,或者您是在一个您的域名并未委派给的服务商那里修改的。

为什么在不同设备上看到的结果不同

在您和应答之间,缓存不止一层,而是好几层,每层都有自己的计时器:

  • 您的浏览器会保留一个短期的内部 DNS 缓存。
  • 您的操作系统独立保留自己的缓存。
  • 您的路由器通常会为整个家庭缓存。
  • 您的 ISP 的解析器可能要为数百万用户缓存。
  • 企业或 VPN 解析器会在受管网络上再增加一层。

手机使用移动数据时走的解析器链路,与笔记本电脑使用家庭 Wi-Fi 时完全不同,这正是为什么一个设备显示新站点而另一个不显示。您可以清除自己能控制的那几层,请参阅如何刷新 DNS 缓存。

需要查看某个域名的公网 DNS 地址?使用 Domain IP Lookup 工具。

本主题的免费工具

常见问题