DNS(Domain Name System,域名系统)
Definition
DNS(Domain Name System,域名系统) 是 RFC 1034 / RFC 1035 规范定义的因特网核心应用层协议与分布式数据库架构,负责将主机名(FQDN)解析为 IP 地址及其他网络资源记录。
它规定 / 它负责:
- 域名空间树管理:维护以根节点
.为顶点的层次化树状域名结构。 - 解析契约规范:通过报文首部标志位
RD与RA规定“递归查询”与“迭代查询”两种标准的解析交互模式。 - 资源记录定义:统一定义 Resource Record (RR) 格式(包括 A、AAAA、CNAME、NS、MX、TXT、PTR、SOA 等类型及 TTL 缓存生存时间)。
简单理解:
DNS 建立在 RFC 1034/1035 标准之上,通过标志位控制递归与迭代解析契约;在缓存未命中时,Recursive Resolver 可能通过多次独立查询获得 Referral,最终完成主机名到 IP 的解析。
系统位置 / RFC 1034 标准交互架构
根据 RFC 1034 Section 5.3.3 算法规范,DNS 解析由 Recursive Resolver 驱动,结合本地缓存与对根、TLD、权威 DNS 服务器的迭代 Referral(指路)完成。
架构逻辑数据流图 (Graph TD)
graph TD A[Application<br/>getaddrinfo] --> B[Stub Resolver] B -->|DNS Query UDP 53| C[Recursive Resolver] C --> D{Cache?} D -->|Hit| E[Return Cached IP] D -->|Miss| F[Root DNS Server] F -->|Referral: TLD NS| G[TLD DNS Server] G -->|Referral: Auth NS| H[Authoritative DNS Server] H -->|Answer: Target A IP| C C -->|Store TTL Cache| I[DNS Cache] C -->|Response| B B --> J[Application Receives IP]
协议交互时序图 (Sequence Diagram)
sequenceDiagram participant C as Client<br/>(Stub Resolver) participant R as Recursive Resolver participant Root as Root DNS Server participant TLD as TLD Server participant Auth as Authoritative DNS Server C->>R: Query Target A Record<br/>RD=1 alt Cache Hit R-->>C: DNS Response<br/>IP + TTL else Cache Miss R->>Root: Query Target A Record<br/>RD=0 Root-->>R: Referral TLD NS R->>TLD: Query Target A Record TLD-->>R: Referral Auth NS R->>Auth: Query Target A Record Auth-->>R: Answer Target A IP 93.184.216.34 R->>R: Cache Result TTL R-->>C: DNS Response<br/>IP + TTL end
核心内容(RFC 1034 / 1035 标准规范)
RFC 1034 标准解析模式(Resolution Modes)
RFC 1034 严格通过 DNS 报文 Header 中的 RD (Recursion Desired) 与 RA (Recursion Available) 标志位规定了两种解析模式:
递归查询 (Recursive Query: RD=1; RA 为响应位)
- 协议行为:客户端在查询中设置
RD=1,表示希望服务器代为完成递归解析。服务器在响应中通过RA=1表示自身支持递归;支持递归且接受该请求时,服务器会代替客户端向其他服务器查询,再返回最终答案或错误。 - 适用组件:终端 Stub Resolver 向 Recursive Resolver (本地 DNS) 请求时使用。
迭代/非递归查询 (Iterative / Non-recursive Query: RD=0)
- 协议行为:发起者(Recursive Resolver)发送
RD=0。服务器若没有直接答案,绝不代替发起者向其他服务器发包(无节点间传递),而是直接向 Recursive Resolver 返回一个 Referral(指路响应):- 在 Authority Section 包含下一级
NS记录; - 在 Additional Section 包含该 NS 对应的
A记录(称为 Glue Records / 粘合记录)。
- 在 Authority Section 包含下一级
- 发起者行为:Recursive Resolver 收到 Referral 后,更新本地
SLIST,由 Recursive Resolver 亲自向新的 IP 发起下一次独立 UDP 往返。不存在任何“上游服务器内部串行传递与原路回流”。 - 适用组件:Recursive Resolver 向 根 / TLD / 权威服务器 发起查询时使用。
域名空间与资源记录(Resource Records - RR)
在计算机网络理论模型中,一个 资源记录 (RR) 是一个 四元组 (4-tuple):
四元组字段含义与 Type 对应关系
- Name 与 Value 的含义由 Type 决定:
- Type = A:
Name为主机名,Value为对应的 IPv4 地址(例如(relay1.bar.foo.com, 145.37.93.126, A, 86400))。 - Type = AAAA:
Name为主机名,Value为对应的 IPv6 地址。 - Type = NS:
Name为域名,Value为能够解析该域名的 权威 DNS 服务器的主机名(例如(foo.com, dns.foo.com, NS, 86400))。 - Type = CNAME:
Name为别名,Value为 规范主机名 (Canonical Name)(例如(foo.com, host1.foo.com, CNAME, 86400))。 - Type = MX:
Name为域名,Value为关联的 邮件服务器的规范主机名。 - Type = TXT:
Name为域名,Value为任意文本字符串(用于 SPF 邮件防伪、DKIM 签名与域名所有权验证)。 - Type = PTR:
Name为反向 IP 域名(如in-addr.arpa),Value为对应的规范主机名(用于 IP 反向域名解析)。 - Type = SOA (Start of Authority):
Name为域名,Value为包含主 DNS 主机名、管理员邮箱、序列号 Serial 及主从同步 refresh/retry/expire 时间参数的权威起始记录。
- Type = A:
- TTL:该资源记录的生存时间(以秒为单位)。
二进制报文物理格式 (RFC 1035 Wire Format)
在真实 UDP 报文传输中,上述四元组包含 6 个物理字段(Value 映射为 RDATA):
+---------------------------------------------------------------+
| NAME : 域名 (支持指针压缩 0xC00C) |
| TYPE : 记录类型 (1=A, 28=AAAA, 5=CNAME, 2=NS, 15=MX) |
| CLASS : 协议类 (1=IN, Internet) |
| TTL : 生存时间 (32 位无符号整数,单位:秒) |
| RDLENGTH : 资源数据字节长度 (RDATA 的长度) |
| RDATA : 资源数据 (即四元组中的 Value,如 4 字节 IPv4 地址) |
+---------------------------------------------------------------+- FQDN(完全合格域名):以根节点
.结尾的绝对域名(如www.baidu.com.)。
DNS 报文格式 (DNS Header & Wire Format - RFC 1035)
DNS 查询通常优先使用 UDP 53 端口。512 字节是传统 DNS UDP 报文的默认上限;启用 EDNS0 后,发送方可以声明更大的 UDP 有效载荷。如果响应因传输限制被截断而设置 TC=1,解析器通常会改用 TCP 53 端口重试;具体行为还取决于传输方式和实现。
12 字节固定头部 (packet-beta)
packet-beta 0-15: "Transaction ID" 16-31: "Flags" 32-47: "QDCOUNT" 48-63: "ANCOUNT" 64-79: "NSCOUNT" 80-95: "ARCOUNT"
16 位 Flags 标志位拆解 (packet-beta)
packet-beta 0: "QR" 1-4: "Opcode" 5: "AA" 6: "TC" 7: "RD" 8: "RA" 9-11: "Z" 12-15: "RCODE"
标志位字段含义表
- QR:
0为 Query(查询),1为 Response(响应)。 - AA:Authoritative Answer,
1表示该响应来自权威服务器。 - TC:Truncation,
1表示响应被截断;这通常意味着当前传输载荷空间不足,并不等同于所有情况下都超过 512 字节。 - RD / RA:递归查询控制位(见上文)。
- RCODE:
0为 NoError,3为 NXDOMAIN(域名不存在)。
DNS 安全机制与缺陷(DNS Security)
- DNS 缓存污染与欺骗 (DNS Spoofing / Poisoning):
- 原理:攻击者在 Resolver 等待权威响应时,尝试并发发送大量伪造响应包。若攻击者猜中了 Transaction ID 和随机 UDP 源端口,假的响应就会被写入 Resolver 缓存,将后续用户引导至恶意 IP。
- DNSSEC (DNS Security Extensions - RFC 4033):
- 原理:基于公钥密码学对 DNS 资源记录集(RRset)进行数字签名。引入
DNSKEY(公钥)与RRSIG(数字签名)等新 RR 类型,形成由根域下发的信任链,确保 DNS 数据来源可靠且未经篡改。
- 原理:基于公钥密码学对 DNS 资源记录集(RRset)进行数字签名。引入
DNS TTL vs 网络层 IP Header TTL(本质对比)
| 维度 | DNS TTL (RFC 1035) | IP Header TTL (RFC 791) |
|---|---|---|
| 所属协议层 | 应用层(DNS Resource Record 字段) | 网络层(IPv4 Header 8-bit 字段) |
| 单位与含义 | 时间秒数(Seconds) | 跳数(Hops) (路由器每过一跳减 1) |
| 控制目标 | 控制解析记录在 Resolver 缓存中的有效存活时间 | 控制 IP 数据包在 网络传输中最多允许经过的路由器数 |
| 减零动作 | 缓存失效,重新发起 DNS 查询 | 路由器直接丢弃并回发 ICMP Time Exceeded |
| 命名演进 | - | 在 IPv6 中已更名为 Hop Limit |
现代工程扩展与实践(补充说明)
以下为现代网络工程在 RFC 1034/1035 基础上的扩展与优化:
- 缓存工程控制:
- TTL 递减:Recursive Resolver 给客户端响应时发送的是剩余 TTL 秒数。
- Min/Max TTL 截断:避免极小或极大的 TTL 干扰缓存。
- Serve-Stale(RFC 8767):上游故障时,降级使用过期旧缓存响应,保障可用性;配合 HTTPS/TLS 证书验证防止身份伪装。
- 现代传输与安全:
- EDNS0 (RFC 6891):将 UDP 报文上限从 512 字节扩展至 4096 字节。
- DoT (RFC 7858) / DoH (RFC 8484):基于 TLS/HTTPS 传输 DNS,防范明文 DNS 污染与窥探。
- 实操诊断工具:
dig +trace <domain>:在终端跟踪从根服务器开始逐级输出迭代指路 (Referral) 的全过程。nslookup/host:常规 DNS 命令行解析诊断工具。
Summary
标准 RFC 1034/1035 确立了以域名空间树为基础、通过 Header 中的
RD/RA标志位划分“递归/迭代”解析契约的 DNS 标准规范;Stub Resolver 通常发起递归查询,Recursive Resolver 在缓存未命中时自行向不同 Name Server 发起后续查询并处理 Referral,不依赖 Root、TLD 与权威服务器之间转发请求;DNSSEC 与 DoH/DoT 分别提供数据来源验证和传输保密等扩展能力。