注:本文基于模型知识整理,建议结合权威教材与 RFC 原文核对细节。
一句话定义
DNS(Domain Name System,域名系统)是一套分层的、分布式的命名系统,负责把人类易记的域名(如 www.example.com)翻译成机器路由所需的 IP 地址,并提供邮件路由等附属服务。
为什么重要
IPv4 地址是 32 位数字、IPv6 更长,人记不住,也没法描述一个会变的服务位置:服务器换机房、换云厂商都会换 IP,而域名可以不变,改一条解析记录就完成服务迁移。几乎所有应用层连接(打开网页、发邮件、连数据库)都以一次 DNS 查询为第一步:解析失败则服务整体不可达,解析缓慢则直接拖慢首字节时间。DNS 是整个互联网的电话簿,也是「网站打不开」类故障分层排查的第一站。
前置知识
建议先读 kp-012《IP 数据报与转发》,掌握 IP 地址、端口号,以及 UDP/TCP 面向无连接与面向连接的差别(DNS 默认跑在 UDP 53 上)。本章还会用到客户端-服务器模型与缓存的层级思想。
核心概念
- 域名层次树:域名是一棵从根向下的树。最顶层为根(root,书写时通常省略的「.」),其下是顶级域(TLD,top-level domain,如 com、cn、org),再下是二级域(example.com),可继续细分子域(api.example.com)。写全所有层级、以根结尾的名称叫 FQDN(fully qualified domain name,全限定域名)。
- 区域与权威服务器:管理权按区域(zone)切分。权威服务器(authoritative server)保存本 zone 的记录并对查询给出最终答案;上级 zone 通过 NS 记录把子域「授权(delegation)」给下级权威服务器,形成逐级委托的链条。
- 常见记录类型:A(域名到 IPv4 地址)、AAAA(域名到 IPv6 地址)、CNAME(别名,指向另一个域名;注意同一域名上 CNAME 不能与 A、MX 等其他记录共存,因此裸根域通常直接配 A 记录)、NS(本 zone 的权威服务器名)、MX(接收本域邮件的服务器与优先级,驱动邮件路由)、TXT(任意文本,广泛用于 SPF 发件人校验与 DKIM 签名公钥)、SOA(起始授权记录,含主权威服务器、序列号、默认 TTL 等管理参数)。
- 根服务器:逻辑上只有 13 个名字(a.root-servers.net 至 m.root-servers.net),但每个名字背后用任播(anycast)技术在全球分布了上千个等效节点。
图示
两种解析方式的分工:主机对本地 DNS 发递归查询,本地 DNS 对各级发起迭代查询。
主机 本地DNS 根服务器 TLD(com) 权威(a.com)
| www.a.com=? | | | |
|--------------->| www.a.com=? | | |
| |---------------->| com 的 NS? | |
| |<----------------| (返回 TLD NS)| |
| | www.a.com=?(自己去问 TLD) | |
| |------------------------------->| a.com 的 NS? |
| |<-------------------------------| (返回权威 NS) |
| | www.a.com=?(自己去问权威) |
| |----------------------------------------------->|
| |<--------------- 93.184.216.34 ------------------|
|<- 93.184.216.34(附带 TTL) |
递归查询:主机只问一次,本地 DNS 负责跑完全程。
迭代查询:本地 DNS 每问一级,对方只回答更近一步的 NS 地址,由它自己逐级问下去。原理与机制
缓存层级与 TTL。 每条记录都带 TTL(time to live,生存时间)。一次解析的命中路径是:浏览器缓存、操作系统缓存、本地 DNS(递归解析器)缓存,逐级命中则不再向上发起查询,TTL 过期才重新解析。TTL 越长缓存效率越高、记录变更生效越慢——这是「改了解析为什么半天不生效」的根源。
为什么用 UDP 53。 DNS 查询是一问一答的轻量交互,UDP 无需三次握手即可发出,延迟低、服务器开销小,且解析本身不需要连接状态。两类场景改用 TCP 53:其一,响应超过 UDP 载荷上限被截断(报文中 TC,truncation,标志位置位)时,客户端重试改用 TCP;其二,主从权威服务器之间的区域传送(AXFR)数据量大且要求可靠传输,必须走 TCP。
污染、劫持与加密扩展。 明文 UDP 查询可被路径上的设备伪造应答(DNS 污染/缓存投毒),也可被运营商 DNS 改写为广告页地址(劫持)。为此出现了加密解析:DoT(DNS over TLS,独立的 853 端口)与 DoH(DNS over HTTPS,复用 443 端口),动机都是把解析流量纳入 TLS 保护,对抗窃听与篡改。
实例分析
用 dig 观察一次解析:dig www.example.com 输出 Question(查什么)、Answer(A 记录值与各自 TTL)、以及应答服务器;dig +trace www.example.com 从根开始完整走一遍迭代路径,逐级授权清晰可见。运维实例:把 www 用 CNAME 指向 CDN 厂商域名,源站换 IP 时无需改 DNS;邮件域配 MX 记录指向邮件服务商,再用 TXT 记录发布 SPF 声明「哪些 IP 有权替本域发信」,收方据此过滤伪造邮件(对应 kp-026 的邮件路由)。
常见误区
- 把 CNAME 与其他记录配在同一域名上会造成解析冲突:CNAME 是整个名字的别名,不容许与同名记录并存,所以 zone 顶点(example.com 本身)通常用 A 记录或厂商的扁平化方案。
- 递归与迭代是查询模式而非服务器类型:本地 DNS 对主机扮演递归方,对根、TLD、权威扮演迭代方。
- 「改了记录立即生效」是错觉:各级缓存按各自 TTL 逐步过期,全局生效时间以最长链路 TTL 为准,变更前应提前调低 TTL。
- 13 个根服务器不是 13 台机器:任播让每个名字背后是全球分布的大量节点。
自测题
- 递归查询与迭代查询分别发生在哪两方之间?
答案要点: 递归查询发生在主机与本地 DNS 之间,主机只发一次请求并等待最终答案;迭代查询发生在本地 DNS 与根、TLD、权威服务器之间,每级只返回更近一步的 NS 地址,由本地 DNS 逐级追问。
- DNS 主要用 UDP 53,哪两种情况会改用 TCP?
答案要点: 响应被截断(TC 位置位)后,客户端改用 TCP 重试;主从权威服务器之间的区域传送 AXFR 数据量大且需要可靠传输,走 TCP 53。
- 为什么 example.com 这个裸根域通常不能直接配 CNAME 指向 CDN?
答案要点: 同一域名上 CNAME 不能与 MX、SOA、NS 等其他记录共存,而 zone 顶点必须持有 SOA 与 NS 记录;所以只能用 A/AAAA 记录,或使用 CDN 提供的 CNAME 扁平化方案。
- 用户反馈「解析刚改完,部分人仍访问旧服务器」,最可能的解释是什么?
答案要点: 浏览器、操作系统、本地 DNS 各级缓存按 TTL 逐步过期,旧记录在 TTL 窗口内仍被命中,属正常现象;应提前调低 TTL 并等待全网缓存过期。
延伸阅读
- 《计算机网络:自顶向下方法》(Kurose & Ross),应用层 DNS 一节
- 《TCP/IP 详解 卷1:协议》(Stevens),DNS 相关章节
- RFC 1034(概念与功能)、RFC 1035(实现与报文格式)