本页课程原文(点开阅读)

DNS 域名系统

课程(6 节,按顺序学)

第 1 课 · 域名是给人记的,IP 是给机器用的

入门 · 约 8 分钟

本课目标:搞清 DNS 到底在解决什么问题,以及域名的层级结构。

为什么要有 DNS

机器之间通信靠的是 IP 地址,但 203.0.113.10 这种数字人记不住。

DNS(Domain Name System)就是那一层翻译:
把人记得住的名字,翻译成机器要用的 IP。

★ 这也是「网络三层静态路由」模块留下的一个衔接点:
那个模块讲的是「有了 IP 之后包怎么走」,这个模块讲的是「IP 从哪来的」。

★ 域名是从右往左、从根往下数的

www.example.com. 拆开看:

.          ← 根(Root),最右边那个通常省略不打
   com.           ← 顶级域(TLD)
example.com.      ← 二级域
www.example.com.  ← 主机名/子域

★★ 结尾那个点不是笔误——它就是根域自己。日常打字省略它,但协议里域名确实是「从根往下数」的一串标签。

★ 每一级都可能被委派给不同的服务器管——这是下一课的主题。

动手:看一次完整的解析走了哪几级

去解析仿真页,查 www.example.com。

★ 看它经过的每一级:本地 → 缓存 → Root → 顶级域 → 权威服务器。

实验重点

  • ★ DNS 就是「域名 → IP」的翻译层——人记名字,机器用 IP
  • ★★ 域名从根往下数:. → com. → example.com. → www.example.com.
  • 结尾的点代表根域自己,不是笔误

第 2 课 · ★★ 递归 vs 迭代

入门 · 约 10 分钟

本课目标:搞清「客户端只问一次」和「resolver 却要问好几次」之间发生了什么。

★★ 两种「问」,含义完全不同

递归查询(Recursive):「你告诉我最终答案,我不管你怎么查出来的。」
客户端问 resolver,就是这种——只发一次,等着拿最终结果。

迭代查询(Iterative):「你知道多少就说多少,不知道的话告诉我该去问谁。」
resolver 问 root / 顶级域 / 权威服务器,就是这种——每一台要么给答案,要么给推荐,绝不会说「我帮你继续查」。

★★★ 关键:root / 顶级域 / 权威服务器之间从不直接对话

整个「苦活」都是 resolver 自己一个人跑的:

resolver → Root         问一次
resolver → TLD(.com)    再问一次
resolver → 权威服务器    再问一次

★★ 这三次都是 resolver 直接发出去的——root 不会替你去问顶级域,顶级域也不会替你去问权威服务器。
它们只是各自给一个「推荐」,由 resolver 亲自去问下一个。

★ 这跟三层路由完全不同:路由器之间是一跳一跳转发同一个包;而这里是同一个提问者反复直接发问,中间人从不转发。

动手:数一数问了几次

去解析仿真页,查 www.example.com,逐步看每一跳的「谁问的谁」。

★ 注意每一跳的「问」这一栏——永远是同一台 resolver。

实验重点

  • ★★ 递归查询:只发一次,等最终答案(客户端 → resolver 是这种)
  • ★★ 迭代查询:要答案要推荐,绝不代劳(resolver → root/顶级域/权威 是这种)
  • ★★★ resolver 自己一级一级直接问,中间人从不互相转发

第 3 课 · ★★★ 权威 / 递归 / 转发:三种能力

进阶 · 约 12 分钟

本课目标:这是整个模块的核心:三种能力是独立开关,可以叠加在同一台服务器上。

三种能力,各自回答一个问题

| 能力 | 回答的问题 |
|---|---|
| 权威(Authoritative) | 「这段名字空间归我管,我这儿有真答案」|
| 递归(Recursive) | 「我不权威的话,我自己去帮你一级级问」|
| 转发(Forwarding) | 「我不权威的话,我把整个问题原样交给别人」|

★★★ 这三个是独立的开关,不是三选一。一台服务器完全可以「权威 A + 转发 B」同时成立。

★★ 最常见的真实配置:企业内网 DNS

公司内网通常这样配一台 DNS 服务器:

· 权威管理 corp.internal.(内部系统的名字)
· 配了转发(转给 ISP 或者 8.8.8.8 之类的公共递归服务器)

结果就是同一台服务器,问内部名字直接权威答,问外部名字整个转发出去——
员工不管问什么,都只用配这一个 DNS 地址。

★ 转发 vs 递归:差别在「谁去做迭代查询」

两者都是「自己不权威时怎么办」的解法,但干活的人不一样:

· 递归:自己去问 root/顶级域/权威——迭代查询由它自己做
· 转发:把整个问题扔给上游——迭代查询由上游做,它只是个「快递员」

★ 转发的好处:内网服务器不需要知道 root 服务器的地址,也不用自己承担递归的开销——都交给上游。

动手:同一台服务器,两种反应

当前场景 ② 转发 vs 递归。去解析仿真页:

① 查 app.corp.internal —— InternalDNS 权威命中,直接答
② 查 www.example.com —— InternalDNS 整个转发给 Resolver1,由 Resolver1 去做真正的递归

★★ 同一台服务器,取决于问的是什么名字,走的是完全不同的路径。

实验重点

  • ★★★ 权威 / 递归 / 转发是三个独立开关,可以叠加
  • ★★ 现网最常见:内网权威 + 转发外部查询——只用配一个 DNS 地址
  • ★ 转发和递归都是「自己不权威怎么办」的解法,差别是谁去做迭代查询

第 4 课 · ★★ 本地 hosts 与缓存

进阶 · 约 10 分钟

本课目标:搞清「查都不用查」和「问过就记住」,以及为什么改了 DNS 记录不一定立刻生效。

★★ 本地 hosts:查都不用查

在向任何服务器发出查询之前,客户端先看本机的 hosts 文件——如果里面写死了这个名字,直接用,零网络包。

⚠️★★ 这也是「明明改了 DNS 记录,访问的却还是老地址」最常见的原因:hosts 文件不会跟着 DNS 记录一起更新,它是一份完全独立的静态清单。

★ 缓存:问过一次,记住一段时间

resolver 每次成功拿到答案,都会存一份缓存,直到 TTL 过期。

★★ 下次再有人问同一个名字,直接从缓存拿——不会重新走一遍委派链。

★ TTL 由权威服务器决定,写在记录里——TTL 越短,改了记录之后全网生效越快,但缓存命中率也越低。

动手:查一个「过时」的答案

当前场景 ④ 本地 hosts 覆盖。PC-Stale 的 hosts 里写死了一个(跟真实权威记录不一样的)IP。

去解析仿真页查 www.example.com —— 看它是不是查都没查就直接给了那个「旧」答案。

实验重点

  • ★★ hosts 文件优先级最高,而且不会跟着 DNS 记录自动更新
  • ★ 缓存命中不会重新走委派链——这正是缓存存在的意义
  • TTL 决定了改了记录之后要多久才能全网看到新答案

第 5 课 · ★★ NXDOMAIN vs 拒绝:两种「没有答案」

排障 · 约 10 分钟

本课目标:这两种失败长得像,含义却完全不同——分清楚它们,排障能省很多时间。

★★ NXDOMAIN:域名确实不存在(合法回答)

问到的服务器确实权威管这段名字空间,但里面没有这条记录。

★ 这不是故障——是一个明确、完整的回答:「查无此名」。浏览器打错网址时看到的就是这种。

★★ 拒绝(Refused):这台服务器帮不了你

问到的服务器既不权威这个名字、也没开递归、也没配转发——它没有办法回答,直接拒绝。

★★★ 最常见的原因:resolver 配错了,直接指向了一台只权威自己 zone 的服务器(比如误把权威服务器的地址当成了公共 DNS 地址填了进去)。

动手:对比两种失败

① 场景 ⑤ 域名不存在:查 nope.example.com —— 一路问到权威服务器,它确实管这个 zone,但没这条记录 → NXDOMAIN

② 场景 ③ 纯权威拒绝递归:PC-Bad 的 resolver 直接指向了权威服务器 Auth1。查任何 Auth1 不权威的名字 → 拒绝

★ 同样是「没拿到 IP」,原因完全不同,修法也完全不同。

实验重点

  • ★★ NXDOMAIN:问到了权威的服务器,它确实没这条记录——合法回答
  • ★★ 拒绝:服务器既不权威、没开递归、没配转发——帮不了你
  • ★★★ 拒绝最常见的原因:resolver 配错了,直接指向了权威服务器

第 6 课 · ★ 委派是配出来的,不是协议发现的

进阶 · 约 10 分钟

本课目标:委派关系是怎么来的——以及为什么它可以发生在任意一级。

★ 委派可以发生在任意一级,不是固定的三级

「root → 顶级域 → 权威」只是最常见的三级,不是写死的规则。

权威服务器完全可以把自己管的一段名字空间再往下委派——比如 example.com. 的管理员可以把 dev.example.com. 这一段整个交给另一台服务器管。

★★ 每多一级委派,解析就多问一次——链条能有多深,取决于配置,不是协议限制。

★★ 「谁管哪一段」是人写进 zone 文件的

NS 记录(委派)、A/CNAME 记录(答案)都是管理员手写进 zone 文件的,没有哪个协议帮你发现或同步这份归属关系。

★★ ⚠️ 注意这跟「控制面」不是一回事——DNS 压根没有路由协议那种控制面/数据面的划分:
它只有普通的查询/应答报文(就是「解析仿真」页看到的那些),没有另一套专门用来同步「谁管哪一段」的信令协议。
这份归属关系纯粹是静态配置,连「控制面」都算不上。

动手:看一次 4 级委派

当前场景 ⑥ 多级委派。查 api.dev.example.com —— 数一数经过了几级委派(提示:比默认场景多一级)。

实验重点

  • ★ 委派可以发生在任意一级——不是固定的「root/顶级域/权威」三级
  • ★★ 「谁管哪一段」是人写进 zone 文件的,没有协议帮你同步
  • ★★ DNS 不是路由协议,没有控制面/数据面的划分——只有普通的查询/应答 traffic
冀ICP备2026021556号-2|冀公网安备13068302000206号