科技 · 實用指南
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。它們是從開始計算的累積時間。比較相鄰值以分離 DNS、TCP、TLS、伺服器首位元組與回應內容傳輸。
找出第一個未完成階段
名稱解析卡住通常指向 DNS;TCP 連線很慢或缺失,檢查路由、位址族、防火牆、代理與監聽器;TCP 完成後 TLS 卡住,檢查握手、信任鏈與協商;TLS 完成而首位元組慢,檢查伺服器與上游;收到資料後才達總時限,檢查吞吐與回應停滯。
一次測試一個受控變數
保持方法與目標不變。與已知正常主機比較;政策允許時再測 IPv4/IPv6、既定代理或 --resolve。不要把正式憑證送到替代主機。每項比較只回答一個問題,並留下變更前後時間。
分開連線、完整傳輸與重試預算
--connect-timeout 限制連線階段;--max-time 限制每次完整傳輸;重試會重設每次嘗試的計時,而 --retry-max-time 限制重試視窗。只有慢階段已證明合理且工作能安全等待時,才提高完整傳輸時限。
重測證明修復並保留回復路徑
重複原命令,避免把暫時成功當成修復。保存階段時間、有效 URL、回應碼、可用時的遠端 IP、退出碼與唯一變更。若等待仍無法解釋,回復原設定並攜帳本升級處理,不要關閉憑證驗證或移除網路控制。
