一、DNS 是什么

DNS(Domain Name System,域名系统)是互联网的"电话簿"。它将人类可读的域名(如 www.example.com) 翻译成机器可识别的 IP 地址(如 93.184.216.34)。 DNS 工作在 OSI 模型的应用层,默认使用 UDP 53 端口(当响应数据超过 512 字节或进行区域传送时使用 TCP 53)。

💡 为什么需要 DNS?

IP 地址是 32 位(IPv4)或 128 位(IPv6)的数字,人类很难记忆。域名使用有意义的英文单词组成,方便记忆。DNS 就是在中间做翻译:你输入域名,DNS 告诉你对应的 IP。

二、DNS 层次结构

DNS 采用树状层次结构,从根域名开始逐级向下:

DNS 层次命名空间结构 根域名 . (root) .com 顶级域名 (TLD) .org 顶级域名 (TLD) .cn 国家代码 (ccTLD) example.com google.com wikipedia.org baidu.cn taobao.cn www.example.com shop.taobao.cn 从根域名 → 顶级域名 → 二级域名 → 子域名,逐级向下查找
图 1 — DNS 层次命名空间:根域名(.)→ TLD(.com/.org/.cn)→ 二级域名 → 子域名

域名层级说明

层级示例说明
根域名.树的顶端,全球 13 组根域名服务器(A-M),通常省略不写
顶级域名 TLD.com .cn分为 gTLD(通用:.com .org .net)和 ccTLD(国家:.cn .us .jp)
二级域名example.com由组织注册的域名,是用户可注册的最小单位
子域名www.example.com二级域名下的子域,可自由创建

三、DNS 解析流程

当你在浏览器输入 www.example.com 时,DNS 解析的完整流程如下:

DNS 解析完整流程 浏览器 www.example.com ① 检查本地缓存 浏览器 DNS 缓存 ② 检查系统缓存 OS DNS 缓存 ③ 查询本地 DNS 递归解析器 (ISP/公共DNS) 有缓存? 是 → 返回 IP 地址 ④ 迭代查询(本地 DNS 服务器代为执行) 根 DNS 返回 .com TLD 服务器地址 .com TLD 返回 example.com 权威 DNS 地址 权威 DNS 返回 www 的 A 记录 IP 地址 93.184. 216.34 ⑤ 本地 DNS 将结果缓存(按 TTL)并返回给浏览器 ⑥ 浏览器使用该 IP 地址建立 TCP 连接,发起 HTTP 请求
图 2 — DNS 解析流程:先查各级缓存,未命中后由本地 DNS 服务器执行迭代查询

递归查询 vs 迭代查询

💡 区分两种查询模式

递归查询:客户端 → 本地 DNS 服务器。客户端问"帮我查到结果",本地 DNS 负责查到最终答案再返回。
迭代查询:本地 DNS 服务器 → 根/TLD/权威 DNS。每一步被问的服务器只返回"下一步去问谁",不负责查到最终结果。

四、DNS 报文结构

DNS 报文使用 UDP 传输,格式分为头部和正文两部分。头部固定 12 字节,包含查询和响应的元信息:

DNS 报文结构 Header(头部,固定 12 字节) Transaction ID (16) Flags (16 bit): QR | Opcode | AA | TC | RD | RA | RCODE QDCOUNT: 1 ANCOUNT: 1 NSCOUNT: 0 ARCOUNT: 0 查询数 / 回答数 / 权威数 / 附加数 Question Section(查询区) QNAME: www.example.com | QTYPE: A | QCLASS: IN 查询名 + 查询类型 + 查询类 Answer Section(回答区 - 响应报文才有) NAME: www.example.com | TYPE: A | CLASS: IN TTL: 3600 | RDLENGTH: 4 | RDATA: 93.184.216.34 Authority Section(权威区) NS 记录(可选) Additional Section(附加区) 额外记录(可选) Flags 说明: QR(查询/响应) RD(期望递归) RA(递归可用) RCODE(响应码, 0=无错误)
图 3 — DNS 报文结构:头部 + 查询区 + 回答区 + 权威区 + 附加区

五、常见 DNS 记录类型

类型全称说明示例
AAddress域名 → IPv4 地址example.com → 93.184.216.34
AAAAIPv6 Address域名 → IPv6 地址example.com → 2606:2800:220:1::
CNAMECanonical Name域名别名,指向另一个域名www.example.com → example.com
MXMail Exchange邮件服务器地址(含优先级)example.com → mail.example.com (优先级 10)
NSName Server域名的权威 DNS 服务器example.com → ns1.example.com
TXTText文本记录(SPF、域名验证等)v=spf1 include:_spf.google.com ~all
SOAStart of Authority区域授权信息(主DNS、管理员邮箱、序列号等)每个区域必须有一条 SOA 记录
SRVService服务记录(指定服务的端口和主机)_sip._tcp.example.com → 5060
PTRPointerIP → 域名(反向解析)34.216.184.93.in-addr.arpa → www.example.com

六、DNS 查询实操

# 使用 dig 查询 A 记录
dig www.example.com A

# 使用 dig 查询指定类型的记录
dig example.com MX
dig example.com NS
dig example.com TXT

# 使用 dig 追踪完整解析路径
dig +trace www.example.com

# 使用 dig 指定 DNS 服务器查询
dig @8.8.8.8 www.example.com

# 使用 nslookup(Windows/macOS 自带)
nslookup www.example.com
nslookup -type=MX example.com

# 查看 DNS 缓存(Linux)
# systemd-resolve --status    # systemd-resolved
# 或查看 /etc/resolv.conf 确认配置的 DNS 服务器
cat /etc/resolv.conf
# 实际查询输出示例
$ dig www.example.com

;; QUESTION SECTION:
;www.example.com.           IN  A

;; ANSWER SECTION:
www.example.com.    3600    IN  A   93.184.216.34

;; Query time: 23 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; TTL: 3600 (1小时后缓存过期)
⚠️ DNS 缓存与 TTL

每一层 DNS 缓存(浏览器、操作系统、本地 DNS 服务器)都会根据记录的 TTL(Time To Live)值决定缓存保留时间。TTL 过期前不会重新查询。这就是为什么修改 DNS 记录后,全球生效需要等待 TTL 过期 — 修改 DNS 前建议先降低 TTL。

七、DNS 安全扩展

传统 DNS 使用明文传输,存在被劫持和篡改的风险。常见的 DNS 安全方案:

方案解决的问题说明
DNSSECDNS 篡改对 DNS 记录进行数字签名,验证响应的真实性和完整性
DoHDNS 窃听DNS over HTTPS,将 DNS 查询封装在 HTTPS 中加密传输
DoTDNS 窃听DNS over TLS,使用 TLS 加密 DNS 查询,端口 853
DoQDNS 窃听 + 延迟DNS over QUIC,基于 QUIC 协议,更低的连接延迟
✅ 总结

DNS 是互联网最基础的服务之一,理解 DNS 解析流程对于排查"域名打不开""CDN 调度异常""邮件发送失败"等问题至关重要。核心知识点:层次结构(根→TLD→权威)、两种查询模式(递归 vs 迭代)、缓存机制(多级缓存 + TTL)、常见记录类型(A/CNAME/MX/NS/TXT)。日常工作中 dignslookup 是最常用的 DNS 排查工具。