DNS
DNS 是分层、分布式的名称查询系统。本文负责资源记录、解析流程和缓存失效。
1. 面试核心
先记住这几条,再读正文- 记录类型。 A 和 AAAA 分别提供 IPv4 和 IPv6 地址,CNAME 指向别名目标。
- 解析过程。 递归解析器利用缓存和逐级委派获取完整答案。卡 · 面试核心
- 缓存与切流。 TTL 限制记录的缓存时间,已有连接仍可使用旧地址。
- 负缓存。 NXDOMAIN 表示名称不存在,NODATA 表示缺少所查类型的记录。卡 · 负缓存
- 传输协议。 DNS 同时支持 UDP 和 TCP,截断响应可触发 TCP 重查。卡 · DNS 传输
2. 资源记录
| 类型 | 含义 |
|---|---|
| A / AAAA | 名称对应的 IPv4 / IPv6 地址。 |
| CNAME | 名称的别名目标,解析器继续查询目标记录。 |
| NS | 区域的权威服务器。 |
| MX | 邮件服务器及其优先级。 |
| SOA | 区域管理信息,包括负缓存所需参数。 |
CNAME 的目标是名称。解析器要继续取得目标的 A 或 AAAA 记录。别名和目标记录各有自己的 TTL。
3. 递归与迭代查询
应用调用系统解析接口。系统按自身配置检查 hosts 或本地缓存。需要查询 DNS 时,客户端向递归解析器请求完整答案。
递归解析器优先使用有效缓存。缓存未命中时,它沿委派关系查询:
客户端 → 递归解析器
→ 根:返回顶级域的委派
→ 顶级域:返回目标区域的委派
→ 权威服务器:返回记录或别名
递归查询要求对方代为完成解析。迭代查询允许对方返回下一步的服务器。根和顶级域的委派也能缓存,因此查询可跳过这些步骤。
4. 缓存与服务切换
假设旧地址的 TTL 为 300 秒。权威端改成新地址后,缓存仍能在剩余时间内返回旧值。提前降低 TTL,需要等待旧 TTL 先过期。
DNS 更新后,连接池仍可复用旧连接。因此切流还要处理连接寿命和旧实例排空。新旧端点需要保留一段重叠服务时间。
5. 负缓存
NXDOMAIN 表示查询名称不存在。NODATA 表示名称存在,但没有请求的记录类型。两者都可以进入负缓存。
RFC 2308 用 SOA 的 TTL 与 MINIMUM 的较小值控制负缓存时长。解析器还可施加本地上限。新增记录后,客户端仍需等已有负缓存失效。
例如名称已有 A,却没有 AAAA。AAAA 查询的 NODATA 不应被解释成整个名称不存在。
6. DNS 传输
传统 DNS 在 UDP 和 TCP 上都使用 53 端口。UDP 响应设置 TC 位时,客户端可改用 TCP 取得完整答案。完整 DNS 实现需要支持 TCP。
未使用 EDNS 时,UDP DNS 消息限制为 512 字节。EDNS 可声明更大的 UDP 接收能力。超过 512 字节并非一律改用 TCP。AXFR 区域传送使用 TCP。
7. 使用边界
DNSSEC 验证签名数据的来源与完整性。DoT 和 DoH 加密客户端到解析服务的传输。记录验证与通道加密各有用途。
解析成功只完成地址发现。后续还要经过建连、TLS 和 HTTP 处理。
8 · 面试题卡片
本页题目与参考回答
8.1 访问域名时 DNS 如何解析,修改记录后为什么可能仍访问旧地址?
考察重点:递归解析、权威委派和缓存 TTL 对地址变更的影响。
参考回答
递归解析器利用缓存和逐级委派取得地址。
缓存有效时直接返回;失效后再查询权威体系。旧记录可在剩余 TTL 内继续使用。连接池复用旧连接也会延长切流时间。因此需要提前调整 TTL,并安排旧实例排空。
8.2 新增域名后仍收到 NXDOMAIN,应检查什么?
考察重点:负缓存类型、SOA 参数和缓存层次。
相关内容:负缓存。
参考回答
应检查客户端和递归解析器中的负缓存。
权威端已有记录时,旧 NXDOMAIN 仍可留到负缓存到期。负缓存时长取 SOA TTL 与 MINIMUM 的较小值。还要区分名称不存在和某种记录缺失。
8.3 DNS 什么时候使用 TCP,超过 512 字节就必须切换吗?
考察重点:TC 位、EDNS 与 TCP 支持。
相关内容:DNS 传输。
参考回答
截断响应可触发 TCP 重查,AXFR 也使用 TCP。
512 字节是未使用 EDNS 的 UDP 消息限制。启用 EDNS 后,可协商更大的 UDP 接收能力。判断重查时应结合 TC 位和网络可达性。
8.4 DNSSEC 与 DoH、DoT 分别提供什么保护?
考察重点:记录验证与传输加密的边界。
相关内容:使用边界。
参考回答
DNSSEC 验证签名记录的来源和完整性。
DoH、DoT 加密到解析服务的传输。加密通道仍需信任解析服务提供的答案。记录签名与通道加密解决不同问题。