DNS 与域名系统
人记域名(www.example.com),机器记 IP 地址,DNS(域名系统)就是两者之间的"电话簿",负责把域名解析成 IP。它是每次网络访问的第一步,也是面试题"输入网址后发生什么"的第一环,同时支撑负载均衡与 CDN 调度。
DNS 解决什么问题
- 免记数字 IP:把 www.example.com 解析为 93.184.216.34 这样的地址。
- 负载均衡:一个域名配置多个 IP,服务器轮流返回,实现流量分发。
- 灵活迁移:更换机房或服务器只需改 DNS 记录,用户无感知。
域名的层次结构
域名用点分隔,从右往左层级逐级细化,形成一棵倒置的树:
. ← 根域
com ← 顶级域(TLD)
example ← 二级域(注册者持有)
└── www ← 主机/子域
完整域名: www.example.com.
顶级域分两类:通用顶级域(com、org、net)与国家/地区顶级域(cn、jp 等)。
DNS 服务器体系
| 服务器 | 职责 |
|---|---|
| 根域名服务器 | 只记录各顶级域服务器的地址,全球分布多组镜像 |
| 顶级域服务器 | 管理 com、cn 等顶级域下各权威服务器的地址 |
| 权威 DNS 服务器 | 真正保存某域名记录,返回最终解析结果 |
| 本地 DNS | 用户侧递归入口,如运营商或公共 DNS(8.8.8.8) |
解析过程:递归与迭代
用户发起查询后,本地 DNS 负责递归查询,而各级服务器之间是迭代查询:
客户端 ──递归──> 本地DNS
本地DNS ──查询──> 根服务器 ──答: 去查 com 顶级域──> 本地DNS
本地DNS ──查询──> com顶级域 ──答: 去查 example 的权威──> 本地DNS
本地DNS ──查询──> 权威DNS ──答: www.example.com = 93.184.216.34
本地DNS ──递归──> 客户端: 返回 IP, 并缓存结果
一次完整解析通常有多次往返,命中缓存则可大大缩短时间。
常用记录类型
| 记录类型 | 作用 |
|---|---|
| A | 域名 → IPv4 地址 |
| AAAA | 域名 → IPv6 地址 |
| CNAME | 域名 → 另一个域名(别名),常指向 CDN 域名 |
| MX | 指定邮件服务器,附优先级 |
| NS | 指定该域名由哪个权威服务器解析 |
| TXT | 任意文本,常用于域名归属验证与 SPF 反垃圾邮件 |
配置 CDN 的常见做法:把业务域名 CNAME 到 CDN 厂商提供的域名,由厂商按地域智能调度到就近节点。
缓存与 TTL
解析结果会被本地 DNS、浏览器、操作系统逐级缓存,每条记录带 TTL(生存时间):
- TTL 短:修改后生效快,但权威服务器查询压力大;
- TTL 长:解析快、压力小,但域名迁移后旧 IP 会在缓存中滞留。
排查经验:改了 DNS 不生效,先看是否命中本地或运营商缓存(可用 ipconfig /flushdns 或 nslookup 指定公共 DNS 验证)。
小结:DNS 是一棵分布式域名树加一套缓存体系。掌握"域名层级、递归与迭代查询、A/CNAME/MX 等记录、TTL 缓存"四个要点,再动手敲几次 nslookup/dig,域名解析问题就不再神秘。