DNS:域名解析与地址管理
DNS 递归查询与迭代查询
- 递归查询:客户端要求 DNS 服务器给出最终答案。
- 迭代查询:服务器告诉查询方下一步应询问谁。
通常客户端向本地 DNS 发起递归查询,本地 DNS 再通过迭代查询联系根、顶级域和权威 DNS。
DNS 记录
| 记录 | 作用 |
|---|
| A | 域名指向 IPv4 地址 |
| AAAA | 域名指向 IPv6 地址 |
| CNAME | 域名指向另一个域名 |
| NS | 指定权威 DNS 服务器 |
| TXT | 存储文本验证信息 |
DNS 缓存由 TTL 控制。TTL 太短会增加查询压力,太长会使故障切换和发布生效变慢。
DNS 与 IP 地址的对应关系
DNS 的核心作用,是把便于人类记忆的域名解析成网络通信使用的 IP 地址:
https://www.example.com/path
│
└─ DNS 查询 www.example.com
│
├─ A → 93.184.216.34
└─ AAAA → 2606:2800:220:1:248:1893:25c8:1946
浏览器访问网站时,URL 中的域名会先经过 DNS 解析得到 IPv4 或 IPv6 地址,然后客户端才能使用这个地址建立 TCP/TLS 连接并发送 HTTP 请求。DNS 只负责“名称到地址”的解析,不负责传输 HTTP 数据。
常见对应关系
- 一个域名可以对应多个 IP:例如通过 DNS 轮询、CDN 或多地域部署返回多个地址,用于负载均衡、就近接入和故障切换。
- 多个域名可以对应同一个 IP:多个站点可以部署在同一台服务器、负载均衡器或 CDN 节点上,服务器再根据请求中的
Host 或 SNI 区分具体站点。
- 域名也可以先对应另一个域名:
CNAME 不直接保存 IP,而是指向另一个域名,解析器继续查询目标域名的 A 或 AAAA 记录。
- 域名不一定永久对应同一个 IP:DNS 记录可以随着 CDN 调度、扩容、迁移或故障切换发生变化,客户端和 DNS 服务器会按照 TTL 缓存解析结果。
因此,DNS 与 IP 不是“一对一且永久不变”的关系,而是由 DNS 记录描述的可缓存映射关系:
域名 ──A/AAAA──> 一个或多个 IP
域名 ──CNAME───> 另一个域名 ──A/AAAA──> 一个或多个 IP
域名解析与 TCP 连接的关系
以访问 https://api.example.com 为例:
- 浏览器从 URL 中提取主机名
api.example.com。
- 先查询浏览器、操作系统和 DNS 服务的缓存。
- 如果没有可用缓存,通过 DNS 获取
A 或 AAAA 记录。
- 选择一个可用 IP 地址,使用目标 IP 和端口建立 TCP 连接。
- 如果是 HTTPS,再在连接上进行 TLS 握手,最后发送 HTTP 请求。
这里要注意:TCP 连接使用的是 IP 地址 + 端口,不是域名;但 HTTP 请求的 Host,以及 HTTPS 握手中的 SNI,仍然会携带域名信息,用于在同一 IP 上选择正确的站点和证书。
高频追问
- DNS 劫持和污染有什么区别?
- CDN 如何通过 DNS 把用户调度到就近节点?
- DNS 缓存和浏览器 HTTP 缓存有什么区别?