curl可通过-w参数拆解web服务各阶段耗时:dns解析、tcp连接、tls握手(https专属)、ttfb及总耗时,配合-o /dev/null和-s保持输出干净,结合--dns-servers等参数排除缓存干扰,支持批量测试与平均值分析。

用 curl 测 Web 服务响应时间,不仅能看总耗时,还能拆解 DNS 解析、TCP 连接、TLS 握手、请求发送、响应接收等各阶段耗时,对排查网络或服务性能问题非常实用。
启用详细时间统计(-w 参数)
最常用方式是配合 -w(write-out)输出自定义时间字段。例如:
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nTCP: %{time_connect}s\nTLS: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://httpbin.org/get
说明:
-
%{time_namelookup}:DNS 查询完成耗时(从开始到拿到 IP) -
%{time_connect}:TCP 连接建立完成(含 DNS,不含 TLS) -
%{time_appconnect}:TLS/SSL 握手完成(HTTPS 专属,HTTP 为 0) -
%{time_starttransfer}:TTFB(Time to First Byte),即首字节响应时间 -
%{time_total}:整个请求总耗时(含下载响应体)
注意:-o /dev/null 避免输出响应体干扰;-s 关闭进度条,保持输出干净。
区分 HTTP 和 HTTPS 的关键差异
HTTP 请求中 %{time_appconnect} 恒为 0;HTTPS 则包含完整 TLS 握手耗时。若该值明显偏高(如 >300ms),需检查证书链、服务器 TLS 配置或客户端信任库。可加 --verbose 查看握手细节,或用 openssl s_client -connect host:443 单独测试。
排除本地缓存干扰(强制刷新 DNS & 连接)
默认 curl 可能复用连接或系统 DNS 缓存,影响多次测试一致性。建议加上:
-
--no-buffer:禁用输出缓冲(非必需,但更准) -
--dns-servers 8.8.8.8:指定公共 DNS,绕过本地缓存 -
--connect-timeout 5:设置连接超时,避免卡死 -
-H "Cache-Control: no-cache":提示服务端不返回缓存响应
组合示例:
curl -o /dev/null -s --dns-servers 8.8.8.8 --connect-timeout 5 -H "Cache-Control: no-cache" -w "DNS:%{time_namelookup}\nTCP:%{time_connect}\nTLS:%{time_appconnect}\nTTFB:%{time_starttransfer}\nTotal:%{time_total}\n" https://api.example.com/health
批量测试与简单分析
快速测 5 次取平均值:
for i in {1..5}; do curl -o /dev/null -s -w "%{time_total}\n" https://httpbin.org/get; done | awk '{sum += $1} END {print "Avg:", sum/NR}'
若想观察波动,可加时间戳:
curl -o /dev/null -s -w "$(date +%H:%M:%S) %{time_total}s\n" https://httpbin.org/get
再配合重定向保存日志,后续用 Excel 或脚本分析各阶段稳定性。
掌握这些 curl 时间字段和参数组合,不用装额外工具就能完成大多数 Web 接口的网络层性能初筛。










