← 中文资源

简体中文版本

测量 TLS 握手开销与会话复用效果

用 curl 与 openssl 计量完整与恢复两种 TLS 握手耗时,量化证书链成本,判断何处值得长连接复用。

阅读英文原文

目标

每请求新建连接的客户端,在发出一个字节的业务数据前要先付 DNS、TCP 与完整 TLS 握手的成本。curl 的 time_appconnect 恰好隔离 TLS 部分,对比冷热请求就能量化复用价值。对小型 API 调用,握手可能占据整个请求耗时的大头,因此 keep-alive 是性价比最高的性能优化。

步骤要点

  1. 用 Connection: close 循环三次测冷握手:time_appconnect 约 0.19 秒即握手成本,证书链越长越贵。
  2. 用 –next 在同一连接上做第二次传输:time_appconnect 归零,因为完全没有新握手。
  3. 用 openssl s_client 统计服务端下发的证书数量,评估每个冷客户端要下载并验证的链大小。
  4. 对比 tls 与 total:若 0.21 秒总耗时里 tls 占 0.19,业务载荷几乎免费,握手就是调用本身的成本。
  5. 给客户端启用 keepAlive 连接池,复测单次调用耗时应降到接近纯响应时间。

排错提示

会话恢复从不生效,多为服务端禁了 session ticket 或负载均衡逐连接终结 TLS,应启用 ticket 或把终结移到会做连接池的组件;只在办公网慢先换中立网络测量,公司代理会多加一次完整握手;time_appconnect 恒为 0 说明请求没走到 TLS(回退 HTTP 或前置失败),先查 scheme 与 DNS。

适用边界

握手成本高度依赖网络位置,数字只在同一观测点内可比;TLS 1.3 改变了恢复机制,务必用实际部署的协议版本测量。

代码示例

# Cold: force a new connection each time
for i in 1 2 3; do curl -s -o /dev/null -H "Connection: close" \
  -w "tls=%{time_appconnect} total=%{time_total}\n" https://api.example.com/v1/ping; done

# Warm: second transfer reuses the connection
curl -s -o /dev/null --next -s -o /dev/null -w "tls=%{time_appconnect}\n" \
  https://api.example.com/v1/ping https://api.example.com/v1/ping