首页/网络/协议速查/递归查询与迭代查询
DNS 与域名解析60 条

递归查询与迭代查询

递归=客户端把活全交给解析器(RD=1);迭代=被问方只给「下一步该问谁」的提示,由提问者自己追。根与 TLD 只做迭代。

协议速查网络更新于 2026-10-13

递归与迭代的分工

域名解析里有两套问答方式。递归查询是客户端把活整个交给解析器:客户端只问一次,解析器负责逐级追问并把最终答案带回来。迭代查询则是被问方只回答「下一步该问谁」,由提问者自己去追。真实链路里两者是叠加使用的:客户端到本地递归器用递归,递归器到根、顶级域、权威服务器逐级都用迭代。理解这个分工,才能看懂 dig 输出里谁在替你干活。

基本信息

递归查询RD 标志置 1,解析器负责追问到底并返回最终结果
迭代查询只返回 NS 委派或 CNAME 等线索,由提问者继续追问
调用方向客户端到递归器用递归;递归器到根与顶级域与权威用迭代
根与顶级域只做迭代,不提供递归服务
默认行为dig 默认 RD=1,做迭代演示需显式加 +norecurse

观察两种模式

观察两种模式
dig +norecurse @a.root-servers.net com NS      # 迭代:根只告诉你 com 的 NS 是谁
dig @8.8.8.8 www.example.com                    # 递归:默认 RD=1,一步拿到最终答案
dig +norecurse @8.8.8.8 www.example.com         # 对公共递归器关掉 RD,通常得到空答案或 REFUSED
dig +trace www.example.com                      # 从根开始自己走完整条迭代链路

输出逐列读法

标志或字段含义实践意义
RDRecursion Desired,请求方是否要递归客户端默认置 1,排查时用它确认谁在递归
RARecursion Available,服务器是否提供递归为 0 说明对方是权威或不对外开放递归
AAAuthoritative Answer,是否权威回答判断这个答案到底出自权威还是缓存
TCTruncated,响应被截断为 1 时会改用 TCP 重试,UDP 大包常见
statusNOERROR、NXDOMAIN、SERVFAIL、REFUSEDREFUSED 表示对方拒绝为你递归,SERVFAIL 要往上游查
对外开放递归会被人拿去做放大攻击:小请求换大响应,被利用来淹没第三方。提供递归服务的解析器必须配 ACL,只允许内网与授权来源查询。
排查解析异常时,先分清「谁答的」比追问原因更重要:AA 为 1 说明答案来自权威,RA 为 1 说明你在问一个递归器。看错这一层,后面所有推论都会错。

易错点

  • dig 默认 RD=1,用它做迭代链路演示会得出错误结论,必须显式加 +norecurse 才能看到委派线索
  • 对外网开放递归又没做来源限制,解析器会成为反射放大攻击的帮凶,同时被拉进黑名单
  • 把 REFUSED 当成域名不存在:REFUSED 是服务器拒绝为你递归,NXDOMAIN 才是这个域名确实没有记录
  • 只在一台递归器上验证解析结果,忽略了不同递归器缓存与策略差异,导致结论无法复现

数据来源与参考

  • RFC 1034 §2.3
  • RFC 1035

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌