网络基础12 分钟阅读更新于 2026-07-29

DNS 递归查询和迭代查询:一次域名解析到底问了谁

围绕DNS 解析过程,拆清浏览器、本地 DNS、根 DNS、顶级域 DNS 和权威 DNS 在一次解析中分别做什么。

相关工具

先把角色分清楚

递归查询和迭代查询之所以容易混,是因为很多教程只讲定义,不讲谁在问谁。放到一次真实解析里,角色其实很清楚:浏览器想要最终 IP,本地 DNS 负责帮它查,根 DNS 和顶级域 DNS多数时候只提供下一站线索,权威 DNS 才保存具体域名和 IP 的映射。

文中的 DNS 解析过程从缓存开始:先查浏览器缓存,再查本机 Hosts 文件;如果都没有,就向本地 DNS 发送查询。本地 DNS 有缓存就直接返回,没有缓存才继续问根 DNS、顶级域 DNS 和权威 DNS。这个顺序比单纯背“递归”“迭代”更有用。

所以这篇只抓一条主线:浏览器问本地 DNS 时,更像递归查询;本地 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 返回的两类答案图,对比下一站地址和最终 IP
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 很常见。

计算机网络

继续阅读

返回专题