2. DNS基础原理与域名空间

DNS(Domain Name System,域名系统)的核心任务,是把人容易记忆的域名翻译成网络设备可路由的 IP 地址。要理解 DNS 的工作方式,必须先看清它赖以运转的两样东西:一是域名空间这棵倒置的树,二是查询过程中递归与迭代两种截然不同的协作方式。前者决定了“名字存在哪里、由谁负责”,后者决定了“一次解析请求如何被逐级找到答案”。

一、域名空间是一棵倒置的树

整个 DNS 命名体系是一棵层次化的树,树根在最上方,向下逐级分叉。一个完整域名由若干“标签”(label)用点号连接而成,例如 www.example.com.。注意末尾那个点,它代表根域,写成完整形式时不可省略;日常输入时浏览器会自动补上,所以我们通常看不到它。

从右向左读,层级依次升高:

  • 根域(.):树的顶点,用单个点表示。全球共有 13 组根服务器标识(编号 A 到 M),通过任播技术在全球部署了大量镜像实例。根域本身不直接解析具体主机,它只负责告诉查询者“下一步该去问哪个顶级域”。
  • 顶级域(TLD):根的直接子节点,如 com、org、net、cn、edu。它分为通用顶级域(gTLD)和国家/地区顶级域(ccTLD)。TLD 服务器管理的是“二级域名的授权信息”,而不是某台主机的地址。
  • 二级域及以下:如 example.com 中的 example,通常由组织或个人注册。再往下还可以有 mail.example.com、www.example.com 等子域。

这里要区分两个容易混淆的概念:区域(Zone)与域(Domain)。域是命名空间中的一个逻辑分支,而区域是实际存放在某台服务器上、可被独立管理的一份数据文件。一个区域可以包含多个域,但一个域也可能被拆成多个区域分别授权。例如 example.com 可以把 bj.example.com 单独委派给另一台服务器管理,此时父区只保留一条 NS 记录指向子区。

二、权威域与权威服务器

当某个区域的数据被完整地存放在一台服务器上,并且这台服务器对该区域内的名字拥有最终解释权时,这个区域就是它的权威域,这台服务器称为权威域名服务器。权威服务器给出的回答带有 AA(Authoritative Answer)标志,表示“这是我负责的数据,不是从缓存里拿的”。

权威服务器又分两类:主服务器(Primary/Master)保存区域文件的可写原始副本;辅助服务器(Secondary/Slave)通过区域传送(AXFR/IXFR)从主服务器同步一份只读副本,用于冗余和负载分担。二者对外都表现为权威。

与之相对的是递归解析器(Recursive Resolver),也叫缓存服务器,如运营商 DNS 或 8.8.8.8。它本身对任何域都不权威,但愿意替客户端“跑腿”,把最终答案找回来。

三、递归查询与迭代查询

这是本节最关键的区分点,判断标准只有一条:谁承担继续追问的责任。

递归查询:客户端(如你的电脑)向本地递归解析器发出请求,并期望得到一个“最终答案”——要么是目标 IP,要么是明确的“不存在”。客户端把全部查找责任交给了解析器,自己不再追问。客户端到解析器这一段,通常是递归查询。

迭代查询:被询问的服务器如果不知道答案,不会替你去问别人,而是返回一个“线索”——通常是下一级服务器的地址或 NS 记录,让你自己去问。解析器到根、根到 TLD、TLD 到权威服务器这几段,都是迭代查询。

下面这张图展示了一次完整解析中,递归与迭代如何配合。假设客户端要解析 www.example.com,且解析器缓存为空:

客户端 Stub Resolver 递归解析器 缓存 + 迭代追问 8.8.8.8 / 本地DNS 根域服务器 返回 .com 的 NS .com TLD 服务器 返回 example.com 的 NS example.com 权威 返回 www 的 A 记录 ①递归 要最终答案 ②迭代 线索 ③迭代 线索 ④迭代 最终答案 ⑤返回结果 图例 递归查询(要最终答案) 迭代查询(返回线索) 最终答案回传

整个过程可以概括为:客户端对解析器是一次递归,解析器对根、TLD、权威服务器是多次迭代。解析器每拿到一个线索就继续追问,直到权威服务器给出 A 记录,再把结果沿原路返回给客户端,同时写入缓存。

四、一次解析的报文与缓存观察

用 dig 可以直观看到这个过程。加上 +trace 参数,dig 会自己模拟迭代过程,从根开始逐级追问:

$ dig www.example.com +trace

.                       518400  IN  NS  a.root-servers.net.
;; Received 239 bytes from 8.8.8.8#53

com.                    172800  IN  NS  a.gtld-servers.net.
;; Received 1170 bytes from 198.41.0.4#53

example.com.            172800  IN  NS  ns1.example.com.
;; Received 512 bytes from 192.5.6.30#53

www.example.com.        300     IN  A   93.184.216.34
;; Received 56 bytes from 93.184.216.34#53

输出中每一段都对应一次迭代:先问根,根返回 com 的 NS;再问 com 的 TLD 服务器,返回 example.com 的 NS;最后问 example.com 的权威服务器,拿到 A 记录。注意每行末尾的 TTL 值(如 300、172800),它决定了这条记录在缓存中能存活多少秒。TTL 越大,缓存命中率越高、查询越快,但记录变更后传播到全网的时间也越长。

缓存是 DNS 高效的关键。解析器会把每次拿到的记录按 TTL 缓存起来。当第二个客户端再问同一个域名时,解析器直接返回缓存结果,不再走根→TLD→权威的完整链路。这也是为什么修改 DNS 记录后,往往要等 TTL 过期才能全网生效。

五、常见记录类型与查询判断

解析过程中会涉及多种资源记录,理解它们有助于判断查询结果是否正确:

记录类型作用示例
A域名 → IPv4 地址www.example.com. 300 IN A 93.184.216.34
AAAA域名 → IPv6 地址www.example.com. 300 IN AAAA 2606:2800::1
NS指定该区域的权威服务器example.com. 172800 IN NS ns1.example.com.
CNAME别名指向另一个域名web.example.com. 300 IN CNAME www.example.com.
MX邮件交换服务器example.com. 3600 IN MX 10 mail.example.com.
SOA区域起始授权,含序列号与刷新参数example.com. 3600 IN SOA ns1...

排查解析问题时,可以按以下顺序判断:先用 dig 域名 @解析器 看递归解析器能否给出答案;若失败,再用 dig 域名 @权威服务器 直接问权威,判断是权威数据缺失还是解析器链路问题;最后用 dig 域名 +trace 观察在哪一级迭代中断。若权威能答而解析器不能答,多半是缓存或转发配置问题;若权威也答不出,则要检查区域文件与委派记录是否一致。

易错点:递归与迭代不是按“服务器类型”划分的,而是按“本次请求是否要求对方给出最终答案”划分的。同一台解析器,对客户端表现为递归服务端,对根和 TLD 则表现为迭代查询的发起方。判断时看的是请求的期望,而不是设备的身份。

掌握域名空间的树形结构、权威与递归的角色分工,以及递归/迭代的协作方式,就具备了读懂一次 DNS 解析全过程的框架。后续配置正向区域、反向区域和转发器时,本质上都是在为这棵树上的某个节点补充数据,或为解析器指定追问的起点。