curl -w 可直接输出 DNS、TCP、TLS 等各阶段耗时,关键变量包括 %{time_namelookup}(DNS 解析完成)、%{time_connect}(TCP 连接建立,含 DNS)、%{time_appconnect}(TLS 握手完成,HTTPS 专属)、%{time_starttransfer}(TTFB)、%{time_total}(总耗时),需配合 -o /dev/null -s -f 使用以确保结果干净准确。

直接用 curl -w 输出各阶段时间变量,就能看到 DNS、TCP、TLS 握手的具体耗时,不需要抓包或改内核参数。
curl -w 能输出哪些握手阶段的时间
curl 内置一组 time_* 变量,对应请求生命周期中真实发生的网络动作耗时(单位:秒,含小数)。关键变量含义和依赖关系如下:
-
time_namelookup:DNS 解析完成时间(从开始到拿到 IP) -
time_connect:TCP 连接建立完成时间(含time_namelookup,即到 SYN-ACK 收到) -
time_appconnect:TLS/SSL 握手完成时间(含time_connect,即到 TLS Finished 消息交换完毕) -
time_pretransfer:所有前置操作完成时间(含重定向、认证等,到即将发 HTTP 请求) -
time_starttransfer:首字节响应到达时间(即 TTFB,含 request 发送 + response header 到达) -
time_total:整个请求总耗时
注意:这些是累加关系,不是独立区间。比如 time_connect - time_namelookup 才是纯 TCP 三次握手耗时;time_appconnect - time_connect 才是纯 TLS 握手耗时。
实际命令怎么写才不干扰结果
默认 curl 会把响应体打印到终端,混在时间输出里很难读。必须屏蔽响应体,并确保只触发一次连接(避免缓存干扰):
- 加
-o /dev/null丢弃响应体(/dev/nul是 Windows 写法,Linux 必须用/dev/null) - 加
-s关闭进度条,避免 stderr 干扰 - 加
-f让非 2xx 响应也输出时间(否则失败时没数据) - HTTPS 站点必须用
https://协议头,否则time_appconnect恒为 0
示例命令:
curl -s -f -o /dev/null -w "namelookup: %{time_namelookup}s\nconnect: %{time_connect}s\nappconnect: %{time_appconnect}s\npretransfer: %{time_pretransfer}s\nstarttransfer: %{time_starttransfer}s\ntotal: %{time_total}s\nhttp_code: %{http_code}\n" https://example.com为什么 time_appconnect 有时是 0 或和 time_connect 相等
这说明没有发生 TLS 握手,常见原因有:
- 请求的是
http://而非https://(HTTP 不走 TLS) - 目标服务用了 HTTP/2 over TCP 直连,但未启用 TLS(极少见)
- 中间有代理强制降级(如某些企业网关),实际走的是明文 HTTP
- curl 编译时没启用 OpenSSL 或其他 TLS 后端(可通过
curl -V查看支持的协议)
验证方法:执行 curl -v https://example.com 2>&1 | grep "Connected to",如果出现 ALPN, offering h2 或 SSL connection using 字样,才说明 TLS 生效。
单纯看 TCP 三次握手,curl 不够用怎么办
curl -w 给出的是端到端耗时,无法区分 SYN、SYN-ACK、ACK 各自延迟。真要定位是哪一拍慢,得换工具:
- 用
tcpdump -i any port 443 -w handshake.pcap抓包,再用 Wireshark 看每个 TCP segment 的时间戳 - 用
ss -i查看已建立连接的 RTT 估算值(仅对 ESTABLISHED 状态有效) - 用
hping3 -S -p 443 example.com测 SYN→SYN-ACK 单向延迟(需目标开放对应端口)
但绝大多数线上延迟问题,靠 time_connect - time_namelookup 已足够定位是 DNS 还是 TCP 层的问题——这个差值超过 300ms,基本可以排除本地网络,去查对方服务器的 SYN 队列或防火墙策略了。


















