握手慢通常慢在哪
一次完整握手包含多次往返:传输层建连、协议版本与套件协商、证书下发与验证,加密套件协商后还要校验对端身份。其中耗时最容易被低估的是证书链与在线吊销状态检查:服务端若只发叶证书,客户端必须自己去补拉中间证书,多一次解析与往返;在线吊销检查被网络策略阻塞时,客户端会等到超时才继续。其次才是会话复用未生效以及丢包环境下的握手重传。
基本信息
| 测量手段 | 命令行工具的连接与握手分段耗时、握手报文抓包 |
|---|---|
| 首要优化 | 部署完整证书链:叶证书加中间证书,注意顺序 |
| 次要优化 | 启用手持会话复用与会话票据;TLS 1.3 默认支持会话恢复 |
| 路径优化 | 就近接入与多线路,减少握手往返时延 |
| 观测指标 | 握手完成时刻与建连时刻的差值、握手法阶段的报文数量 |
典型使用场景
- 首屏加载慢:区分是握手耗时还是后端处理耗时
- 部分用户偶发握手失败:检查证书链是否完整
- 跨境访问慢:确认是否可通过就近节点减少往返
- 在线吊销检查被拦:确认校验阶段是否长时间停顿
- 优化效果验收:对比握手阶段耗时在改动前后的变化
验证与取证
验证与取证
curl -v -o /dev/null --connect-timeout 5 https://example.com/ 2>&1 | grep -E 'Connected|TLS|handshake|SSL'
openssl s_client -connect example.com:443 -servername example.com -status -tlsextdebug </dev/null 2>&1 | grep -E 'Protocol|Cipher|Verify|OCSP|Session-ID'
# 抓握手报文:
tcpdump -nn -i eth0 -w /tmp/tls.pcap 'host 203.0.113.10 and tcp port 443'
# 分段计时:
curl -sS -o /dev/null -w 'connect %{time_connect} appconnect %{time_appconnect} total %{time_total}\n' https://example.com/慢的归因与优化
| 归因 | 证据 | 优化 |
|---|---|---|
| 证书链不完整 | 客户端出现额外的证书拉取动作 | 部署完整链并核对顺序 |
| 在线吊销检查被阻塞 | 握手在建连后长时间停顿 | 放行校验地址或改为本地策略 |
| 会话复用未生效 | 每次连接都要完整握手 | 启用会话票据与复用 |
| 路径往返时延大 | 握手耗时约为多次往返之和 | 就近接入、减少中间跳数 |
| 握手报文重传 | 抓包出现握手阶段重传 | 先治理丢包再谈握手优化 |
只发叶证书而缺中间证书时,部分客户端因为缓存过中间证书而握手正常,表现为部分用户偶发握手失败或变慢的疑难现象。