递归是一种服务角色
递归 DNS 解析器承担的是替请求者完成查询的角色。客户端通常把请求交给一个配置好的解析服务,由它继续寻找答案,而不是要求应用程序逐级联系整个域名系统。存根解析器一般把复杂解析工作交给上游;权威服务器则负责回答自己掌握的区域数据。这些是职责划分,不要求每一种角色都由独立机器实现。
递归请求的含义是请接收方完成解析,而非仅告知下一站。DNS 报文中的 RD 位表达请求递归,RA 位表示服务器提供递归能力;设置 RD 并不能迫使一个不提供该服务的服务器代劳。与之相对,迭代查询允许返回委派,让查询方自行联系另一个权威服务器。递归解析器正可以通过多次这样的交互,为客户端完成一次递归请求。
参考:[1]
沿委派寻找答案
以查找 www.example.net 的地址为例,若没有可用缓存,完整服务解析器可从已知的根服务器信息开始。根区提供通往 .net 区域的委派,.net 再提供 example.net 区域的权威服务器信息,解析器随后向相应服务器询问目标记录。委派给的是继续查询的方向,并不等于根服务器储存了所有网站地址。
RFC 1034 描述的解析过程先检查本地信息,再选取已知的、与目标名称最接近的服务器。收到委派后更新候选服务器,收到可用答案后返回并缓存;遇到别名则可能继续追踪其目标,服务器失败时也可能改问其他候选。因此,逐级经过根区只是说明委派结构的例子,不是每次查询固定重复的路径。
缓存减少查询,不提供永久承诺
缓存既可保存最终答案,也可保存以后寻找权威服务器所需的信息。如果目标记录仍在有效期内,解析器通常能够直接回答;即使没有目标答案,也可能已经知道其所在区域的权威服务器,不必再问根区。一次查询的实际网络往返取决于已有信息,而不只取决于域名包含几级标签。
资源记录的 TTL 以秒表示可缓存的最长时间,解析器可以按策略缩短保留时间。它不是承诺到期时全球同时刷新,也不表示权威端修改记录后旧缓存会立即获知。普通缓存处理需要跟踪剩余有效期,数据到期后的使用还受相应缓存策略和扩展规则约束。缓存解决的是重复查询成本与数据时效的平衡,不能凭 TTL 判断内容是否可信。
验证与信任策略的边界
启用验证的解析器可以使用 DNSSEC 检查资源记录集签名,并从配置的信任锚沿 DNSKEY、DS 等记录建立认证链。签名覆盖 DNS 数据,而不是因为回复来自某台服务器就自动信任它。一个经过认证的未签名委派,与本应验证成功却签名无效的响应,也属于不同情况。
DNSSEC 验证不负责加密查询内容,更不证明域名经营者的现实信誉或网页安全。客户端到解析器之间是否保密、解析器采用哪些信任锚、是否按本地政策过滤答案,属于另外的配置与信任关系。若客户端把验证工作委托给解析器,就还需要信任该服务及取得结果的途径;不能把一次返回地址的成功查询当作这些条件全部得到满足。
参考:[3]