DNS 解析原理:当你在浏览器输入网址后发生了什么?

你在浏览器输入 www.example.com 并按下回车,到页面加载出来,中间发生了无数次 DNS 查询。这个过程只需要几百毫秒,但涉及的步骤远比想象中复杂。这篇文章从根服务器开始,把 DNS 的层级结构、递归查询、缓存机制拆开讲清楚。

一、DNS 是什么?

DNS(Domain Name System,域名系统)是互联网的电话簿。它的核心功能是将人类可读的域名(如 www.example.com)转换为机器可读的 IP 地址(如 93.184.216.34)。

没有 DNS,你需要记住每个网站的 IP 地址——就像要记住所有人的电话号码一样不现实。

二、DNS 的层级结构

DNS 是一个分层的分布式数据库,从根开始逐级向下:

. (根域)
├── .com (顶级域)
│ └── example.com (二级域/权威域)
│ └── www.example.com (主机记录)
├── .org
├── .cn
│ └── .com.cn
└── ...

2.1 根服务器(Root Servers)

全球有 13 组根服务器(由 A 到 M 标识),由不同机构运营。它们不存储具体的域名记录,但知道所有顶级域(TLD)服务器的地址。

2.2 顶级域服务器(TLD Servers)

每个顶级域(如 .com.org.cn)都有自己的权威服务器。它们知道该 TLD 下每个二级域名的权威 DNS 服务器地址。

2.3 权威 DNS 服务器

每个域名所有者指定的 DNS 服务器,存储该域名的实际记录(A 记录、CNAME 等)。最终决定域名的解析结果。

2.4 本地递归 DNS(Local Recursive DNS)

由网络运营商或公共 DNS(如 114.114.114.114)提供,负责替用户完成从根到权威的完整查询过程,并缓存结果。

三、完整的 DNS 查询过程

当你在浏览器访问 www.example.com 时,以下步骤发生:

  1. 本地缓存检查:先检查浏览器缓存、操作系统 hosts 文件、本地 DNS 缓存。如果命中,直接返回 IP,查询结束。

  2. 查询本地递归 DNS:如果没有命中,系统向配置的本地 DNS 服务器(如运营商的 DNS 或 8.8.8.8)发起查询。

  3. 根服务器查询:本地 DNS 向根服务器询问 .com 在哪,根服务器返回 .com 的顶级域服务器列表。

  4. 顶级域服务器查询:本地 DNS 向 .com TLD 服务器询问 example.com 的权威 DNS 服务器地址。

  5. 权威 DNS 查询:本地 DNS 向 example.com 的权威 DNS 服务器询问 www.example.com 的具体 IP。

  6. 返回结果并缓存:权威 DNS 返回 A 记录(IPv4 地址)或 AAAA 记录(IPv6 地址),本地 DNS 缓存该结果,返回给浏览器。

四、DNS 记录类型

记录类型 用途 示例
A IPv4 地址 193.0.0.1
AAAA IPv6 地址 2001:db8::1
CNAME 别名(指向另一个域名) www.example.com → example.com
MX 邮件交换记录(邮件服务器地址) mail.example.com
NS 权威 DNS 服务器地址 ns1.example.com
TXT 文本记录(常用于验证、SPF) v=spf1 include:_spf.example.com
SOA 区域授权记录 存储区域管理信息

五、DNS 缓存机制

DNS 缓存是提高解析速度的关键。所有 DNS 服务器和客户端都会缓存解析结果,缓存时间由域名的 TTL 控制。

TTL(Time to Live):以秒为单位,告诉 DNS 服务器可以缓存该记录多长时间。在 TTL 过期前,服务器不会再次发起权威查询。

5.1 查询 TTL 的方法

# dig 查询
dig www.example.com +ttlid

# nslookup 查询
nslookup -type=any www.example.com

六、常见的 DNS 问题

6.1 DNS 解析失败

现象:浏览器报“无法找到服务器”或 DNS_PROBE_FINISHED_NXDOMAIN。

可能原因:

  • 域名不存在或已过期
  • 本地 DNS 服务器不可用
  • hosts 文件配置错误
  • 网络未连接或 DNS 服务器被污染

基础排查:

# 查看当前使用的 DNS
cat /etc/resolv.conf

# 用 114.114.114.114 直接解析测试
nslookup example.com 114.114.114.114

# 清空本地 DNS 缓存
sudo systemd-resolve --flush-caches

6.2 解析结果不正确

现象:域名解析到的 IP 地址不是预期的服务器。

可能原因:

  • 本地 DNS 缓存了旧记录(TTL 未过期)
  • DNS 劫持或污染
  • hosts 文件手动覆盖了记录
  • 权威 DNS 配置变更未生效

解决方式:手动刷新本地缓存、使用 ipconfig /flushdns(Windows)或 sudo dscacheutil -flushcache(macOS),或临时更换公共 DNS 测试。

6.3 DNS 污染与劫持

某些地区或运营商可能会对特定域名的解析结果进行篡改。使用公共 DNS(如 114.114.114.114、8.8.8.8)或支持 DNSSEC 的解析器可以缓解部分问题。

七、常用 DNS 工具

7.1 dig(Linux/macOS)

# 基础查询
dig example.com

# 查询 A 和 AAAA
dig example.com A AAAA

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

# 指定 DNS 服务器
dig @8.8.8.8 example.com

7.2 nslookup

# 基础查询
nslookup example.com

# 查询 MX 记录
nslookup -type=MX example.com

# 指定 DNS 服务器
nslookup example.com 114.114.114.114

7.3 ping

# ping 会先解析域名再发送 ICMP
ping example.com

八、总结

DNS 是互联网运行的基础设施之一。理解它的分层结构和解析流程,可以更好地排查访问异常、配置域名和优化网络。

对于配置了多个子域名或需要频繁查看解析记录的场景,可以使用一些在线 DNS 查询工具(如通过网页进行 dig 查询)辅助验证。

本文仅作技术分享,相关命令在不同操作系统下可能略有差异。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐