使用curl分析HTTPS连接耗时
前言
当访问某个 HTTPS 网站时,如果发现连接建立时间较长或请求响应缓慢,可以通过 curl输出的时间指标快速定位问题出现在连接链路的哪个阶段,例如:
- DNS 解析是否耗时过长
- TCP 建连是否存在延迟
- TLS 握手是否异常
- 服务端响应是否缓慢
使用 curl 查看连接各阶段耗时
Linux/macOS 环境下可执行:
curl -o /dev/null -s -w "DNS解析: %{time_namelookup}s\nTCP连接: %{time_connect}s\nTLS握手: %{time_appconnect}s\n首字节时间(TTFB): %{time_starttransfer}s\n总耗时: %{time_total}s\n" https://example.com
Windows 环境建议使用英文输出,避免终端编码导致中文乱码:
curl -o /dev/null -s -w "time_namelookup: %{time_namelookup}s\ntime_connect: %{time_connect}s\ntime_appconnect: %{time_appconnect}s\ntime_starttransfer: %{time_starttransfer}s\ntime_total: %{time_total}s\n" https://example.com
各时间指标含义
| 变量 | 含义 |
|---|---|
| time_namelookup | DNS 查询完成时间 |
| time_connect | TCP 三次握手完成时间 |
| time_appconnect | SSL/TLS 握手完成时间(HTTPS 特有) |
| time_pretransfer | 开始传输前的总准备时间 |
| time_starttransfer | 收到服务器第一个字节时间(TTFB) |
| time_total | 整个请求完成时间 |
实测分析
下面以访问 www.baidu.com 为例进行测试。
在相同网络出口、相同目标站点的情况下,两次请求的整体耗时却存在明显差异。
从测试结果可以发现:
- 第一阶段的 DNS 解析时间已经出现明显差距;
- 后续 TCP 建连和 TLS 握手时间也是有差距;
- 加起来总耗时差异就会显得有些大。
当遇到 HTTPS 访问缓慢的问题时,建议优先观察:
time_namelookup是否异常升高time_connect是否明显增加time_appconnect是否存在 TLS 握手延迟time_starttransfer是否过长(服务端处理慢)
通过逐阶段分析,可以快速缩小排查范围,避免盲目定位问题。
从本次测试结果来看,需以DNS 解析阶段作为突破点,后续可进一步通过更换 DNS 服务器、抓包分析或使用 dig/nslookup 等工具进行验证。


出现以上差距的实际原因是:一个使用了国内dns,解析较快,并且返回国内IP;一个使用了国外dns,解析出现延迟,并返回了国外IP;导致每个阶段都增加了延迟。