DNS 基础概念:域名系统工作原理与解析流程
域名系统到底是什么?
说白了,DNS 就是互联网的“电话簿”。你把「www.example.com」递给它,它给你返回一个 IP 地址,比如 93.184.216.34。没有它,你上网就得靠脑记几十个数字,这谁受得了?
我做维护那会儿遇到过一个案例:某大厂上线新服务,用户反馈频繁超时。查了一圈发现是公共 DNS 缓存了旧记录,导致请求被路由到已经下架的节点。嗯,从那以后我养成了一个习惯——任何域名变更后,先手动清理本地 DNS 缓存再测试。
解析流程是怎么跑的?
整个流程分两步走:递归查询 和 迭代查询。你想想看,你的浏览器只跟本地的 DNS 解析器(比如 8.8.8.8)打交道,后面的事全是它替你跑腿。
- 用户发起请求:你在浏览器输入
www.example.com,系统先查本地 hosts 文件 → 再查本地 DNS 缓存。 - 本地递归解析器:如果没命中,它接管任务,去问更上游的服务器。
- 根域名服务器:解析器先问根("."),根告诉你“找 .com 的顶级域服务器”。
- 顶级域(TLD)服务器:.com 的 TLD 服务器告诉你“找 example.com 的权威服务器”。
- 权威域名服务器:最终拿到
www.example.com的 A 记录(IPv4 地址)。 - 返回 & 缓存:解析器把结果缓存起来,再返回给你的浏览器。
整个过程快的话几十毫秒,慢的时候超过 5 秒就会超时——我第一次遇到 DNS 导致的启动崩溃,就是在应用初始化时向某个域名发心跳请求,结果解析卡了 30 秒,直接导致连接池满、服务挂掉。后面我们给所有内部域名加上了本地缓存 + 备用解析器,才彻底解决。
缓存机制:你容易忽略的“坑”
每次查询结果都会被本地解析器缓存一段时间,这个时间由 DNS 记录里的 TTL(Time To Live)控制。比如 www.example.com 的 TTL 是 300 秒,那 5 分钟内本地解析器不会再去问上游。
为什么说这里是坑? 我之前处理过一个线上事故:运维团队改了权威服务器的 A 记录,但 TTL 设成了 86400 秒(一天)。结果业务人员反映新域名一直不生效,排查到最后发现本地缓存还在喂旧 IP。所以我的建议是:变更前先把 TTL 临时降到 60 秒,等缓存刷新了再改回去。
下表总结了不同角色的缓存行为:
| 角色 | 缓存内容 | 默认有效期 |
|---|---|---|
| 浏览器 | 域名→IP 映射 | 视 TTL,通常 60~300s |
| 操作系统 | DNS 客户端缓存 | 见系统设置(如 Windows 默认 86400s) |
| 本地解析器(如 8.8.8.8) | 递归查询结果 | TTL 上限(可被截断) |
常见的 DNS 异常及影响(先打个底)
讲到最后,咱们聊聊解析异常可能带来的后果。你想想看,如果应用启动时需要解析一个内部服务的域名,恰好遇到以下任一情况:
- DNS 服务器响应超时(比如防火墙把 53 端口拦了)
- 权威服务器返回了错误的记录
- 缓存存在但 IP 已作废(脏数据)
那应用很可能卡在解析阶段,启动超时,甚至直接崩溃。我在第一家公司改造微服务架构时就踩过这个坑——所有服务启动时都去注册中心查域名,结果注册中心自己的 DNS 挂了,导致全线启动失败。后来加上了本地 hosts 兜底,才算是治标。
nameserver 顺序,第一个不起作用时才会自动切换,这可能引入额外延迟。