外观
DNS 查询是怎么走的?
DNS 把域名解析成 IP。浏览器先看自己的缓存和操作系统缓存,再问配置好的递归解析器。递归解析器从根域名服务器找到顶级域,再找到权威服务器,把结果交回来并按 TTL 缓存。
原理
一次没缓存的查询大致是:
- 浏览器缓存、操作系统缓存、hosts。
- 递归解析器(通常是运营商或公共 DNS)。
- 根服务器返回顶级域(如
.com)的地址。 - 顶级域服务器返回这个域名的权威服务器。
- 权威服务器返回 A 或 AAAA 记录。
TTL 决定缓存能用多久。改 DNS 之后,旧记录要等 TTL 过期,所以迁移要提前把 TTL 调短。
DNS 历史上跑在 UDP 上。响应太大或要 DNSSEC 时会退到 TCP。浏览器和系统现在也使用加密的 DNS(DoH、DoT),本机抓包不一定还能看到明文查询。
页面预连接 preconnect 可以提前做 DNS 和 TCP/TLS,但只对确定会用到的源使用。
追问
A 记录和 CNAME 呢?
A 指向 IPv4,AAAA 指向 IPv6。CNAME 是别名,还要再解析一次目标。CDN 常用 CNAME 把你的域名指到服务商的域名。
DNS 劫持是什么?
解析结果被换成攻击者的 IP,用户连上了假的服务器。HTTPS 的证书校验能发现「这个 IP 拿不出该域名的证书」。只做 HTTP 时,劫持后的页面可以被换掉。
易错点
- 说每次请求都从根服务器查起。缓存命中就停。
- 把 DNS 和 HTTP 重定向混在一起。一个改的是 IP,一个改的是 URL。
- 改完 DNS 立刻认为全世界生效。TTL 和各级缓存都要过。