科技 · 实用指南
curl 错误 28:提高时限前先测 DNS、连接、TLS 和首字节
错误 28 只说明触发了超时条件,并不指出等待发生在哪一层。记录 curl 各阶段耗时,只比较一个受控变量,确认慢点后再调整时限。

curl 28 是时间预算告警。它可能发生在 TCP 连接建立前、TLS 握手期间、等待首个响应字节时,或数据已经开始传输之后。相同退出码需要不同修复。先保留失败命令和环境,再测量累积阶段,并且一次只改一个变量。
改时限前固定复现条件
记录不含秘密的准确 URL、HTTP 方法、运行主机或 CI、代理、DNS 路径、IP 族以及 curl -V 输出。在失败环境执行同一请求并保存退出码。一个环境成功而另一个失败,只能证明存在环境边界,不能证明远端对所有调用方可用。
用 --write-out 输出阶段账本
对无副作用请求输出 time_namelookup、time_connect、time_appconnect、time_starttransfer 和 time_total。它们都是从开始计算的累积时间。比较相邻值:连接减解析近似 TCP;appconnect 减 connect 近似 TLS;首字节减预传输显示服务端等待;总时间减首字节显示响应体传输。
找出第一个未完成的阶段
解析卡住通常指向 DNS 可达性或策略;TCP 连接结果很大或缺失,检查路由、地址族、防火墙、代理和监听器;TCP 完成后 TLS 卡住,检查握手、信任链、检查设备或协议协商;TLS 完成而首字节很慢,检查服务端、上游或中间件;已收字节却在总时限失败,检查吞吐或响应体停滞。
一次测试一个受控变量
保持方法和目标不变。先与已知正常主机比较;策略允许时,再比较 IPv4/IPv6、启用或绕过既定代理,或使用 --resolve 指定解析结果。不要把生产凭据发送到替代主机。每次比较只回答一个问题,并保留前后耗时。
区分连接、整次传输和重试预算
--connect-timeout 限制连接及 curl 文档所述的相关握手;--max-time 限制每次完整传输;启用重试后每次尝试会重置该计时,而 --retry-max-time 限制重试窗口。只有确认慢阶段合理且调用任务能安全等待时,才提高 --max-time。
复测证明修复并保留回滚
重复原命令,避免把偶然成功当作修复。保存阶段耗时、有效 URL、响应码、可用时的远端 IP、退出码和唯一变更。如果等待仍无法解释,恢复原设置并带账本升级处理,不要叠加重试、关闭证书校验或移除网络控制。
