第一次做 DNS 的题,我看到「本地域名服务器无缓存,用递归解析」,下意识以为「用户主机要自己一层层问根、问 .com、问权威」。
结果 2010(40) 告诉我:用户主机只发了一条请求,本地域名服务器也只发了一条。
因为「递归」的意思是「你帮我查到底,只把最终答案回给我」——请求方根本不用跑腿。这篇把递归和迭代这对最容易被混的概念一刀切开,并顺着一张查询流程图把全过程看明白。
〇、先花两分钟:DNS 是「互联网电话簿」
IP 地址像电话号码,域名像人名。人记不住 IP,所以需要一个「电话簿」把 www.baidu.com 翻译成 110.242.x.x。DNS(Domain Name System)干的就是这事。
域名空间是一棵倒置的树:
-
根(.)在最顶;
-
往下是顶级域 TLD(.com、.cn、.edu);
-
再往下是二级、三级(baidu.com、www.baidu.com);
-
每层由不同的域名服务器管辖。
一句话:DNS 把域名按层级、分给不同服务器去管,查询时从根往下一级级问。
图示:迭代查询下,本地域名服务器依次问 根 → .com → baidu.com → www.baidu.com,每级只返回「下一步该问谁」,最后拿到 IP
一、四类域名服务器
| 根域名服务器 | 返回顶级域服务器地址 | 全球 13 组根 |
| 顶级域(TLD)服务器 | 返回该域下权威服务器地址 | .com、.cn 的服务器 |
| 权威(授权)服务器 | 返回具体主机的 IP | baidu.com 自己的服务器 |
| 本地域名服务器 | 你电脑实际求助的对象(通常是运营商/DNS 提供商) | 114.114.114.114、8.8.8.8 |
二、递归查询 vs 迭代查询(核心)
这是全篇最关键的一对概念,记住「谁跑腿」就分得清:
-
递归查询(recursive):「请你帮我查到底,只把最终 IP 回给我。」请求方只发 1 条,剩下的逐级查询由被请求方代劳。
-
典型场景:主机 → 本地域名服务器,用递归(主机不想管中间过程)。
-
-
迭代查询(iterative):「我不知道,但我告诉你下一步该去问谁。」每级只返回一个「线索」,由请求方自己去问下一级。
-
典型场景:本地域名服务器 → 根/TLD/权威,用迭代(减轻上级负担)。
-
⚠️ 易错:「递归」不是「主机自己去问每一级」,恰恰相反——递归时主机最省事,只发一条;真正「自己一级级跑」的是迭代(由本地服务器跑)。
三、完整解析流程(以迭代为主)
实际部署几乎总是:主机到本地用递归,本地到各级用迭代。流程:
主机向本地域名服务器发递归请求:「解析 www.baidu.com」;
本地向根发迭代请求,根回:「去问 .com 服务器」;
本地向 .com 发迭代请求,.com 回:「去问 baidu.com 的权威服务器」;
本地向 baidu.com 权威发请求,权威回:「www.baidu.com 的 IP 是 x.x.x.x」;
本地把 IP 返回主机,并缓存一份备用。
四、缓存:少跑腿的关键
每次解析的结果(尤其 TLD/权威的地址、最终 IP)会被本地服务器缓存一段时间(按 TTL)。下次再查:
-
若缓存命中,直接返回,不再向上级发任何查询(这就是 2016(40)「最少 0 次」的来源);
-
TTL 过期才重新查。
⚠️ 易错:缓存可能让「最少查询次数」变成 0——题目问「最少」时一定要想到缓存命中。
五、真题拆解 1:递归时发几条(2010(40),答案 A)
本地域名服务器无缓存,采用递归方法解析另一网络某主机域名,用户主机、本地域名服务器发送的域名请求消息数分别为?
递归下:
-
用户主机只把请求交给本地服务器,发 1 条;
-
本地域名服务器在递归模式下,由它(或它的上游转发器)代查到底,向外也只发 1 条(剩下的由被请求方递归完成,不算「本地发出的请求」)。
答案:A(一条、一条)。
六、真题拆解 2:迭代查询最少/最多(2016(40),答案 C)
所有域名服务器均采用迭代查询。H4 访问 www.abc.xyz.com,服务器 201.1.1.1 完成解析可能发出 DNS 查询的最少和最多次数?
-
最少 0 次:若 201.1.1.1 本地已有缓存,直接返回,无需任何外部查询;
-
最多 4 次:根、.com、.xyz.com、abc.xyz.com 四级各迭代一次(返回下一步线索),共 4 次。
答案:C(0,4)。
七、真题拆解 3:耗时(2020(40),答案 D)
本地域名服务器只提供递归、其他只提供迭代;RTT=10ms。从点击超链接到收到纯文本页面,最短/最长时间?
解析阶段:本地递归 + 上级迭代。最短可缓存命中(极少 RTT),最长需逐级迭代若干 RTT;再叠加后续 HTTP 传输。综合得最短 20ms、最长 50ms。
答案:D(20ms,50ms)(解析 + 传输联合推算,详见 HTTP 篇)。
八、17 年真题考在哪
| 2010(40) | 递归解析下用户/本地各发几条请求 | A(一条、一条) |
| 2016(40) | 全迭代时查询最少/最多次数 | C(0,4) |
| 2020(40) | 本地递归+上级迭代的解析耗时 | D(20ms,50ms) |
命题规律:①「递归 vs 迭代谁跑腿」年年考;②「最少 0 次」几乎必考缓存;③综合题常把 DNS 解析时间和 HTTP 传输时间绑在一起算(2020、2022 都是这种)。
九、易错点清单
| 递归 = 主机自己一级级问 | 错,递归时主机只发 1 条,由对方查到底 |
| 迭代 = 别人替你查完 | 错,迭代时每级只给线索,由本地自己跑下一跳 |
| 查询最少次数至少 1 | 错,缓存命中可 0 次 |
| 根服务器直接返回最终 IP | 错,根只返回 TLD 地址,一级级往下 |
| 本地服务器管具体主机 IP | 错,最终 IP 由权威服务器给,本地只是中转+缓存 |
| DNS 是网络层协议 | 错,DNS 是应用层,用 UDP(查询) |
速查表(文末收藏版)
DNS = 域名 → IP 的电话簿,应用层,查询走 UDP
域名树:根 . → 顶级(.com/.cn) → 权威(baidu.com) → 主机
递归查询:请你查到底,只回最终答案 → 请求方只发 1 条
迭代查询:每级只回"下一步问谁" → 本地自己一级级跑
实际部署:主机→本地(递归),本地→各级(迭代)
完整流程:本地 → 根 → TLD → 权威 → 拿 IP → 回主机 + 缓存
最少查询 0 次(缓存命中);最多 = 域名层级数(迭代)
真题:2010(40) 一条一条;2016(40) 0/4;2020(40) 20/50ms
本文依据:谢希仁《计算机网络(第 8 版)》第 6 章 6.4;真题年份题号来自 zhenti_all.json(2009–2025 计网 no 33–40)。


