2026-11-02·by 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 加密你到递归解析器这一跳,路上的人既看不见你问了什么、也插不进嘴(治"路本身")。两者不能互相替代。

about this entry

One of sijie's wiki entries. The AI on this site is grounded in the same corpus and answers in sijie's voice, with citations back to entries like this one — answering costs sijie money, so it waits behind a code: enter an access code →