CS 168 · LECTURE 15 · 2026-10-15 · 应用与端到端

DNS:名字如何在分层缓存中解析

DNS 把人类名称映射成可变的服务位置,并用分层委派与缓存把全球查询负载分散出去。

版本快照:Fall 2026 官方课表与在线教材,核对日期 2026-09-02;官网仍标注 under construction,日期与政策可能变化。

  1. 互联网地基
  2. 路由
  3. 传输
  4. 应用与端到端
  5. 数据中心
  6. 群体通信
  7. 无线与移动

本章核心问题

本地 resolver 第一次从不知道 example.com 开始,如何找到权威答案;第二次为什么快得多?

1 · 角色不要混用

应用通常把问题交给 stub resolver;递归 resolver 负责追踪委派。root server 不保存所有主机地址,而是指向顶级域;TLD 再指向域名的 authoritative server;只有权威服务器发布该 zone 的记录。

所谓“递归查询”描述客户端希望 resolver 完成全部工作,“迭代查询”描述 resolver 逐级拿 referral。一次解析同时包含两种交互。

2 · 资源记录与别名

A/AAAA 把名字映射到地址,NS 指定权威服务器,CNAME 建立别名,MX 指定邮件交换,TXT 承载验证等文本。每条 RR 都有 owner、type、class、TTL 与 value。

CNAME 会引入额外查找;NS referral 还可能需要 glue address 打破“要找 NS 地址必须先问该 NS”的循环依赖。

3 · 缓存是一致性取舍

缓存减少上游负载和查询延迟,但在 TTL 内可能返回旧值。短 TTL 加快变更,却增加查询流量与对权威服务的依赖;长 TTL 提升稳定性,却延长迁移窗口。

negative caching 也会缓存不存在结果。发布新记录后“仍然 NXDOMAIN”可能来自旧否定缓存,不一定是当前权威配置仍错。

4 · 安全边界

传统 DNS 响应使用事务 ID 与源端口做匹配,但仍可能遭受缓存投毒。DNSSEC 用签名建立从信任锚到记录的可验证链,保证来源与完整性,不提供查询机密性。

DoH/DoT 加密 stub 到 resolver 的链路,但把信任转移给 resolver;它们与 DNSSEC 解决的问题不同。

交互推演:区分 stub、recursive resolver、root、TLD 和 authoritative server 的职责。

DNS 是多角色、带缓存的请求链,逐步展示能澄清递归与迭代查询。

区分 stub、recursive resolver、root、TLD 和 authoritative server 的职责。的静态步骤概览

纠错:最容易带走的错误模型

闭卷推演

从空缓存解析 www.example.com,列出每次 query、referral、最终 RR 与可缓存对象;再让 A 记录 TTL 到期而 NS 未到期,重走流程。

检查:DNSSEC 主要提供什么?

机制工作台:before → event → after

Before / local state

stub resolver 查本地 cache

Event / after / output

stub resolver 查本地 cache;miss 后递归 resolver 沿 root→TLD→authoritative,逐层保存带 TTL 的 mapping。

检查:判断一个实现分支是否必要,最有力的问题是什么?

检查:若把这一机制移到完全不同的网络位置,首先应重新确认什么?

Explain It Yourself

画一次 cache miss 与随后 cache hit 的 message timeline。

自检方法

答案必须出现 packet/message、local state/table、触发 event、after state 与 output;只给定义不算完成。

Worked Packet/State Trace:冷缓存到热缓存

解析 www.example.test,权威区先返回 CNAME,再解析目标 A 记录。

消息保存的状态为何继续
0stub→resolverpending(client,name,type,ID,deadline)关联响应
1resolver→root.test NS referral + TTL缩小 authority
2resolver→TLDexample.test NS + glue找到 authoritative
3authoritative→resolver: CNAMEalias 与独立 expiryCNAME 不是地址
4cdn authority→resolver: AA + TTL;完成 pending返回 client
5第二客户端查询命中未过期 RRset无需 root/TLD packet

Counterfactual:缓存没有 TTL

权威迁移地址后 resolver 永久回答旧记录。TTL 不是“保证立即一致”,而是陈旧状态的最长租约;短 TTL 增加查询负载,长 TTL 延长故障切换传播。

Misconception Analysis:root 返回最终 IP

为什么会误解
应用只调用一次 resolver API,迭代过程被隐藏。
反例
root 返回 TLD referral,TLD 指向 zone authority,CNAME 还可能启动另一条链。
正确模型
stub 交出递归责任;resolver 迭代穿过 delegation,并按 TTL 缓存证据。

Resolver State Map

状态事件变化不变量
positive cacheanswer/referral按 RRset + expiry 保存只返回未过期匹配记录
negative cache权威 NXDOMAIN保存有界失败失败也会过期
pending querysend/response/timeout建立或完成关联无关 response 不交给 client
delegationNS/glue移向更具体 authority查询单调推进

Resolution Checks

检查:收到 CNAME 后为何继续?

检查:A 记录 TTL 到期后?

检查:pending query state 为何存在?

Explain It Yourself

  1. 从空缓存画含 CNAME 的完整 timeline,并写每个 cache entry。
  2. 预测记录改变后,TTL 到期前后两个 resolver 的回答。

一手资料

正文是 CourseStack 的中文解释与重新绘制的教学例子;官方页面负责课程原始定义,历史仓库只提供你的实现证据。