🕸️ 第三章 为Web提供支持的技术
📄 一句话概括

名字是给人记的,地址是给机器认的;DNS 就是那张把两者对上的表,而它靠一层层的缓存,把耗时压到几乎感觉不到。

📝 本节和前面几节的关系

3-3 讲了地址是什么,3-4 讲了地址怎么发到设备手上。这一节解决的是另一个问题:为什么我们输的是名字,而网络实际用的是地址,以及这两者是怎么被对上的。

一、为什么需要 DNS

域名对人友好,地址对机器友好。让人去记 142.250.190.78 是不可能的,让机器去理解【谷歌】这种名字,它也做不到。

DNS 做的就是翻译。它是一个分布在全世界的巨大对照表,而不是某一台服务器上的一个文件——这点很重要,因为这意味着它天生要面对【怎么保证一致、怎么扛住查询量】这两个问题。

还有一个常被忽略的性质:DNS 默认不加密。谁在路上看得见你查了什么,谁就知道你接下来要访问哪里。

二、解析的四个层次

查一个域名,不是每次都跑到最顶层去问。它先在近处找,找不到再往外问。

顺序大致是:浏览器自己的缓存 → 操作系统缓存 → 本机 hosts 文件 → 本地 DNS 服务器 → 根服务器 / 顶级域服务器 / 权威服务器。

越靠前的越快。命中浏览器缓存几乎零耗时,一路问到底可能要上百毫秒。这就是为什么【同一个页面刷第二遍会明显更快】。

三、动手 Demo:缓存的账与记录的账

TTL 这个参数决定了一条记录能被记多久,它是 DNS 性能与准确性的调节钮。

ttl = 300
per_day = 86400 // ttl
print("TTL", ttl, "秒 → 一天真正去问的次数顶多", per_day)
print("100 万次访问里,其余", format(1000000 - per_day, ","), "次都在缓存里答完")
print("命中率 %.3f%%" % ((1000000 - per_day) * 100.0 / 1000000))

实跑输出:

--------------------------------------------------------------------
D5  DNS:把域名翻成地址,靠的是一层层的缓存
--------------------------------------------------------------------

  计算机不认名字,只认数字。DNS 就是那张【数字与名字的对照表】。
  这张表不是一本,而是分散在好几层缓存里,越近的越快。

  去哪里找                      命中大概要多久        说明
  --------------------------------------------------------------------------------------------
  浏览器自己的缓存              0 ms                  最快,同一台电脑上就解决了
  操作系统缓存                  0.1 ms                浏览器没记住,系统记住了
  hosts 文件                    0.1 ms                本机手工写的对照表
  本地 DNS 服务器               1 ~ 5 ms              运营商或 8.8.8.8 这种公共 DNS
  根 → 顶级域 → 权威            20 ~ 120 ms           层层问下来,一次问不到就问下一级

  表里常见的几种记录,各管一摊:

  类型          它把什么对到什么                  什么时候用
  ----------------------------------------------------------------------------------------
  A             域名 → IPv4 地址                  最常用的那条记录
  AAAA          域名 → IPv6 地址                  四倍的 A,装的是 128 位地址
  CNAME         域名 → 另一个域名                 别名,最后还是要落到 A 上
  MX            域名 → 邮件服务器                 收发邮件时用
  TXT           域名 → 一段文本                   域名验证、防冒收发信常用
  NS            域名 → 管这台域名的服务器         告诉全网【这事该问谁】
  PTR           IP 地址 → 域名                    反向查询,主要用于排查
  SOA           域名的权威信息                    主从服务器、序列号、各类默认值

  TTL 是【这条记录能被记住多久】。假设 TTL 是 300 秒:

    · 一天 86,400 秒,真正跑去问的顶多 288 次
    · 100 万次访问里,其余 999,712 次全在缓存里答完了

  2026 年关于 DNS 的三件事:
    · 10 月 11 日 ICANN 启用新的根区密钥 KSK-2024,旧的 2027 年 1 月退役
    · 域名解析服务也在集中:Cloudflare 17.7%、GoDaddy 9.9%
    · 加密 DNS(DoH / DoT)的查询占比,预计今年超过 85%

先看缓存链那张表:从 0 毫秒到 120 毫秒,跨了三个数量级。而现实中绝大多数查询都发生在最前面几层——这就是 DNS 能撑起整个互联网查询量的原因。

再看记录类型那张表。最常用的是 A 与 AAAA(域名对到 IPv4 与 IPv6 地址);CNAME 是别名,MX 管收邮件,TXT 常用来做域名归属验证。记住这几条,看域名解析结果时就不会一头雾水。

最后那笔账最能说明问题:TTL 设成 300 秒,一天 86,400 秒里,真正跑去问的顶多 288 次——其余几十万次访问全在缓存里答完了。

四、2026 年的三件事

第一件是今天:10 月 11 日,ICANN 正式启用新的根区密钥 KSK-2024,旧的密钥将在 2027 年 1 月退役。这是整个 DNS 信任体系最顶层的一次换锁,普通用户没有感觉,但跑着 DNSSEC 校验的解析器必须换上新的信任锚。

第二件是集中度:域名解析也在往少数几家集中,Cloudflare 一家占了 17.7% 的网站,GoDaddy 9.9%。方便的另一面是——这几家出问题,影响面就是全网级别。

第三件是加密:DoH 与 DoT 把域名查询裹进加密通道,预计 2026 年加密 DNS 的查询占比会超过 85%。也就是说,【谁都能看见你查了什么】这件事正在成为过去。

30 秒实验

  1. 在命令行运行 nslookup www.baidu.com,记下返回的 IP 地址;再运行一次,看两次结果是否一致(很多站点有多个地址)。
  2. 运行 nslookup -type=MX qq.com,看看它的邮件服务器是哪几台——这就是 MX 记录的实际样子。
  3. 在浏览器地址栏直接输入一个 IP 地址(不要输域名),看能不能打开——这能帮你体会【域名只是给人用的门牌号】。

常见误区

  1. 错误:DNS 就是一台存着所有域名的大服务器。——纠正:它是分布式的。根、顶级域、权威三级分工,再配合缓存,才有了今天的规模。把它想成【一棵倒过来的树 + 一堆就近的复印件】才准确。
  2. 错误:改了域名解析,马上全世界都能看到。——纠正:要等 TTL 过完。原来的记录还被各地缓存记着,TTL 没到期就不会去问新的。所以切流量前要把 TTL 调小,让全世界尽快换到新地址。
  3. 错误:TTL 越短越好,这样改起来快。——纠正:TTL 短意味着查询更频繁。每次都跑到权威服务器去问,既慢又给上游添压力。TTL 是【灵活性】与【开销】之间的取舍,稳定期调大、要变更前调小。
  4. 错误:域名解析是明文,也没什么大不了。——纠正:这恰恰是隐私与安全的关键一环。看得见你查什么,就看得见你要去哪——可以投毒、可以劫持、可以画像。加密 DNS 占比超过 85%,正说明大家已经把它当成必须解决的问题。
自测三问(点开对答案) 1. 查一个域名时,最先被找的是哪里? —— **浏览器自己的缓存**,然后是操作系统缓存、hosts 文件,再到本地 DNS 服务器,最后才一路问到根、顶级域、权威服务器。**绝大多数查询在头两层就结束了**,所以页面第二次打开通常更快。 2. TTL 设成 300 秒,一天最多需要真正解析几次? —— **288 次**(86,400 ÷ 300)。其余时间所有访问都命中缓存。**这就是为什么【100 万次访问】并不等于【100 万次查询】。** 3. 要更换服务器地址,为什么要提前把 TTL 调小? —— 因为**已经发出去的解析结果还在各地被缓存着**,TTL 没到期就不会更新。**提前把 TTL 调小,相当于让全世界的缓存尽快过期**,这样切换那一刻,用户才能马上访问到新地址。

相关笔记