递归与迭代的分工
域名解析里有两套问答方式。递归查询是客户端把活整个交给解析器:客户端只问一次,解析器负责逐级追问并把最终答案带回来。迭代查询则是被问方只回答「下一步该问谁」,由提问者自己去追。真实链路里两者是叠加使用的:客户端到本地递归器用递归,递归器到根、顶级域、权威服务器逐级都用迭代。理解这个分工,才能看懂 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 # 从根开始自己走完整条迭代链路输出逐列读法
| 标志或字段 | 含义 | 实践意义 |
|---|---|---|
| RD | Recursion Desired,请求方是否要递归 | 客户端默认置 1,排查时用它确认谁在递归 |
| RA | Recursion Available,服务器是否提供递归 | 为 0 说明对方是权威或不对外开放递归 |
| AA | Authoritative Answer,是否权威回答 | 判断这个答案到底出自权威还是缓存 |
| TC | Truncated,响应被截断 | 为 1 时会改用 TCP 重试,UDP 大包常见 |
| status | NOERROR、NXDOMAIN、SERVFAIL、REFUSED | REFUSED 表示对方拒绝为你递归,SERVFAIL 要往上游查 |
对外开放递归会被人拿去做放大攻击:小请求换大响应,被利用来淹没第三方。提供递归服务的解析器必须配 ACL,只允许内网与授权来源查询。
排查解析异常时,先分清「谁答的」比追问原因更重要:AA 为 1 说明答案来自权威,RA 为 1 说明你在问一个递归器。看错这一层,后面所有推论都会错。