刺绣风互联网地图将持久的 DNS 否定分支与可恢复的代理路径清晰分开

域名解析失败并不是单一状态。权威服务器确认名称不存在,与解析器暂时超时或不可用,在应用层可能看起来相似;如果以相同方式缓存,短暂故障就可能被延长。加入代理后还要回答另一个问题:解析发生在本机、代理节点,还是上游解析器?

本指南提供一套可重复的恢复测试。其研究依据之一是 curl 于 2026 年 9 月 2 日发布的 8.22.0 版本说明,其中明确提到仅对权威回答产生的否定解析结果进行缓存。该方法同样适用于其他维护 DNS 或连接状态的 HTTP、SOCKS 客户端。

先定义四类结果

为每次请求明确分类:

  • 获得正向解析结果并尝试连接;
  • 获得符合解析策略的权威否定回答;
  • 发生临时解析失败、超时或解析器不可用;
  • 临时故障解除后成功恢复。

不要把所有解析错误都写成“DNS 挂了”。应记录结果类别、执行解析的组件、是否命中缓存,以及客户端是否真正开始网络连接。

确认解析责任边界

逐项记录各路径由谁解析:

  1. 本地解析的直连请求;
  2. 携带源站主机名的 HTTP 代理请求;
  3. 使用目标主机名的 HTTP CONNECT 隧道;
  4. 将主机名交给代理的 SOCKS 请求;
  5. 将本地已解析地址交给代理的请求。

具体行为取决于客户端和代理模式,必须用受控日志验证,不能根据出口 IP 猜测。远程解析和本地解析往往使用完全不同的缓存。

如需排除响应缓存干扰,可参考代理响应缓存隔离测试;需要提交问题时,可使用代理支持升级证据包指南

构建受控测试环境

使用组织自有的域名与解析环境,准备:

  • 指向已知地址的稳定主机名;
  • 明确返回权威否定回答的不存在主机名;
  • 可在测试解析器中临时延迟或失败的主机名;
  • 将临时主机名恢复为有效地址的步骤;
  • 一条直连路径和所有获准测试的代理路径。

目标端点只返回很小且确定的无害响应。保持请求方法、请求头、代理会话、目标和超时策略不变,每次只改变解析条件或路由。

采集必要证据

为每个案例分配编号并记录:

  • 时间戳和单调计时耗时;
  • 客户端与解析器版本;
  • 直连、HTTP 代理、CONNECT 或 SOCKS 路径;
  • 本地解析或代理侧解析;
  • 测试主机名和案例类别;
  • 解析结果类别,以及缓存命中或重新查询证据;
  • 连接开始时间、结果和目标类别;
  • 不含凭据的代理会话类别;
  • 重试次数和退避间隔。

禁止记录代理密码、API Token、Cookie、客户域名或完整生产数据。测试环境不应包含个人或机密信息。

建立基线

从干净的客户端和解析状态开始:

  1. 直连解析稳定主机名并确认连接成功。
  2. 通过每种代理模式重复,确认解析发生位置。
  3. 在有限时间窗内两次查询权威不存在主机名。
  4. 确认结果按既定解析策略保持为否定回答。
  5. 在测试解析器健康时查询临时主机名并确认成功。

这一步既验证测试环境,也能发现错误路由、旧地址或掩盖 DNS 查询的连接复用。

注入临时故障并验证恢复

只让受控解析路径临时不可用或延迟,不要干扰公共基础设施。

  1. 使用新连接请求临时主机名。
  2. 确认结果被标记为临时失败,而非权威否定。
  3. 恢复解析器及有效记录。
  4. 按应用正常的有限退避策略重试。
  5. 要求客户端重新查询,并在无需重启无关组件的情况下连接成功。
  6. 分别使用相同代理会话和新会话重复。
  7. 分别覆盖本地解析和代理侧解析模式。

验收标准很清楚:临时失败不能形成持久负缓存,从而在解析器恢复后继续阻断请求。权威否定回答只能按预期的客户端和解析器策略缓存。

将 DNS 缓存与连接复用分开

连接池可能让请求不经过新查询便成功;陈旧连接也可能在 DNS 已恢复后继续失败。至少执行三个变体:

  • 保留 DNS 缓存,但强制建立新连接;
  • 清除 DNS 状态,但保留正常连接池;
  • 启动既无 DNS 状态也无连接状态的新进程。

比较结果,不要因为一次重试成功就认定发生了重新解析。连接池键应隔离目标、代理路由、TLS 信任配置和认证会话等安全边界。

控制重试放大

只执行少量固定次数的重试,采用带抖动的指数退避,并限制并发。解析器短暂故障不应触发快速更换代理或大量重复请求。

记录恢复时间、每个逻辑请求的查询次数、成功连接数和重试放大倍数。如果换出口后测试才“成功”,应回到稳定路径找到真正持有缓存的组件;更换出口不是 DNS 缓存修复方法。

验收清单

  • [ ] 已确认每种代理模式的解析责任方。
  • [ ] 正向、权威否定和临时失败被分别分类。
  • [ ] 测试仅使用自有名称和受控解析器。
  • [ ] 稳定正向对照在所有获准路径成功。
  • [ ] 权威否定案例符合预期缓存策略。
  • [ ] 临时失败仅按有限退避策略重试。
  • [ ] 恢复后出现新查询并成功连接。
  • [ ] DNS 缓存和连接复用被独立测试。
  • [ ] 未用代理轮换掩盖结果。
  • [ ] 日志不包含凭据和生产数据。

常见问题

所有 DNS 否定结果都适合缓存吗?

不适合。关键在于结果是否是符合当前解析策略的权威否定回答,还是临时故障。把临时错误当作持久不存在会延迟恢复。

SOCKS 代理一定负责解析主机名吗?

不一定。有的模式把主机名交给代理,有的模式把客户端已解析的地址发给代理。应检查配置并用受控测试确认。

为什么恢复后的请求成功,却没有新的 DNS 查询?

它可能复用了已有连接。强制新建连接,并将 DNS 状态单独测试后再下结论。

故障期间是否应该清空所有缓存?

不应自动这样做。先判断陈旧状态属于应用、操作系统、解析器、代理还是连接池。大范围清缓存会掩盖问题边界并增加负载。

来源与合规说明

内部研究依据:curl 项目于 2026 年 9 月 2 日发布的 curl 8.22.0 发布公告与变更记录。外部资料 URL 仅保存在内部运营记录中,公开文章不含外部链接。

只测试自己拥有或明确获准评估的域名、解析器、代理路径与端点,并遵守服务商限制、隐私要求、robots 规则和组织变更流程。