mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
548 字
2 分钟
DNS 协议详解:域名系统的分层架构与缓存策略
2024-07-24

当你在浏览器输入 www.example.com 并按下回车,页面并非直接连接到某个 IP 地址。在 TCP 连接建立之前,浏览器必须先通过 DNS 将域名解析为 IP 地址。这个看似简单的步骤,背后涉及根服务器、TLD 服务器、权威服务器的多层协作,以及递归解析器、缓存、安全验证等复杂机制。一次 DNS 解析的延迟可能高达数百毫秒,直接影响页面的首屏加载时间。理解 DNS 的工作原理,是优化 Web 性能和排查网络问题的必备基础。

一、DNS 系统概述#

1. DNS 记录类型#

类型用途典型值
AIPv4 地址1.2.3.4
AAAAIPv6 地址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-HTTPS
https://cloudflare-dns.com/dns-query
Accept: application/dns-json

2. 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 建议说明
静态资源 CDN86400+很少变更
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/
作者
Souloss
发布于
2024-07-24
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时