2026-11-02·作者 Sijie Wang#fundamentals#networking#dns

how-dns-works

DNS 怎么工作:一本分布式的电话簿

DNS——Domain Name System,域名系统——把域名翻译成 IP 地址。动机有两层。表层:人记名字,机器认数字。深层:解耦。服务器可以换 IP、迁机房、挂 CDN,名字岿然不动,全世界什么都不用改。没有这层解耦,每一次迁移、每一个边缘节点,都得让所有访客跟着重新记账。

这本簿子不能存在一台机器上——流量扛不住、单点一挂全网眼瞎——所以它是一套分层的分布式数据库,每个域名的账本由域名主人自己保管。

一次解析的腿程。 先翻缓存,由近及远:浏览器缓存 → 操作系统的存根解析器缓存 → 递归解析器的缓存。层层未命中,才轮到跑腿:递归解析器(一般是运营商的,或 8.8.8.8 这类公共的)接过整个问题,自己跑完所有的腿。它先问根服务器,根不存具体名字、只指路:这是 .com 的名字,去问 TLD 服务器。顶级域服务器再指路:这个域归这几台权威服务器管。权威服务器是域名自己的账本,给出最终答案,外加一个 TTL——回程上每一层缓存可以把这个答案留多久。解析器把答案带回来并缓存,浏览器同样缓存一份。

两个词要分清:解析器对你的服务是递归的(问题整包甩给它);它对上游的问法是迭代的(一级一级指路)。两个角色本质不同:权威是账本本人,解析器只是跑腿的。

缓存是协议发的许可证、实现自己的选择。 每条记录自带 TTL,这个字段就是给缓存用的:答案可以被信任多久。哪一层都不被强制建缓存,浏览器完全可以不存自己的那一格;但不存毫无收益——下面还有操作系统和解析器的缓存,效果只是每次多一个往返。所以现代浏览器反其道而行,自带 DNS 客户端,有时连操作系统的存根解析器都绕开(比如走 DoH),图的是快和可控。

记录类型。 A / AAAA:名字 → IPv4 / IPv6 地址。CNAME:名字 → 另一个名字(别名)。NS:声明这个域归哪几台权威管,上面的指路链就是靠它搭的。TXT:钉在名字上的任意文本纸条;因为只有域名主人能发布,它同时兼任所有权证明(搜索引擎的站点验证就是这么做的)和邮件认证规则的发布渠道(SPF、DKIM)。

TTL 是取舍,不是设置。 长 TTL:查询少、权威省心,但改了记录要等全网旧缓存过期才生效。短 TTL:改动落地快,代价是不停地重问。选你更怕哪头。

坏在哪一层:路上的信任。 经典实现里,先到的像样答案先被采信,所以卡在路径上的攻击者可以抢答假答案——这就是 DNS 污染。两个标准补法补的是不同层:DNSSEC 给账本的答案签名,假答案验不过(治"答案是假的");DoH / DoT 加密你到递归解析器这一跳,路上的人既看不见你问了什么、也插不进嘴(治"路本身")。两者不能互相替代。

关于这一条

sijie 的一条 wiki 条目。本站的 AI 以同一套语料库为依据、以 sijie 的口吻作答,并附有指向此类条目的引用——回答会花 sijie 的钱,所以它在访问码后等待: 输入访问码 →