很多工程师每天都在用 curl。但 90% 的人只会用最基础的一种方式:
curl https://example.com
然而 curl 其实隐藏着一个 非常强大的能力:
一条命令直接分析 HTTP 请求的整个生命周期。
比如:
curl -o /dev/null -s -w "DNS: %{time_namelookup}s
TCP: %{time_connect}s
TLS: %{time_appconnect}s
TTFB: %{time_starttransfer}s
TOTAL: %{time_total}s" https://example.com
输出:
DNS: 0.002s
TCP: 0.015s
TLS: 0.120s
TTFB: 0.180s
TOTAL: 0.300s
一眼就能看出:
- DNS 是否慢
- TCP 是否慢
- TLS 是否慢
- 服务器是否慢
这就是 curl 中 最被低估的参数之一:
-w (--write-out)
今天这篇文章,带你彻底掌握它。
一、为什么工程师需要 curl -w?
很多线上问题,本质都是网络链路问题。
例如:
用户请求慢
│
├─ DNS 慢
├─ TCP 连接慢
├─ TLS 握手慢
├─ 服务器处理慢
└─ 下载慢
如果没有合适的工具,你通常只能靠猜:
- 是DNS问题?
- 是网络问题?
- 是服务器慢?
- 还是 CDN 问题?
而 curl -w 可以直接打印 完整网络阶段时间线,将黑盒变成白盒,这正是高效网络诊断的关键。
二、curl -w 是什么
-w 全称:
--write-out
它的作用是:
在请求完成后,输出自定义的 HTTP 请求统计信息。
语法:
curl -w "<format>" URL
例如,只想看HTTP状态码:
curl -w "%{http_code}\n" https://example.com
输出:
200
三、HTTP 请求完整时间线
理解 curl -w 之前,我们需要先理清 HTTP 请求的完整流程:
客户端
│
│ DNS lookup
▼
解析 IP
│
│ TCP connect
▼
建立连接
│
│ TLS handshake
▼
建立 HTTPS
│
│ send request
▼
服务器处理
│
│ first byte
▼
开始返回数据
│
▼
下载完成
curl -w 的强大之处,就在于它可以精确测量并打印出每一个阶段所花费的时间。
四、最常用的 10 个变量
下表列出了工程师最常使用的 -w 变量:
| 变量 |
含义 |
%{http_code} |
HTTP 状态码 |
%{time_total} |
总耗时 |
%{time_namelookup} |
DNS 解析时间 |
%{time_connect} |
TCP 连接时间 |
%{time_appconnect} |
TLS 握手时间 |
%{time_pretransfer} |
准备传输时间 |
%{time_starttransfer} |
首字节时间(TTFB) |
%{size_download} |
下载字节数 |
%{speed_download} |
下载速度 |
%{remote_ip} |
服务器 IP |
五、工程师最常用的性能分析命令
这是 最值得收藏并投入实战的一条命令:
curl -o /dev/null -s -w "DNS: %{time_namelookup}s
TCP: %{time_connect}s
TLS: %{time_appconnect}s
TTFB: %{time_starttransfer}s
TOTAL: %{time_total}s" https://example.com
输出示例:
DNS: 0.002s
TCP: 0.015s
TLS: 0.120s
TTFB: 0.180s
TOTAL: 0.300s
这条命令清晰地勾勒出了请求的时间线:
DNS lookup
│
▼
TCP connect
│
▼
TLS handshake
│
▼
Server processing
│
▼
First byte
│
▼
Download finished
六、5 个非常实用的 curl -w 用法
1. 打印 HTTP 状态码
curl -o /dev/null -s -w "%{http_code}\n" URL
适合场景:
2. 查看接口总延迟
curl -o /dev/null -s -w "%{time_total}\n" URL
输出:
0.231
3. 状态码 + 延迟(一站式检查)
curl -o /dev/null -s -w "%{http_code} %{time_total}s\n" URL
输出:
200 0.231s
4. 查看真实服务器 IP
有时候经过 CDN 或负载均衡器,真实的服务器 IP 会被隐藏。用这个命令可以看清:
curl -s -o /dev/null -w "%{remote_ip}\n" URL
输出:
104.18.12.123
5. 查看下载速度
curl -o /dev/null -s -w "%{speed_download}\n" URL
输出:
234512
单位是 bytes/s。
七、排查慢接口的标准套路
如果你发现请求很慢,比如:
TOTAL: 2.3s
这时就可以用前面提到的“黄金命令”进行分段定位:
| 异常指标 |
可能的问题 |
DNS 时间 (time_namelookup) 高 |
DNS 解析慢 |
TCP 时间 (time_connect) 高 |
网络延迟高或防火墙问题 |
TLS 时间 (time_appconnect) 高 |
TLS 握手慢(证书复杂或服务器性能) |
TTFB 时间 (time_starttransfer) 高 |
服务器处理慢(应用逻辑或数据库慢) |
案例分析:
假设命令输出如下:
DNS: 0.002
TCP: 0.010
TLS: 0.090
TTFB: 1.800
TOTAL: 2.000
结论一目了然:瓶颈在于服务器处理环节(TTFB 高达 1.8 秒),而非网络层面。
八、生产环境监控脚本
许多简单的服务监控,其核心就是一个加强版的 curl -w 命令。你可以这样构建一个监控点:
curl -o /dev/null -s -w \
"status=%{http_code} time=%{time_total}\n" \
https://api.example.com
输出:
status=200 time=0.123
将这个脚本与 crontab、Prometheus 或现有的日志系统结合,就能轻松实现对关键接口的 SLA 与性能监控。这正是一个经典且高效的运维监控实践。
九、curl -w 的隐藏能力
很多人可能不知道:
curl -w 可以输出 超过 40 个不同的统计变量。
除了常用的时间、状态码,你还可以获取:
remote_port
num_redirects (重定向次数)
size_upload (上传数据量)
ssl_verify_result (SSL证书验证结果)
- ...等等
查看所有可用变量的终极方法是查阅手册:
man curl
然后在手册中搜索 --write-out 部分。
总结
curl -w 本质上是一个 轻量级、零依赖的 HTTP 请求可观测性工具。
它让 curl 从一个简单的数据下载工具,进化成了:
- API 调试工具:快速检查状态和延迟。
- 网络分析工具:精准定位 DNS、TCP、TLS 各阶段问题。
- 性能诊断工具:量化分析服务器响应时间。
掌握它,意味着你多了一种快速洞察网络请求内部状态的能力,下次再遇到“请求慢”的问题时,就不用再盲目猜测了。
延伸阅读(以下为原文外链):