DNS 递归查询和迭代查询:一次域名解析到底问了谁
围绕DNS 解析过程,拆清浏览器、本地 DNS、根 DNS、顶级域 DNS 和权威 DNS 在一次解析中分别做什么。
相关工具
先把角色分清楚
递归查询和迭代查询之所以容易混,是因为很多教程只讲定义,不讲谁在问谁。放到一次真实解析里,角色其实很清楚:浏览器想要最终 IP,本地 DNS 负责帮它查,根 DNS 和顶级域 DNS多数时候只提供下一站线索,权威 DNS 才保存具体域名和 IP 的映射。
文中的 DNS 解析过程从缓存开始:先查浏览器缓存,再查本机 Hosts 文件;如果都没有,就向本地 DNS 发送查询。本地 DNS 有缓存就直接返回,没有缓存才继续问根 DNS、顶级域 DNS 和权威 DNS。这个顺序比单纯背“递归”“迭代”更有用。
所以这篇只抓一条主线:浏览器问本地 DNS 时,更像递归查询;本地 DNS 去问上层 DNS 时,更像迭代查询。前者要最终答案,后者一步一步拿下一站地址。

浏览器只关心最终 IP,本地 DNS 才会继续向上层 DNS 逐级查询。
浏览器通常只发出一个问题
浏览器要访问一个域名时,它不想知道根 DNS 在哪,也不关心 `.com` 的顶级域 DNS 是谁。它的问题很简单:这个域名对应哪个 IP?如果浏览器缓存里有答案,就直接用;没有答案,就继续看 Hosts 文件;Hosts 也没有,再把问题交给本地 DNS。
从浏览器角度看,它把问题交出去后,只等一个最终结果。这个过程就很像递归查询:我问你,你帮我查到底,最后把答案给我。普通用户和应用程序通常只接触到这一层,所以会感觉 DNS 查询只是一次请求。
不过要注意,浏览器和操作系统之间的实现会因系统、浏览器和网络环境不同而有差别。教程里讲的重点不是某个客户端的实现细节,而是这个职责分工:客户端通常只要最终 IP,不负责逐级问完整个 DNS 层级。
本地 DNS 是真正跑腿的那一层
本地 DNS 收到查询后,会先看自己有没有缓存。如果以前查过这个域名,并且缓存还没过期,它可以直接把 IP 返回给浏览器。这样解析会很快,也能减少对上层 DNS 的重复请求。
如果本地 DNS 没有缓存,它就要继续往上问。先问根 DNS。根 DNS 一般不会直接告诉它 `example.com` 的 IP,而是告诉它:这个域名属于 `.com`,你应该去问 `.com` 顶级域 DNS。
接着本地 DNS 问顶级域 DNS。顶级域 DNS 也通常不返回最终 IP,而是告诉它:负责 `example.com` 的权威 DNS 在哪里。最后本地 DNS 再去问权威 DNS,权威 DNS 才返回域名对应的 IP。
迭代查询拿到的是线索,不一定是答案
迭代查询最容易被误解的点是“返回”。不是每一次返回都返回最终 IP。根 DNS 返回的是下一站,顶级域 DNS 返回的也是下一站,只有权威 DNS 才返回目标域名的解析结果。
可以把迭代查询想成问路。你先问门口保安,保安不带你到目的地,只告诉你去几号楼;你到几号楼再问前台,前台告诉你具体办公室;最后办公室的人才给你真正要的资料。每一步都有返回,但前几步返回的是线索。
资料 对迭代查询的描述也是这个意思:DNS 客户端向上层服务器发起查询,但不要求直接提供完整解析结果,而是询问更高级或下一步应该访问的 DNS 服务器地址,然后继续查询,直到拿到完整结果。

上级 DNS 常返回下一站地址,权威 DNS 才返回最终 IP。
递归查询适合客户端,迭代查询适合 DNS 服务器之间
文中有一句很好记:递归查询适合普通用户和客户端,迭代查询适用于 DNS 服务器之间的通信。原因很简单,普通客户端不应该理解整个 DNS 树,它只需要一个能连接服务器的 IP。复杂查询工作交给本地 DNS 更合适。
DNS 服务器之间用迭代查询,也更符合分布式系统的设计。每一层只负责自己知道的部分:根 DNS 知道顶级域 DNS,顶级域 DNS 知道权威 DNS,权威 DNS 知道具体域名记录。没有哪一层需要保存所有域名的最终 IP。
这也是 DNS 能支撑大规模互联网访问的原因之一。职责拆开之后,每层服务器的压力和维护范围都更可控;缓存再介入,常见域名也不需要每次都从根 DNS 问起。
缓存会让很多查询提前结束
真实解析过程不一定每次都完整走到权威 DNS。浏览器缓存命中,查询在浏览器就结束;Hosts 文件命中,查询在本机就结束;本地 DNS 缓存命中,根 DNS、顶级域 DNS 和权威 DNS 都不会被访问。
这解释了一个常见现象:修改域名解析后,有的人已经访问到新 IP,有的人还在访问旧 IP。原因可能不是代码部署不一致,而是不同位置的 DNS 缓存还没过期。浏览器、本地系统、本地 DNS、运营商 DNS,都可能暂时保留旧结果。
排查时不要只问“权威 DNS 记录是不是改了”。还要看本机查到什么、本地 DNS 查到什么、不同网络出口查到什么。DNS 问题很像水路,源头改了,不代表每条管道里的旧水都立刻消失。
面试和排查时怎么回答
如果面试问递归查询和迭代查询,可以先说区别,再放到流程里。递归查询是客户端只发一次请求,等待完整结果;迭代查询是查询方每次拿到下一站地址,再继续向下一级 DNS 查询。普通客户端到本地 DNS 更像递归,本地 DNS 到根 DNS、顶级域 DNS、权威 DNS 更像迭代。
如果排查问题,可以按缓存顺序看:浏览器缓存、Hosts、本地 DNS 缓存、权威 DNS 记录。不要跳过 Hosts 文件,它在本地环境里很常见,也很容易让域名指错 IP。也不要只看一个网络环境,不同运营商或公司网络使用的本地 DNS 可能不同。
记住这句话就够用:递归查询要最终答案,迭代查询要下一站线索。把这句话放回 DNS 解析链路里,很多概念就顺了。
常见问题
根 DNS 会直接返回网站 IP 吗?
通常不会。根 DNS 主要告诉本地 DNS 应该去问哪个顶级域 DNS,例如 `.com`、`.net` 对应的服务器。
权威 DNS 是做什么的?
权威 DNS 负责保存某个具体域名区域的解析记录。最终域名到 IP 的映射,通常由权威 DNS 返回。
为什么我本地查到的 IP 和别人不一样?
可能是缓存、不同本地 DNS、CDN 调度、运营商线路等因素导致的。同一个域名在不同网络下返回不同 IP 很常见。