应用层报文判读71 条

TLS 握手耗时拆解

完整握手含 1 个往返(1.2 典型 2 个)+ 密钥计算:从 ClientHello 到 Finished 的时间差就是握手成本,跨地域链路常占首访延迟大头。

握手耗时怎么算

TLS 握手成本等于从 ClientHello 到最后一个 Finished 的时间差,其中包含网络往返与密钥运算两部分。TLS 1.2 的完整握手为两个往返(ServerHello 到 ServerHelloDone 一个、客户端密钥交换到 Finished 一个),TLS 1.3 把密钥交换并入 Hello 扩展后压到一个往返。会话恢复走另一条更短的路径,统计时要把完整握手与会话恢复分开,否则平均值没有意义。

基本信息

适用平台Wireshark / tshark,客户端与服务端两侧均可测量
测量口径首个 ClientHello 到首个 Finished 的时间差
影响项网络往返、服务端密钥运算、证书链长度、是否走恢复路径
统计建议按完整握手与恢复路径分别统计,输出分位数而非仅均值

典型使用场景

  • 首屏或首访慢,需要判断握手占了多少延迟
  • 跨地域链路与同城链路对比,量化距离带来的代价
  • 评估开启会话恢复或 TLS 1.3 后的实际收益
  • 排查握手偶发超时,定位是网络往返还是服务端处理变慢
  • 为容量规划提供依据:按每秒新建连接数估算握手带来的计算负载
  • 对比改造前后两次抓包,验证优化手段是否真的生效

测量与对照

测量与对照
tls.handshake.type == 1                       # ClientHello
tls.handshake.type == 20                      # Finished
# 同一流内取首个 ClientHello 与最后一个 Finished 的时间差
# 完整握手(1.2): CH → SH,Cert,SKE,SHD → CKE,CCS,FIN → CCS,FIN
# 会话恢复: CH(带票据) → SH,CCS,FIN
# 分别统计两条路径的次数与耗时,均值之外给出 P95

时间线逐段读法

区段含义异常信号
CH 到 SH一个往返加服务端首段处理明显偏大指向网络往返或服务端排队
SH 到客户端下一帧证书传输与客户端处理链证书链过长会在这里体现
到 Finished剩余往返与密钥运算耗时稳定但偏大常见于弱算力服务端
整段总时长握手总成本与其他流对比出现离群值需单独复查
握手时间天然包含至少一个网络往返,把它与服务端处理时间混在一起会高估服务端;两侧同时抓包并用同一条流对齐,才能把两段拆开。
TLS 1.3 启用 HelloRetryRequest 时会多出一个往返,这种「多一轮」是协议正常行为,不应作为性能退化证据。

易错点

  • 用均值描述握手耗时:长尾往往才是用户感知的来源,缺少分位数会掩盖真实问题
  • 把会话恢复与完整握手混在同一个统计里:恢复占比一变化,平均值就会失真
  • 忽略抓包点位置:客户端侧看到的握手耗时含全部网络段,服务端侧只反映首包到达后的处理,两者不能互推
  • 只改一项就下结论:握手快慢受网络、服务端算力、证书链、协议版本多因素影响,需单变量对照

数据来源与参考

  • RFC 8446
  • Wireshark User's Guide
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌