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时,以下步骤发生:
本地缓存检查:先检查浏览器缓存、操作系统 hosts 文件、本地 DNS 缓存。如果命中,直接返回 IP,查询结束。
查询本地递归 DNS:如果没有命中,系统向配置的本地 DNS 服务器(如运营商的 DNS 或
8.8.8.8)发起查询。根服务器查询:本地 DNS 向根服务器询问
.com在哪,根服务器返回.com的顶级域服务器列表。顶级域服务器查询:本地 DNS 向
.comTLD 服务器询问example.com的权威 DNS 服务器地址。权威 DNS 查询:本地 DNS 向
example.com的权威 DNS 服务器询问www.example.com的具体 IP。返回结果并缓存:权威 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 查询digwww.example.com +ttlid# nslookup 查询nslookup-type=any www.example.com六、常见的 DNS 问题
6.1 DNS 解析失败
现象:浏览器报“无法找到服务器”或 DNS_PROBE_FINISHED_NXDOMAIN。
可能原因:
- 域名不存在或已过期
- 本地 DNS 服务器不可用
- hosts 文件配置错误
- 网络未连接或 DNS 服务器被污染
基础排查:
# 查看当前使用的 DNScat/etc/resolv.conf# 用 114.114.114.114 直接解析测试nslookupexample.com114.114.114.114# 清空本地 DNS 缓存sudosystemd-resolve --flush-caches6.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)
# 基础查询digexample.com# 查询 A 和 AAAAdigexample.com A AAAA# 追踪完整解析路径digexample.com +trace# 指定 DNS 服务器dig@8.8.8.8 example.com7.2 nslookup
# 基础查询nslookupexample.com# 查询 MX 记录nslookup-type=MX example.com# 指定 DNS 服务器nslookupexample.com114.114.114.1147.3 ping
# ping 会先解析域名再发送 ICMPpingexample.com八、总结
DNS 是互联网运行的基础设施之一。理解它的分层结构和解析流程,可以更好地排查访问异常、配置域名和优化网络。
对于配置了多个子域名或需要频繁查看解析记录的场景,可以使用一些在线 DNS 查询工具(如通过网页进行 dig 查询)辅助验证。
本文仅作技术分享,相关命令在不同操作系统下可能略有差异。