548 字
2 分钟
DNS 协议详解:域名系统的分层架构与缓存策略
当你在浏览器输入 www.example.com 并按下回车,页面并非直接连接到某个 IP 地址。在 TCP 连接建立之前,浏览器必须先通过 DNS 将域名解析为 IP 地址。这个看似简单的步骤,背后涉及根服务器、TLD 服务器、权威服务器的多层协作,以及递归解析器、缓存、安全验证等复杂机制。一次 DNS 解析的延迟可能高达数百毫秒,直接影响页面的首屏加载时间。理解 DNS 的工作原理,是优化 Web 性能和排查网络问题的必备基础。
一、DNS 系统概述
1. DNS 记录类型
| 类型 | 用途 | 典型值 |
|---|---|---|
| A | IPv4 地址 | 1.2.3.4 |
| AAAA | IPv6 地址 | 2001:db8::1 |
| CNAME | 别名 | www.example.com |
| MX | 邮件服务器 | mail.example.com |
| TXT | 验证记录 | v=spf1 include:_spf.example.com ~all |
2. DNS 分层结构
graph TB
A["根服务器 (.)<br/>13 个 IP 地址"] --> B[".com TLD 服务器"]
A --> C[".cn TLD 服务器"]
A --> D[".org TLD 服务器"]
B --> E["example.com 权威 DNS"]
B --> F["google.com 权威 DNS"]
E --> G["api.example.com"]
E --> H["www.example.com"]
二、递归查询与迭代查询
1. 完整解析流程
sequenceDiagram
participant C as 客户端
participant L as Local DNS<br/>(递归解析器)
participant R as Root DNS
participant T as TLD DNS<br/>(.com)
participant A as 权威 DNS<br/>(example.com)
C->>L: 查询 www.example.com
Note over L: 检查缓存
alt 缓存命中
L-->>C: 返回缓存结果
else 缓存未命中
L->>R: 迭代查询 www.example.com
R-->>L: 返回 .com TLD 服务器地址
L->>T: 迭代查询 www.example.com
T-->>L: 返回 example.com 权威服务器地址
L->>A: 迭代查询 www.example.com
A-->>L: 返回 IP 地址 + TTL
Note over L: 缓存结果 (TTL 秒)
L-->>C: 返回 IP 地址
end
2. 递归解析器配置
# 常用公共 DNS 递归解析器resolvers = [ "8.8.8.8", # Google DNS "1.1.1.1", # Cloudflare DNS "223.5.5.5", # 阿里 DNS "119.29.29.29", # 腾讯 DNS]三、DNSSEC
1. 签名验证链
flowchart TB
subgraph TrustAnchor["信任锚点"]
Root["Root DNSKEY<br/>(信任锚点)"]
end
subgraph Chain["签名链"]
Root -->|DS 记录签名| TLD[".com DS 记录"]
TLD -->|验证| TLDKey[".com DNSKEY"]
TLDKey -->|DS 记录签名| Domain["example.com DS 记录"]
Domain -->|验证| DomainKey["example.com DNSKEY"]
DomainKey -->|RRSIG 签名| Records["A/AAAA/MX 记录"]
end
subgraph Verification["验证过程"]
V1["1. 信任 Root DNSKEY"] --> V2["2. 用 Root DNSKEY 验证 .com DS"]
V2 --> V3["3. 用 .com DS 验证 .com DNSKEY"]
V3 --> V4["4. 验证域名 DS -> DNSKEY -> RRSIG"]
end
2. DNSSEC 记录类型
| 类型 | 用途 | 说明 |
|---|---|---|
| DNSKEY | 区域公钥 | 用于验证 RRSIG 签名 |
| RRSIG | 记录签名 | 对 DNS 记录的数字签名 |
| DS | 委托签名者 | 建立父子域间的信任链 |
| NSEC | 否认存在证明 | 证明某记录不存在 |
| NSEC3 | 否认存在证明 | NSEC 的哈希版本,防遍历 |
3. 验证命令
# DNSKEY 记录验证dig DNSKEY cloudflare.com +dnssec
# 完整 DNSSEC 验证链dig www.cloudflare.com +dnssec +multiline四、DoH 与 DoT 加密
1. DoH 配置
# DNS-over-HTTPShttps://cloudflare-dns.com/dns-queryAccept: application/dns-json2. Python 查询示例
import httpx
# DoH 查询response = httpx.get( "https://cloudflare-dns.com/dns-query", params={"name": "example.com", "type": "A"})五、TTL 与缓存
1. DNS 缓存层次
flowchart LR
subgraph Client["客户端缓存"]
C1["浏览器缓存<br/>~60s"]
C2["操作系统缓存<br/>TTL 或覆盖"]
end
subgraph Network["网络缓存"]
N1["Local DNS<br/>严格遵循 TTL"]
N2["中间代理<br/>可能忽略 TTL"]
end
subgraph Auth["权威服务器"]
A1["不缓存<br/>实时响应"]
end
C1 --> C2 --> N1 --> N2 --> A1
2. TTL 策略建议
| 场景 | TTL 建议 | 说明 |
|---|---|---|
| 静态资源 CDN | 86400+ | 很少变更 |
| A/AAAA 记录 | 3600 | 平衡更新速度与性能 |
| API 端点 | 60-300 | 需要快速切换 |
| CNAME | 取决于目标 | 跟随目标记录 TTL |
| MX 记录 | 3600+ | 邮件服务稳定优先 |
| TXT (SPF/DKIM) | 3600 | 反垃圾邮件配置 |
3. 缓存穿透防护
# NXDOMAIN (域名不存在) 也要缓存# 防止恶意查询导致 DNS 放大攻击negative_cache_ttl = 300 # 5 分钟
# 缓存策略def query_dns(domain: str) -> Optional[str]: # 1. 检查本地缓存 cached = cache.get(domain) if cached and not cached.expired: return cached.value
# 2. 发起查询 result = dns_query(domain)
# 3. 缓存结果 (包括 NXDOMAIN) cache.set(domain, result, ttl=result.ttl or negative_cache_ttl)
return result六、负载均衡与健康检查
1. DNS RR 负载均衡
# 轮询 A 记录ips = ["1.1.1.1", "2.2.2.2"]# 返回随机 IP七、总结
DNS 是互联网基石,DoH/DoT 保护隐私,DNSSEC 保护安全。理解 DNS 的分层架构、缓存策略和安全扩展,是构建高性能、高安全 Web 应用的基础。
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
DNS 协议详解:域名系统的分层架构与缓存策略
https://blog.souloss.com/posts/web/web-dns-protocol/ 部分信息可能已经过时
相关文章 智能推荐
1
DNS域名系统:互联网的电话簿
互联网运作 从 /etc/hosts 到分布式命名,DNS 如何将人类可读的域名翻译成 IP 地址?层次结构、递归与迭代查询、记录类型、报文格式、DNSSEC 与 DoH/DoT 安全增强——理解互联网最关键的基础设施之一。
2
容器网络
容器运行时 容器网络的核心问题是——隔离的 Network Namespace 如何与外部通信?详细解读 veth pair(虚拟网卡对)、bridge(虚拟网桥)、iptables/NAT(地址转换)、CNI(容器网络接口)的完整链路,以及 Docker 的四种网络模式和 Kubernetes 的 Pod 网络模型——从「容器能 ping 通外网」到「理解每一条网络规则」。
3
BGP与域间路由:互联网的外交系统
互联网运作 数据包跨组织转发靠什么?自治系统概念、BGP会话建立与路由通告、AS_PATH/LOCAL_PREF/MED等选路属性、策略路由与路由过滤——一个跨AS数据包转发的完整追踪。
4
WebRTC:实时通信协议详解
网络 深入解析 WebRTC 协议的架构、工作原理和应用场景
5
为什么 DNS 使用 UDP 协议
技术科普 深入解析 DNS 协议为什么主要使用 UDP,以及什么时候会切换到 TCP,DNS 协议设计的精妙之处。






