DNS 解析与缓存

深入理解 DNS 解析的完整流程、浏览器对 DNS 解析的缓存机制,以及 Preload DNS 的使用场景。


DNS 是什么

DNS(Domain Name System)是互联网的电话簿,把域名翻译成 IP 地址。

example.com → 93.184.216.34

当你访问 example.com 时,浏览器需要知道它的 IP 地址才能建立连接。


DNS 解析的完整流程

1. 浏览器 DNS 缓存

浏览器首先检查自己的 DNS 缓存:

// 检查是否有缓存的 DNS 记录
// Chrome 默认缓存 60 秒

2. 操作系统 DNS 缓存

如果没有浏览器缓存,检查操作系统缓存。

3. 读取本地 hosts 文件

Linux/Mac: /etc/hosts

127.0.0.1 localhost

4. 查询 DNS 服务器

如果以上都没有,向配置的 DNS 服务器发起查询:

  • 通常是 ISP(运营商)提供的 DNS
  • 或公共 DNS:Google (8.8.8.8)、Cloudflare (1.1.1.1)

5. 递归查询

DNS 服务器经过多级查询:

浏览器 → 根服务器 (.com)
       → .com 域服务器
       → example.com 权威服务器
       → 返回 IP 地址

DNS 缓存时间

DNS 记录有 TTL(Time To Live)值,告诉缓存应该保存多久:

example.com. 300 IN A 93.184.216.34
              ↑
              TTL = 300 秒

DNS 服务器会缓存到 TTL 过期。


DNS 预解析(Preconnect)

link rel="dns-prefetch"

<!-- 提前解析第三方域名 DNS -->
<link rel="dns-prefetch" href="https://cdn.example.com">

link rel="preconnect"

<!-- 更进一步:提前完成 TCP 握手、TLS 握手 -->
<link rel="preconnect" href="https://cdn.example.com">

实际应用场景

字体加载优化

Google Fonts 需要从 fonts.googleapis.com 加载:

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="..." rel="stylesheet">

第三方 API 预解析

<link rel="dns-prefetch" href="https://api.stripe.com">

这一章想说的

DNS 解析是网络请求的第一步,通常需要 10-100ms。

优化方法:

  • 减少域名数量(合并请求)
  • 使用 DNS 缓存(浏览器、CDN)
  • 关键域名用 preconnect 预连接
  • 关键域名用 dns-prefetch 预解析

延展阅读