DNS 是什么:域名为什么要解析成 IP
围绕DNS 章节,讲清楚 DNS 的作用、域名层级、解析流程、缓存位置,以及递归查询和迭代查询的区别。
相关工具
DNS 解决的是“好记”和“能通信”的矛盾
人喜欢记域名,机器通信要用 IP。你能记住 `www.baidu.com`,但不太可能每天记一串数字 IP;操作系统发送网络包时,又不能只拿着域名出门,它需要知道目标服务器的 IP 地址。DNS 做的事,就是把域名转换成 IP。
文中对 DNS 的定义很直接:DNS 是 Domain Name System,用来把域名转换成 IP 地址的分布式系统。这里有两个词要抓住,一个是“转换”,一个是“分布式”。转换好理解,域名查 IP;分布式更重要,因为全世界的域名数量太多,访问量太大,不可能靠一台服务器扛住。
所以 DNS 不是浏览器里一个小功能,而是一套层级化的查询系统。浏览器输入 URL 后,真正建立连接之前,要先通过 DNS 找到目标服务器 IP。没有这个 IP,后面的 TCP、HTTP、HTTPS 都无从开始。

DNS 查询会先看本地缓存,再逐级找到能给出最终 IP 的权威 DNS。
为什么 DNS 不能设计成一台中心服务器
如果把所有域名解析都交给一台中心 DNS 服务器,理论上很简单,现实里根本撑不住。文中列了几个问题:单点故障、通信容量、远距离访问和维护成本。
单点故障最容易理解。中心服务器一旦崩溃,整个网络的域名解析都会受影响。通信容量也不现实,全网 DNS 查询量可能是百万、千万甚至更高,一个中心节点很难处理。距离也会带来延迟,比如所有人都去访问远在另一个大陆的 DNS 服务器,请求要经过更多链路,响应自然变慢。
维护也麻烦。域名和 IP 的映射每天都在变化,如果全靠一个中心库更新,成本和风险都会很高。分布式 DNS 的好处,是把责任拆开:不同层级、不同区域、不同域名由不同服务器负责,查询时再按层级找到目标。
域名是有层级的,越靠右层级越高
DNS 的层级关系藏在域名的点号里。以 `www.server.com` 为例,最右边的点可以理解为根域,`com` 是顶级域,`server` 是二级域,`www` 通常是具体主机名。文中提到,在域名中越靠右的位置,层级越高。
这个层级关系决定了 DNS 查询为什么能一步步往下找。根 DNS 不负责告诉你 `www.server.com` 的最终 IP,但它能告诉你应该去问哪个 `.com` 顶级域 DNS。顶级域 DNS 也不一定保存最终 IP,但它能告诉你负责 `server.com` 的权威 DNS 在哪里。权威 DNS 才真正保存特定域名和 IP 的映射关系。
把这个顺序记住,DNS 就不再是一团黑盒:先找最高层,再找下一层,最后找到真正负责这个域名的服务器。

点号不是装饰,它把域名拆成了可逐级查询的层次。
一次 DNS 解析通常从缓存开始
DNS 查询不会一上来就去问根 DNS。为了减少延迟和重复查询,浏览器、操作系统、Hosts 文件、本地 DNS 都可能保存解析结果。实际访问时,通常先查浏览器缓存;没有命中,再看本机 Hosts 文件;还没有,再把查询交给本地 DNS。
Hosts 文件可以手动写域名和 IP 的映射。本地环境里有时会用它把某个域名临时指向测试服务器。它的优先级通常比较靠前,所以如果 Hosts 配错了,浏览器访问域名时可能根本不会走正常 DNS 查询。
本地 DNS 一般由网络服务商、公司网络或公共 DNS 服务提供。它也会缓存结果。如果本地 DNS 已经有某个域名的解析记录,就可以直接返回 IP;没有缓存时,才继续向更上层 DNS 服务器查询。
本地 DNS 找不到时,会逐级往上问
当本地 DNS 没有缓存结果,它会先问根 DNS。根 DNS 不给最终 IP,而是告诉它应该去问哪个顶级域 DNS。比如域名以 `.com` 结尾,就去问 `.com` 顶级域 DNS。
顶级域 DNS 接着告诉本地 DNS:负责这个具体域名的权威 DNS 是谁。最后,本地 DNS 再去问权威 DNS。权威 DNS 查到域名对应的 IP 后,把结果返回给本地 DNS。本地 DNS 再把 IP 返回给浏览器,并把结果缓存起来,方便下次更快响应。
浏览器拿到 IP 后,才可以继续和目标服务器建立连接。上一篇讲“输入 URL 后发生什么”时,DNS 正好位于 URL 解析和 TCP 连接之间:它不负责传网页内容,只负责告诉你目标服务器在哪里。
递归查询和迭代查询不要混着背
DNS 里经常会问递归查询和迭代查询。文中的区分很清楚:递归查询中,DNS 客户端只发送一次查询请求,然后等待完整结果;迭代查询中,查询方每次只拿到下一站地址,再自己继续问下一级服务器。
普通用户更容易接触递归查询。比如浏览器把查询交给本地 DNS,它只等一个最终 IP,不关心本地 DNS 中间问了谁。对浏览器来说,这就是“你帮我查到底”。
DNS 服务器之间更常见迭代查询。本地 DNS 问根 DNS,根 DNS 说“去问 `.com`”;本地 DNS 再问 `.com` 顶级域 DNS,顶级域说“去问这个权威 DNS”;本地 DNS 最后问权威 DNS,拿到最终 IP。每一步只拿下一站,而不是一次拿完整答案。

递归查询像托人查到底,迭代查询像一步一步拿下一站地址。
DNS 出问题时,现象常常不像 DNS
DNS 问题不一定表现为“DNS 错误”。用户看到的可能是网页打不开、接口连不上、访问到了旧服务器、某个地区能访问另一个地区不能访问,或者刚切换域名解析后结果忽快忽慢。原因可能是缓存还没过期,也可能是不同网络使用的本地 DNS 不一样。
排查时可以按顺序看:域名是否拼错,浏览器缓存是否影响结果,Hosts 文件有没有写错,本地 DNS 返回的 IP 是否符合预期,权威 DNS 记录是否已经更新,TTL 是否导致旧记录还在缓存里。不要一上来就改服务器代码,DNS 还没解析到正确 IP 时,服务器根本收不到请求。
如果你在调接口,也可以把域名换成解析出的 IP 做对比,但要注意 HTTPS 证书通常绑定域名,直接访问 IP 可能会出现证书校验问题。这个现象不是服务器一定坏了,而是访问方式绕开了域名。
这篇先记住四句话
第一,DNS 的核心作用是把域名解析成 IP,域名方便人记,IP 方便机器通信。第二,DNS 是分布式系统,不是单台中心服务器,因为单点故障、访问量、距离和维护都会成为问题。
第三,域名有层级,越靠右层级越高;根 DNS、顶级域 DNS、权威 DNS 分工不同。第四,DNS 查询会充分利用缓存,递归查询面向“等最终答案”,迭代查询面向“拿下一站地址”。
把这四句话放回完整请求链路里,DNS 的位置就清楚了:浏览器已经知道要访问哪个域名,但还不知道目标 IP;DNS 给出 IP 后,TCP 和 HTTP 才能继续往下走。
常见问题
DNS 返回的是服务器的真实 IP 吗?
不一定。很多网站会接入 CDN 或负载均衡,DNS 返回的可能是离用户更近的节点 IP,或者某个调度入口。
修改 DNS 记录后为什么不是立刻生效?
因为浏览器、操作系统、本地 DNS 和中间 DNS 都可能缓存旧结果。TTL 越长,旧记录保留时间通常越久。
Hosts 文件和 DNS 是什么关系?
Hosts 文件是本机的静态域名映射,通常会在正式 DNS 查询前检查。它适合临时测试,但配错后会让域名指向错误 IP。