curl --next 换了 resolve 地址,却仍复用第一个 IP 的连接
--next不清空连接池。解析地址改变后,已有同域名连接仍可复用;逐个IP独立探测用分别调用,libcurl按下一次连接与完成后回收分别控制。
同一条 curl 命令先访问一个 IP,经过 --next 再用新的 --resolve 检查另一个 IP。日志显示 DNS 缓存已经加入新地址,下一行却是 Re-using existing connection,请求仍走第一次的连接。需要独立探测多个后端时,这会让检查结果对应错机器。
--next 分隔传输选项,不会清空这次进程保留的连接池和 DNS 缓存。curl 在解析地址之前先寻找可复用连接,所以更换解析条目并不必然创建新连接。curl 7.88.1 的这种现象,与正式 8.22.0 文档描述的复用模型一致。
解析条目被接受,连接却没有重建
先确认 URL 的域名和端口确实匹配 --resolve 的 HOST:PORT:ADDRESS。URL 使用默认 HTTPS 443,而规则写了 8443,是另一个端口不匹配问题,不能按连接复用处理。
匹配正确时,对照每次传输的详细连接日志和实际远端 IP。Added ... to DNS cache 只说明条目已保存;紧接着复用了已有连接,就没有按新的条目重新建立 TCP 连接。
连接池还会判断端口、协议及其他条件,并非所有同名 URL 都一定复用。也要核对代理、跳转和已有配置文件:它们可能改变实际连接目标。日志中有认证头和 Cookie 时,先脱敏再分享。
CLI 独立检查每个 IP,分别调用 curl
如果目标是逐个检查同一域名的不同服务器,最直接的做法是每个 IP 启动独立调用。以下是 POSIX shell 中的两次直连示例:
curl -q --noproxy '*' --connect-timeout 5 --max-time 15 \
--resolve example.com:443:192.0.2.10 \
--output /dev/null \
--write-out 'remote=%{remote_ip} http=%{http_code}\n' \
'https://example.com/health'
curl -q --noproxy '*' --connect-timeout 5 --max-time 15 \
--resolve example.com:443:192.0.2.20 \
--output /dev/null \
--write-out 'remote=%{remote_ip} http=%{http_code}\n' \
'https://example.com/health'
域名、文档示例 IP 和无副作用的检查路径都需替换。-q 放在第一个参数位置,跳过默认配置文件;--noproxy '*' 仅适用于允许直连的诊断路径。必须通过代理的环境应单独设计检查,不能把代理 IP 当作已探测的后端 IP。
两次调用仍保留域名 URL,使 SNI、证书名称校验和应用主机名符合原地址。不要改成 IP URL 再手工加 Host,也不要加 -k。私有 CA 应沿用已核实的信任配置。
这里未跟随重定向。若检查路径返回跳转,先核对 Location,再决定怎样验证业务;跳到其他主机后,原规则不一定适用。每次查看退出状态、远端地址、HTTP 状态与对应后端日志,不能把 http=000 或空地址当成已连接成功。
libcurl 要控制下一次传输是否复用
程序使用 libcurl 时,在已设置准确 URL、解析条目和 TLS 校验的目标传输前,可用 CURLOPT_FRESH_CONNECT 的 1L 要求新连接,并检查 curl_easy_setopt 和传输返回值。这是 API 选项,不能照名字虚构一个 CLI --fresh-connect 参数。
CURLOPT_FORBID_REUSE 的 1L 则让本次传输完成后关闭所用连接,影响后续复用。它不表示“开始本次传输前清空所有旧连接”,与 FRESH_CONNECT 的时点不同。
强制新连接会增加握手和资源开销。只在需要独立后端测量的范围启用,普通业务请求不必为这个诊断问题关闭全部连接复用。easy、multi 和 share 接口的连接池范围也不同,要按实际程序组织控制,而不是只重建某个 easy handle 就假定共享池已消失。
TCP keepalive 与 HTTP 连接池不同
--no-keepalive 控制 TCP 保活探测,不关闭 HTTP 连接复用。添加 Connection: close 有时会影响 HTTP/1 的连接生命周期,但不是覆盖 HTTP/2、HTTP/3 的统一独立探测方案。
修改系统 DNS、反复刷新解析缓存,也不能让已经建立的连接自动换 IP。验收应确认每个指定 IP 真正建立了独立连接,并且相应证书、响应和业务检查正常。检查结束后移除诊断用解析规则及强制新连接设置,不需要改服务器或系统 hosts。


