DNS
在选择题中偶尔有考查,需要掌握 DNS 的域名服务器的不同层级,以及域名解析过程的两种方式(迭代和递归)。
层次域名空间
DNS 使用 层次域名空间 来组织域名,将域名划分为多个级别,每个级别之间以点(.)分隔。域名从右到左逐级递增,最右边是 顶级域名(TLD),然后是 二级域名, 三级域名,以此类推。
例如,完全限定域名可写成 www.example.com.,末尾的点代表根;通常书写时省略。.com 是顶级域,example.com 是二级域名,www 是该域中的主机名或更低一级标签。
DNS 层次域名空间 的设计使得域名分布在不同的管理区域中,每个管理区域负责管理其自己的域名空间。这种分层结构有助于提高可扩展性和效率。
域名服务器
在 DNS 体系结构中,服务器按照层级划分,每一层负责不同的职责。下面按照从最高层到最低层的顺序,对四类常见的域名服务器进行说明:
- 根域名服务器 (Root Name Servers):
- 这些服务器位于 DNS 解析的最顶端。它们不直接回答关于哪个域名映射到哪个 IP 地址的查询,而是告诉查询者下一步应该询问哪个顶级域名(TLD)服务器。
- 根区有 13 个逻辑根服务器标识(A~M),每个标识通过任播部署许多实例;不能把“13 个逻辑标识”误解为全球只有 13 台物理机器。
- 顶级域名服务器 (Top-Level Domain Name Servers, TLD):
- 这些服务器负责特定的顶级域名(如
.com,.org,.net等)。它们为下一级的域名(如example.com)提供有关权威名称服务器的信息。
- 这些服务器负责特定的顶级域名(如
- 权威域名服务器 (Authoritative Name Servers):
- 这些服务器为特定的域名(如
example.com)提供详细的 DNS 记录信息(例如 A 记录、MX 记录等)。只有权威服务器才能为其负责的域名提供这些信息。 - 大多数组织拥有权威 DNS服务器来为他们的域名提供解析服务。
- 这些服务器为特定的域名(如
- 本地域名服务器/递归解析器 (Local Resolver)
- 为主机接受递归查询,检查缓存;缓存未命中时代表主机向 DNS 层次结构继续查询。
- 每个 ISP 或一所大学都可以有一个本地域名服务器。
域名解析过程
域名解析分为 递归查询 和 迭代查询 两种。
- 递归查询:请求方要求被查询服务器返回最终答案或错误,而不是只给下一步指引。主机的 stub resolver 通常把任务递归交给本地 DNS 解析器。
- 迭代查询:请求方会得到一个“指引”,然后自己去问下一层。
迭代查询
在域名解析过程中,本地域名服务器 向根域名服务器发送的通常是迭代查询。
当 根域名服务器 收到查询请求后,不会代替本地域名服务器继续查询,而是返回结果中的两种情况之一:
- 若能解析出所需的 IP 地址,则直接返回;
- 若不能解析,则告知本地域名服务器应当联系的下一级顶级域名服务器。
随后,本地域名服务器根据指引,向对应的 顶级域名服务器 继续查询。顶级域名服务器的处理方式类似:
- 若能解析出所需的 IP 地址,则返回结果;
- 否则告知本地域名服务器应当访问的下一步权限域名服务器。
权威域名服务器最终返回自己负责区域中的记录。本地域名服务器获得目标域名对应的 IP 地址后,把结果返回给最初发起请求的主机,并按 TTL 缓存答案和中间转介信息。
sequenceDiagram
participant Host as 主机
participant Local as 本地域名服务器
participant Root as 根域名服务器
participant TLD as 顶级域名服务器 (TLD)
participant Auth as 权限域名服务器 (Authoritative)
Host->>Local: 1) 查询 www.example.com
Local->>Root: 2) 迭代查询(请求根服务器)
Root-->>Local: 3) Referral: 指向对应的 TLD 服务器(例如 .com)
Local->>TLD: 4) 迭代查询(请求 TLD 服务器)
TLD-->>Local: 5) Referral: 指向该域的 权限域名服务器
Local->>Auth: 6) 迭代查询(请求权限域名服务器)
Auth-->>Local: 7) 返回最终 IP 地址(例如 93.184.216.34)
Local-->>Host: 8) 本地 DNS 将 IP 返回给主机
Note right of Local: 本地域名服务器可能会把结果缓存一段时间
递归查询
上图展示的是用于对比概念的 纯递归教学模型:每一级服务器都替请求方继续查询,并把最终结果逐级返回。若根服务器接受这种递归任务,会造成巨大状态与负载压力,因此公网根和 TLD 服务器通常不为普通客户端执行递归。
实际最常见的组合是:主机 → 本地递归解析器 使用递归查询;本地解析器 → 根、TLD、权威服务器 使用迭代查询。也就是说,不是“递归查询几乎不使用”,而是递归职责集中在本地或公共递归解析器,根服务器主要返回转介。
sequenceDiagram
participant Host as 主机
participant Local as 本地域名服务器
participant Root as 根域名服务器
participant TLD as 顶级域名服务器 (TLD)
participant Auth as 权限域名服务器 (Authoritative)
Host->>Local: 1) 查询 www.example.com
Local->>Root: 2) 向根域名服务器发起递归查询
Root->>TLD: 3) 根服务器代为查询 TLD 服务器
TLD->>Auth: 4) TLD 服务器递归查询权限域名服务器
Auth-->>TLD: 5) 返回最终 IP 地址
TLD-->>Root: 6) TLD 把结果返回给根服务器
Root-->>Local: 7) 根服务器把最终 IP 地址交给本地 DNS
Local-->>Host: 8) 本地 DNS 返回结果给主机
DNS 递归查询和迭代查询的不同点如下:
| 特点 | 递归查询 | 迭代查询 |
|---|---|---|
| 查询责任 | 被查询服务器负责给出最终答案或错误 | 被查询服务器可返回转介,由查询方继续询问下一层 |
| 查询方复杂度 | 查询方只需发起一次请求 | 查询方可能需要多次查询并跟随转介 |
| 典型场景 | 主机 stub resolver → 本地/公共递归解析器 | 递归解析器 → 根、TLD、权威服务器 |
| 服务器负担 | 需维护递归状态、缓存并代表客户端继续查询 | 单次请求负担较小,主要返回答案或下一步指引 |
下面的交互把“主机递归委托 + 解析器迭代追踪”按 8 个消息步骤推进,避免把两种查询误认为互斥的整套方案。
一次 DNS 解析怎样组合递归与迭代
以 www.example.com 为例,逐步查看主机递归委托本地解析器、解析器跟随根与 TLD 转介、权威服务器返回地址,以及结果按 TTL 缓存。
当前查看:主机递归委托。主机的 stub resolver 请求本地递归解析器返回 www.example.com 的最终 A/AAAA 记录或错误。
DNS 缓存
无论是浏览器、操作系统,还是本地的递归 DNS 服务器,在接收到域名解析结果之后,都会将其暂时保存在本地 缓存 中。这样,如果同一个域名在短时间内被多次请求,就可以直接从 缓存 中获取结果,而不需要再次向外部服务器发送查询请求。
DNS 记录中包含一个名为 TTL(Time to Live)的字段,用于指定这条记录可以在缓存中 保存多久。比如 TTL 为 3600 表示记录在缓存中可保留 3600 秒(即一小时)。在这段时间内,只要有查询,就可以直接使用缓存的结果。当 TTL 到期后,缓存记录会被丢弃,下一次查询将重新走完整的解析流程。