DNS 在项目里最常以"问题"的形式出现:
- 域名突然解析到旧 IP,变更半天不生效
- 同一个域名,你本机能访问,同事/线上机器访问不了
- DNS 被污染/劫持,解析到奇怪的地址
ping 域名失败,但ping IP又能通
这篇我用"知识分享 + 可验证"的方式讲清楚:
- DNS 这条链路到底怎么走
- 缓存/TTL 为什么会让变更延迟
- 出问题时你怎么用命令把证据抓出来
目录(按排查顺序)
-
- DNS 到底解决什么问题
-
- 递归 vs 迭代:谁在替你跑腿
-
- 解析全链路:
www.example.com到底经历了哪些节点
- 解析全链路:
-
- 缓存与 TTL:为什么变更不会立刻生效
-
- 实战:常用命令与排障闭环
-
- 最后总结
1. DNS 到底解决什么问题
- DNS(Domain Name System)负责把 域名 解析为 IP 地址。
人类记域名更容易,网络通信最终要靠 IP。
2. 递归查询 vs 迭代查询
面试里你可以这样说:
- 递归:你问一个"代办",它帮你查到最终答案再回来给你。
- 迭代:你问一个"指路人",它告诉你下一站去哪,你自己再去问下一站。
典型链路:
- 你的机器 -> 本地 DNS(递归)
- 本地 DNS -> 根/顶级/权威 DNS(多为迭代)
3. DNS 解析全链路(按步骤讲)
以访问 www.example.com 为例。
第 1 步:浏览器/系统先查本地缓存
常见缓存位置:
- 浏览器 DNS 缓存
- 操作系统 DNS 缓存
hosts文件(最高优先级之一)
如果命中,直接得到 IP。
第 2 步:请求本地 DNS 服务器(递归)
如果本地没有命中,就把域名发给本地 DNS(通常是运营商/公司内网 DNS)。
第 3 步:本地 DNS 开始向外查询(迭代)
本地 DNS 会按层级去问:
- 问根服务器:
.com的服务器是谁? - 问
.com顶级域名服务器:example.com的权威服务器是谁? - 问
example.com权威服务器:www.example.com的 A/AAAA 记录是多少?
最后拿到 IP。
第 4 步:本地 DNS 返回结果并缓存
- 把 IP 返回给你的机器
- 同时按照 TTL 缓存
4. 缓存与 TTL:为什么变更不会立刻生效
因为会把根域名打爆。
缓存层级很多:
- 本机缓存
- 本地 DNS 缓存
- 各级 DNS 服务器缓存
这就是为什么:
- 有时候你改了域名解析,但要等一段时间才生效(TTL)。
5. 实战:常用命令与排障闭环
5.1 TTL 是什么
- TTL(Time To Live)是 DNS 记录的缓存时间。
- TTL 越大:解析更快但变更生效慢。
- TTL 越小:变更更快但查询压力更大。
5.2 DNS 劫持/污染
表现:
- 访问某域名被解析到错误 IP
应对方向:
- 使用可信 DNS(如公司内网 DNS、公共 DNS)
- HTTPS 能降低劫持造成的内容篡改风险(但 DNS 本身仍可能被影响)
5.3 快速排障命令(Windows)
nslookup 域名ping 域名tracert 域名(Windows)
如果你怀疑是"本机缓存导致解析不一致",可以:
bash
ipconfig /displaydns
ipconfig /flushdns
核心思路(尽量按这个顺序缩小范围):
- 先确认"域名能不能解析到 IP"
- 再确认"IP 能不能通"
- 再确认"端口服务是否可用"
6. 最后总结
6.1 你可以这样总结(写在脑子里的版本)
DNS 的作用是把域名解析成 IP。解析时客户端会先查浏览器/系统/hosts 等本地缓存,未命中则请求本地 DNS 服务器做递归查询。本地 DNS 通常通过迭代方式依次询问根服务器、顶级域名服务器和权威服务器,最终拿到域名的 A/AAAA 记录并按 TTL 缓存,返回给客户端。TTL 决定缓存时间,也解释了为什么解析变更不会立刻全网生效。