DNS 基础 · RFC 1034 / RFC 1035

DNS 是什么?
从域名到 IP 的完整解析过程

互联网的"电话簿":把 www.example.com 翻译成机器之间真正用来通信的 IP 地址。一次点击背后,是一次跨越多级服务器的分布式查询。

RFC 10341987 年 · 概念与设施
RFC 1035报文格式与实现规范
UDP 53传统默认查询端口
分布式全球层级化命名系统
TL;DR · 核心结论

DNS(Domain Name System,域名系统)是 RFC 1034/RFC 1035 定义的分布式命名系统:它把人类可读的域名(如 www.example.com)映射为机器可路由的 IP 地址(IPv4/IPv6),并承载邮件路由等记录。解析时,本机向递归解析器发起递归查询,递归解析器再向根、顶级域(TLD)、权威服务器逐级迭代查询,最终拿到 A/AAAA 记录并缓存返回。整个过程通常只需几十毫秒,但任何一环出问题都会表现为"网站打不开"。

Hierarchy

域名是一棵倒立的树:根、TLD、权威服务器

DNS 命名空间按层级拆分管理,没有任何一台服务器"知道全世界所有域名"

域名从右往左读,每一段对应一层授权。以 www.example.com. 为例(注意末尾还有一个不显示的"根"点):最右端的根(Root)是整棵树的顶点,全球共有 13 组逻辑根服务器(A–M);往左一级是顶级域(TLD),如 .com、.cn、.org,由 ICANN 授权的注册局运营;再往左是二级域 example,也就是域名持有者在注册局注册的名字;最左端的 www 则是该域内的主机记录。

每一层都有自己的域名服务器:根服务器不直接回答具体域名,但知道"想查 .com 就去找 .com 的 TLD 服务器";TLD 服务器知道"example.com 这个域由谁的权威服务器负责";权威域名服务器(Authoritative DNS)才是某一个域最终记录(IP、MX、TXT 等)的存放者。网站管理员通过域名注册商修改权威 DNS 上的记录,全球解析器则按 TTL 逐步同步这些变更。

为什么用分布式而不是一台中央服务器?

因为互联网上的域名数以亿计、每秒查询量以万亿计,任何单点都扛不住。分层授权让每一层只管自己那一段:注册局只管 TLD,企业只管自己的域,根只管 TLD 的清单。新增一个域名不需要通知全世界,只要在对应的权威服务器上添加记录即可——这正是 DNS 能随互联网规模线性扩展的关键设计。

Query Types

递归查询 vs 迭代查询

很多人混淆这两者——它们发生在解析链路的不同位置

递归查询(Recursive Query):本机浏览器/操作系统只问一次——"告诉我 www.example.com 的 IP",对方必须一管到底,要么给最终答案,要么给错误(不存在/超时)。承担这个角色的是递归解析器(Recursive Resolver),通常是运营商 DNS、公共 DNS(如 8.8.8.8、1.1.1.1)或你自建的本地缓存(如 systemd-resolved、AdGuard Home)。

迭代查询(Iterative Query):递归解析器向根、TLD、权威服务器追问时使用。被问的服务器不帮你继续查,只返回"下一步建议问谁"( referral):根服务器说"我不知道 example.com,但 .com 的服务器在这";TLD 服务器说"example.com 的权威服务器在这"。解析器拿着这份指引自己往下走,直到权威服务器给出最终记录。

简单记忆:客户端 → 递归解析器之间是递归;递归解析器 → 根/TLD/权威之间是迭代。递归解析器会把最终结果按记录的 TTL 缓存在本地,下次同一查询直接命中缓存,省去整段链路。

Record Types

常见 DNS 记录类型一览

解析器不只查 IP,DNS 里还存着邮件路由、别名等各种记录

记录类型作用示例值规范来源
A域名 → IPv4 地址,最基础的地址记录93.184.216.34RFC 1035
AAAA域名 → IPv6 地址(128 位)2606:2800:220:1::33RFC 3596
CNAME别名:把一个域名指向另一个域名www.example.com → example.cdn.netRFC 1035
MX邮件交换:指定该域的收信服务器及优先级10 mail.example.comRFC 1035
NS名称服务器:声明该域由哪台权威 DNS 负责ns1.example.comRFC 1035
TXT任意文本记录,常用于 SPF、DKIM、域名所有权验证v=spf1 include:_spf.example.com ~allRFC 1035

实际排查时最常用的是 A / AAAA(网站打不开先查它)、CNAME(排查 CDN 回源链)和 MX(排查收不到邮件)。用 dig example.com A、dig example.com AAAA 即可逐类型查询。

Resolution Path

一次完整解析的链路步骤

假设递归解析器缓存已失效,需要从根开始逐级追问

步骤谁 → 谁动作
1浏览器 → 本地存根浏览器要访问 www.example.com,先查本机 hosts 与操作系统缓存
2存根 → 递归解析器缓存未命中,向配置好的递归解析器(运营商/公共/自建)发起递归查询
3解析器 → 根服务器缓存未命中,向根服务器问 www.example.com,根返回 .com TLD 地址(迭代)
4解析器 → .com TLDTLD 返回 example.com 的权威服务器地址(迭代)
5解析器 → 权威服务器权威服务器返回 www.example.com 的 A 记录(93.184.216.34)
6解析器 → 浏览器解析器按 TTL 缓存结果,并把最终 IP 返回给浏览器
7浏览器 → 目标 IP浏览器用这个 IP 建立 TCP/TLS 连接,加载网页
① 本机浏览器 要访问 www.example.com,先查系统缓存
↓ 递归查询
② 递归解析器 运营商 / 公共 DNS / 自建缓存,先查本地缓存
↓ 缓存未命中,开始逐级迭代
③ 根域名服务器(Root) 不知道答案,指引去问 .com TLD
↓
④ 顶级域服务器(.com) 指引去问 example.com 的权威服务器
↓
⑤ 权威域名服务器 返回 www.example.com 的 A / AAAA 记录
↑ 结果原路返回并按 TTL 缓存
⑥ 浏览器拿到 IP,建立 HTTPS 连接 解析完成,开始加载网页
FAQ

常见问题

DNS 的主要作用是什么?+
DNS 是互联网的分布式命名系统:把人类容易记住的域名(如 www.example.com)翻译成机器之间用来路由报文的 IP 地址(IPv4 或 IPv6),同时承载邮件路由(MX)、别名(CNAME)等记录。没有它,我们只能靠背一串数字上网。
递归查询和迭代查询有什么区别?+
递归查询要求被询问的服务器“一管到底”,直接给出最终答案(通常由本机向递归解析器发起);迭代查询则由被问服务器返回“下一步该问谁”的指引(如根服务器指引去问 .com 顶级域服务器),由查询方继续追问。客户端到递归解析器是递归,解析器到根/TLD/权威是迭代。
一次完整的 DNS 解析要经过哪些服务器?+
依次为:本地递归解析器(先查缓存)→ 根域名服务器 → 顶级域(TLD)服务器(如 .com)→ 目标域名的权威域名服务器,权威服务器返回最终记录后沿原路返回,并被递归解析器按 TTL 缓存。缓存命中时整个过程只有本机一跳。
A 记录和 AAAA 记录有什么不同?+
A 记录把域名映射到 32 位 IPv4 地址(RFC 1035);AAAA 记录把域名映射到 128 位 IPv6 地址(RFC 3596)。同一域名通常同时配置两种记录,双栈网络下客户端优先尝试 IPv6,失败再回退 IPv4。
为什么我改了 DNS 记录但马上访问还是旧 IP?+
因为各级递归解析器都按记录的 TTL(生存时间)缓存旧结果。TTL 决定缓存多久过期,常见值是 600–3600 秒。修改权威记录后需要等待旧缓存自然过期,或主动在解析器上清除缓存(flush)才能全球生效。
References

参考来源