什么是 DNS?一次域名解析背后到底发生了什么
每次在浏览器地址栏里敲下一个域名,比如 example.com,回车之后页面就打开了。这个过程看起来毫无感觉,但背后其实跑了一整套查询流程,涉及好几台不同的服务器接力配合。这篇文章打算把这套流程拆开讲清楚,不涉及具体某个厂商的产品,纯粹是网络基础知识的梳理。
为什么需要 DNS
计算机之间通信,最终依赖的是 IP 地址,比如 93.184.216.34 这种数字。但让人去记一串数字显然不现实,于是就有了域名系统(Domain Name System,简称 DNS):它把好记的域名和不好记的 IP 地址做了一层映射,功能上类似于一本巨大的电话簿——你查的是名字,翻出来的是号码。
如果没有 DNS,互联网并不是不能用,只是每次访问一个网站都得手动敲 IP,换了服务器地址还得重新记,体验会非常糟糕。
严格来说,域名只是网址的一部分。https://example.com/path 里,example.com 才是域名,https:// 是协议,/path 是路径。DNS 只负责解析域名部分。
域名的层级结构
域名是从右往左分层的,越靠右级别越高:
www . example . com .
| | | |
第三级 第二级 顶级 根
- 根域:写全了其实是最后那个隐藏的点,日常不会去敲它
- 顶级域(TLD):比如
.com、.org、.cn,由专门的注册局管理 - 二级域:比如
example,通常是你注册下来的那部分 - 子域:比如
www、mail、blog,二级域名之下可以再切分出无数个子域
每一层都有对应的服务器知道”下一层该去哪查”,这也是整套查询体系能够逐级往下走的原因。
一次完整的查询流程
假设你在浏览器里访问一个从没访问过的域名,本地没有任何缓存,流程大致是这样的:
- 浏览器 / 操作系统查本地缓存:先看看之前是不是查过这个域名,如果缓存还没过期,直接用缓存结果,流程到此结束。
- 询问递归解析器(Recursive Resolver):如果本地没有缓存,请求会发给你网络里配置的 DNS 服务器,这台服务器通常由你的运营商或者你自己手动指定。它的工作是代替你去”跑腿”,把最终结果拿回来给你。
- 递归解析器问根域名服务器:全球一共有十三组根服务器(以逻辑分组计,实际节点远不止十三台),它们不知道具体域名对应的 IP,但知道
.com、.org这些顶级域该去哪个服务器问。 - 再问顶级域名服务器:顶级域服务器同样不知道最终答案,但它知道
example.com这个域名的权威服务器是谁,会把地址告诉递归解析器。 - 最后问权威域名服务器(Authoritative Server):这台服务器才是真正”拥有”这条记录的地方,通常由域名的持有者或者其使用的 DNS 服务商来维护。它会给出最终答案,比如这个域名对应的 A 记录。
- 结果一路返回:递归解析器拿到答案后,会缓存起来(方便下次同一个域名的查询直接命中),同时把结果返回给你的设备。
这个过程里,从根到顶级域再到权威服务器的查询链条,叫做”迭代查询”;而你的设备只问了递归解析器一次,剩下的活全是递归解析器帮你跑的,这部分叫”递归查询”。两个词经常被放在一起讲,其实说的是查询链条里不同参与方的行为方式。
上面写了五六个步骤,但实际生活中大部分域名早就被无数人查过,各级服务器上大概率都有缓存,真正走完整条链路的情况反而是少数,所以日常打开网页很少能感觉到这个过程的存在。
常见的记录类型
权威服务器上存的东西叫”资源记录”,常见的几种:
| 记录类型 | 作用 |
|---|---|
| A | 域名指向一个 IPv4 地址 |
| AAAA | 域名指向一个 IPv6 地址 |
| CNAME | 域名指向另一个域名(别名) |
| MX | 指定这个域名的邮件服务器 |
| TXT | 存放任意文本,常用于域名归属验证、SPF 反垃圾邮件配置等 |
| NS | 指明这个域名由哪些服务器权威管理 |
日常自己折腾一个域名的时候,接触最多的基本就是 A、CNAME 和 TXT 这三种。
TTL 是什么
每条 DNS 记录都会带一个 TTL(Time To Live),单位是秒,表示这条记录在缓存里能存活多久。TTL 设得越长,查询效率越高(因为大家都在吃缓存),但一旦你需要修改记录(比如换了服务器 IP),生效速度就会变慢,因为全世界各处的缓存要等 TTL 到期才会去重新查询。
所以经验上的做法是:如果你知道近期要做变更,提前把 TTL 调低(比如从默认的几小时调到 5 分钟),等变更生效、确认没问题之后,再把 TTL 调回正常水平。
DNS 劫持和污染
日常上网时如果遇到明明输入的是正确网址,打开的却是奇怪的导航页或者广告页,很可能就是 DNS 被劫持了。粗略分两种情况:
- 本地劫持:路由器或者设备本身的 DNS 设置被篡改,指向了一个会返回错误结果的服务器。检查路由器管理后台的 DNS 设置,改回正常的公共 DNS 通常能解决。
- 链路上的污染:查询请求在传输过程中被中间设备干扰,返回了错误的应答。这种情况相对麻烦,换用加密的查询方式会有帮助,比如后面要提到的 DNS over HTTPS。
公共 DNS 服务器
除了运营商自动分配的 DNS,也可以手动把设备的 DNS 改成一些知名的公共服务,常见的几个(按厂商,不代表推荐顺序):
- Cloudflare 的
1.1.1.1 - Google 的
8.8.8.8 - Quad9 的
9.9.9.9
选哪个更多是看延迟和个人偏好,没有绝对的”最优解”,实际使用时可以自己测一下从当前网络环境访问不同服务器的响应速度。
小结
DNS 这套系统其实设计得很朴素:分层管理、逐级委托、层层缓存。正是因为这套机制,域名系统才能在几十年里扛住互联网规模指数级的增长,还能维持住毫秒级的响应速度。下次输入网址等待页面加载的那零点几秒里,不妨想想这背后其实有一整条服务器链路刚刚为你跑了一圈。