Skip to content

DNS 域名解析原理与优化

📚 相关文档

一、DNS 的作用

DNS(Domain Name System) 将域名转换为 IP 地址,被称为"互联网的通讯录"。

核心价值

  • 📝 便于记忆www.baidu.com14.215.177.39 易记
  • 🔄 灵活迁移:服务器换 IP 只需修改 DNS 记录
  • ⚖️ 负载均衡:DNS 轮询分发流量
  • 🌍 地理就近:CDN 根据位置返回最近节点

二、DNS 查询层级

1. 完整查询流程

mermaid
graph TB
    A[浏览器缓存] -->|未命中| B[系统缓存]
    B -->|未命中| C[路由器缓存]
    C -->|未命中| D[ISP DNS]
    D -->|未命中| E[根域名服务器 .]
    E --> F[顶级域名 .com]
    F --> G[权威域名 example.com]
    G --> H[返回 IP]
    H --> I[逐级缓存]
    
    style A fill:#d4edda
    style H fill:#d4edda

查询特点

  • 递归查询:客户端 → ISP,ISP 负责完成所有后续查询
  • 迭代查询:ISP → 根 → 顶级 → 权威,逐级询问
  • 缓存机制:每级都缓存结果,减少重复查询

2. DNS 缓存层级

层级位置TTL说明
🥇 浏览器缓存内存~1 分钟Chrome: chrome://net-internals/#dns
🥈 系统缓存OS 内存根据 TTLWindows: ipconfig /flushdns
🥉 路由器缓存硬件几小时重启路由器可清除
🏅 ISP DNS运营商数小时~数天223.5.5.58.8.8.8
权威 DNS域名商-最终答案来源

常见公共 DNS

  • 阿里:223.5.5.5 / 223.6.6.6(国内最快)
  • 腾讯:119.29.29.29
  • Google:8.8.8.8 / 8.8.4.4
  • Cloudflare:1.1.1.1(隐私保护)

3. DNS 记录类型

记录类型作用示例应用场景
A域名 → IPv493.184.216.34网站解析
AAAA域名 → IPv62606:2800:...IPv6 兼容
CNAME别名指向cdn.example.comxxx.cloudfront.netCDN 接入
MX邮件服务器mail.example.com企业邮箱
NS权威服务器ns1.aliyun.com指定 DNS 服务商
TXT文本记录v=spf1...SPF、DKIM 验证

三、DNS 优化技术

1. DNS Prefetching(预获取)

提前解析跨域域名,避免使用时才查询。

html
<head>
  <link rel="dns-prefetch" href="//cdn.example.com">
  <link rel="dns-prefetch" href="//api.example.com">
</head>

效果:节省 20-100ms


2. Preconnect(预连接)

不仅解析 DNS,还建立 TCP + TLS 连接。

html
<link rel="preconnect" href="https://cdn.example.com">

三者对比

优化方式DNSTCPTLS发送请求
dns-prefetch
preconnect
prefetch

选择建议

  • 当前页资源 → preconnect
  • 下一页资源 → prefetch
  • 仅优化 DNS → dns-prefetch

3. CDN 与 DNS

CDN 核心是智能 DNS 解析

mermaid
graph TB
    A[用户查询 cdn.example.com] --> B[CDN 全局负载均衡]
    B --> C{判断位置}
    C -->|北京| D[返回北京节点 IP]
    C -->|上海| E[返回上海节点 IP]
    C -->|广州| F[返回广州节点 IP]
    D --> G[访问最近节点]
    E --> G
    F --> G
    
    style A fill:#e1f5ff
    style G fill:#d4edda

优势

  • 地理就近,降低延迟
  • 分担源站压力
  • 抗 DDOS 攻击

四、DNS 安全问题

1. DNS 劫持

攻击方式:篡改 DNS 响应,引导到恶意网站。

防御措施

  • ✅ 使用 HTTPS(证书验证会失败)
  • ✅ 使用可信 DNS(223.5.5.58.8.8.8
  • ✅ 启用 DNSSEC(数字签名验证)

检测劫持

bash
# 对比不同 DNS 的解析结果
nslookup www.example.com 223.5.5.5
nslookup www.example.com 8.8.8.8
# 如果结果不一致,可能被劫持 ⚠️

2. 加密 DNS

DoH(DNS over HTTPS)

  • Firefox/Chrome 设置中启用
  • 防止窃听和篡改

DoT(DNS over TLS)

  • Android 9+ 支持私人 DNS

五、性能监控

1. Performance API

javascript
// 监控 DNS 查询耗时
const navigation = performance.getEntriesByType('navigation')[0];
console.log('DNS 耗时:', 
  navigation.domainLookupEnd - navigation.domainLookupStart, 'ms'
);

2. Chrome DevTools

Network 面板 → Timing 标签页:

DNS Lookup        45ms  ← DNS 查询
Initial Connection 32ms  │ TCP 握手
SSL               28ms   │ TLS 握手
TTFB             120ms   │ 首字节时间

六、面试高频问题

Q1: DNS 查询的完整流程?

: 浏览器缓存 → 系统缓存 → 路由器缓存 → ISP DNS → 根域名服务器 → 顶级域名服务器 → 权威域名服务器 → 返回 IP 并逐级缓存。

关键点:

  • 前 4 级是缓存查询,后 3 级是递归查询
  • 每级都会缓存结果
  • 典型耗时:本地缓存 0ms,完整查询 50-200ms

Q2: 如何优化 DNS 解析速度?

  • 前端dns-prefetchpreconnect、减少域名分片
  • 运维:选择稳定 DNS 服务商、合理设置 TTL、使用 CDN
  • 用户:配置公共 DNS(223.5.5.58.8.8.8

Q3: DNS 劫持如何防御?

  • 使用 HTTPS:即使 DNS 被劫持,证书验证会失败
  • 使用可信 DNS:如 223.5.5.51.1.1.1
  • 启用 DNSSEC:数字签名验证
  • 使用 DoH/DoT:加密 DNS 查询

Q4: CDN 是如何工作的?

: CDN 核心是智能 DNS:

  1. 用户查询 cdn.example.com
  2. CDN 全局负载均衡根据用户 IP 判断地理位置
  3. 返回距离最近的 CDN 节点 IP
  4. 用户访问该节点,享受高速服务

七、总结记忆口诀

📞 DNS 就像查电话
📖 层层缓存效率高
🔍 递归迭代配合好
⚡ 预取预连速度快
🛡️ HTTPS 防劫持
🌍 CDN 就近解析

核心要点

  • 查询顺序:浏览器 → 系统 → 路由器 → ISP → 根 → 顶级 → 权威
  • 优化三板斧:dns-prefetchpreconnect、CDN
  • 安全第一:HTTPS、DoH、DNSSEC
最近更新