DNS解析:递归查询与迭代查询详解
DNS 查询主要分为两种核心模式:递归查询 和 迭代查询。它们在解析过程中责任归属和交互方式上存在显著差异。
1. 递归查询 (Recursive Query)
- 核心概念: 客户端(如你的电脑、手机上的浏览器或操作系统)向它的本地 DNS 服务器(通常由你的 ISP 提供或你手动配置的公共 DNS 服务器如 8.8.8.8)发出的查询。
- 责任归属: 客户端将解析域名的全部责任委托给本地 DNS 服务器。
- 过程:
- 客户端向本地 DNS 服务器发送一个查询请求:
“请告诉我 www.example.com 的 IP 地址,无论你需要做什么,请把最终答案给我(IP地址或明确的错误信息),不要只给我一个其他服务器的地址。”
- 本地 DNS 服务器收到这个递归查询请求后,必须承担起完成整个解析过程的责任。
- 如果本地 DNS 服务器没有缓存答案,它会代表客户端自己去向 DNS 层级结构中的其他服务器(根 DNS、顶级域 DNS、权威 DNS)发起后续查询(通常是迭代查询,见下文)。
- 本地 DNS 服务器最终会找到权威 DNS 服务器并获得 www.example.com 的 IP 地址。
- 本地 DNS 服务器将最终的答案(IP地址)或明确的错误信息返回给客户端。
- 客户端向本地 DNS 服务器发送一个查询请求:
- 关键特点:
- 客户端只需问一次,得到一个最终答案(成功或失败)。
- 本地 DNS 服务器承担了所有繁重的工作(查询其他服务器、处理重定向、聚合结果)。
- 对客户端来说最简单、负担最轻。
- 类比: 你(客户端)问图书管理员(本地 DNS 服务器):“请把《百年孤独》这本书拿给我。” 管理员会自己去书库查找,最终要么把书交给你,要么告诉你“书已借出”或“没有这本书”。你不需要知道管理员具体去了哪个书架。
2. 迭代查询 (Iterative Query / Non-Recursive Query)
- 核心概念: DNS 服务器之间(主要是本地 DNS 服务器在代表客户端解析时,向层级更高的 DNS 服务器发出的查询)使用的查询方式。
- 责任归属: 被查询的 DNS 服务器只提供它能给出的最佳答案,通常是:
- 最终答案(如果它正好是权威服务器或缓存了答案)。
- 或者,一个指向更接近目标权威 DNS 服务器的推荐(Referral)(例如,指向负责
.com
域的顶级域服务器列表)。 - 它不会代替查询者去问下一个服务器。
- 过程:
- 当本地 DNS 服务器(代表客户端)需要解析 www.example.com 时,它首先查询一个根 DNS 服务器。
- 根 DNS 服务器收到查询后,发现是
.com
域,它不会自己去问.com
服务器,而是回复本地 DNS 服务器:“我不知道 www.example.com 的 IP,但我知道负责.com
域的顶级域(TLD)服务器有哪些,它们的地址是 [TLD Server IPs]。” - 本地 DNS 服务器拿到这个推荐后,自己再选择其中一个 TLD 服务器(.com)发起查询:“请告诉我 www.example.com 的 IP 地址。”
- TLD 服务器(.com)收到查询,发现
example.com
域是由一组特定的权威 DNS 服务器负责,它也不会自己去问这些权威服务器,而是回复本地 DNS 服务器:“我不知道 www.example.com 的具体 IP,但我知道负责example.com
域的权威 DNS 服务器有哪些,它们的地址是 [Authoritative Server IPs]。” - 本地 DNS 服务器拿到这个新的推荐后,自己再选择其中一个权威 DNS 服务器发起查询。
- 权威 DNS 服务器收到
www.example.com
的查询,因为它拥有该域名的记录,所以它会回复本地 DNS 服务器最终答案:“www.example.com 的 IP 地址是 X.X.X.X”
。 - 本地 DNS 服务器收到最终答案后,将其缓存,并回复最初发出递归查询的客户端。
- 关键特点:
- 查询者(通常是本地 DNS 服务器)需要根据收到的“推荐”,自己去联系下一个 DNS 服务器。
- 被查询的服务器只回答自己知道的(答案或推荐),不代劳。
- 解析责任分散在整个 DNS 层级结构中。
- 对查询者(本地 DNS 服务器)来说负担较重(需要发起多次查询)。
- 类比: 这次你(现在是本地 DNS 服务器)在图书馆(DNS 层级)里自己找书。你问前台(根服务器):“《百年孤独》在哪?” 前台说:“西班牙语文学在 8 楼,去问那里的管理员。” 你上到 8 楼问管理员(TLD 服务器):“《百年孤独》在哪?” 管理员说:“加西亚·马尔克斯的书在 805 书架。” 你走到 805 书架(权威服务器),终于找到了《百年孤独》(IP 地址)。每一步你都需要自己走到下一个地点去问。
总结与协作:
- 递归查询:
客户端 -> 本地 DNS 服务器
(“给我最终答案!”) - 迭代查询:
本地 DNS 服务器 -> 根/TLD/权威 DNS 服务器
(“告诉我你能回答的最好结果(答案或下一步问谁)”) - 典型解析流程:
- 客户端向本地 DNS 服务器发起递归查询。
- 本地 DNS 服务器接受递归查询请求,承担解析责任。
- 本地 DNS 服务器向根 DNS 服务器发起迭代查询。
- 根 DNS 服务器回复推荐(指向 TLD 服务器)。
- 本地 DNS 服务器向 TLD 服务器发起迭代查询。
- TLD 服务器回复推荐(指向权威服务器)。
- 本地 DNS 服务器向权威 DNS 服务器发起迭代查询。
- 权威 DNS 服务器回复最终答案(IP 地址)。
- 本地 DNS 服务器将最终答案回复给客户端(完成递归查询)。
理解这两种模式对于弄清楚 DNS 域名解析的底层机制、性能优化(缓存)、以及排查 DNS 相关问题至关重要。简单来说,递归是“帮我搞定一切”,迭代是“告诉我下一步该找谁”。