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预解析