查询链:像查户口一样逐级问
浏览器拿到域名后,先翻自己的缓存,再问操作系统(hosts 文件、系统缓存),都没有就交给本地 DNS 服务器(运营商分配或手动配的 114/223.5.5.5/8.8.8.8)。接下来才是正戏:
本地DNS ──问根──→ 根服务器:「.com 谁管?问这个地址」
本地DNS ──问顶级─→ .com 顶级域:「note.example.com 的权威 DNS 在哪」
本地DNS ──问权威─→ 权威服务器:「A 记录 203.0.113.10」
本地DNS ──返回──→ 客户端(顺手缓存,按 TTL 过期)
// 递归查询:客户端只对本地 DNS 说「帮我查到底」
// 迭代查询:本地 DNS 对各级服务器说「你不用查完,告诉我下一个该问谁」
// 全世界每天数百亿次查询,靠的是这套分工 + 缓存13 个根服务器不是性能瓶颈——绝大多数查询根本到不了根,各级缓存层层拦截。真正会到根的,只有缓存全 miss 的冷门域名。
TTL:缓存的生命周期
每条 DNS 记录带 TTL(秒),各层缓存都遵守它。这是把双刃剑:TTL 长,解析快、查询少,但换 IP 后全球生效要等满 TTL;TTL 短,切换灵活,查询量翻倍。实践:平时 TTL 设 1 小时,计划切换前 24 小时先调低到 60 秒,切换完再调回去。很多“改了解析怎么还没生效”,答案就是某一层缓存还没过期。
劫持与 HttpDNS
UDP 明文查询意味着链路上谁都可能动手脚:运营商 DNS把广告插进解析结果、把 CDN 域名解析到自家缓存,甚至直接返回错误 IP。应对方案:HttpDNS——绕过 UDP 53 端口,用 HTTPS 直接请求解析服务拿结果,App 类产品标配。通用域名还可以上 DoH/DoT(DNS over HTTPS/TLS)加密查询。内网注意另一类“劫持”:公司内网解析器把内部域名转给公网查,内网服务解析失败先查 split-horizon 配置。
实战:dig 看清每一跳
$ dig note.example.com +noall +answer
note.example.com. 300 IN A 203.0.113.10
↑ TTL(秒) ↑ 当前解析结果
$ dig note.example.com @8.8.8.8 # 指定解析器对比结果
$ dig +trace note.example.com # 完整走一遍根→顶级→权威
$ dig -x 203.0.113.10 +short # 反向解析
# 排障口诀:
# 本地 dig 结果异常 → @8.8.8.8 对比 → 还异常就是权威配置问题
# 时好时坏 → 看权威 DNS 是否有多条记录、健康检查是否飘DNS 记录不止 A 记录
常用记录类型记四个就够:A(域名→IPv4)、AAAA(→IPv6)、CNAME(别名,指向另一个域名,CDN 接入全靠它)、MX(邮件路由)。负载均衡玩法也在这里:一个域名配多个 A 记录轮询是最朴素的多机房分流,结合 GeoDNS 还能按地区返回就近 IP——下一讲的 CDN,就是把这套玩法做到极致。下一篇:CDN——静态资源为什么能快到离谱。
评论 (0)