复连不必重跑完整握手
完整握手要消耗一次甚至多次往返与大量非对称运算。会话恢复让客户端在复连时复用先前的密钥材料:TLS 1.2 用 Session ID(服务器保存状态)或 Session Ticket(把状态加密后交给客户端保管),TLS 1.3 统一为 PSK 恢复,并支持 0-RTT 在首个包就带上数据。恢复能显著降低延迟,但引入了重放与密钥管理的复杂度。
基本信息
| 1.2 机制 | Session ID(有状态)与 Session Ticket(无状态,RFC 5077) |
|---|---|
| 1.3 机制 | PSK 恢复,可配合 0-RTT 早期数据 |
| 服务端配置 | 会话缓存大小与票据开关,如常见的 shared 会话缓存与票据密钥轮换 |
| 集群要求 | 票据密钥必须在集群内共享,否则复连落到其他节点会恢复失败 |
| 安全注意 | 0-RTT 数据可被重放,仅适合幂等请求 |
机制对照
| 机制 | 原理 | 注意点 |
|---|---|---|
| Session ID | 服务器存会话状态,客户端带 ID 复连 | 需要服务器内存或集群共享存储 |
| Session Ticket | 状态加密进票据交客户端保管 | 票据密钥要轮换,防止伪造与长期泄露 |
| PSK 恢复 | 按恢复主密钥直接派生会话密钥 | 与 0-RTT 搭配存在重放风险 |
| 0-RTT | 首个包即携带应用数据 | 只对幂等请求启用,服务端需去重 |
观察是否恢复成功
观察是否恢复成功
openssl s_client -connect example.com:443 -sess_out s.pem </dev/null >/dev/null 2>&1
openssl s_client -connect example.com:443 -sess_in s.pem </dev/null 2>&1 | grep -i -E 'reused|resum'
# 输出中出现 Reused, TLSv1.3 之类提示即表示复用了会话
# Nginx 侧典型配置方向:开启会话缓存与票据,并保证集群节点间票据密钥一致典型使用场景
- CDN 与网关调优:提升复连比例能显著降低尾延迟与非对称运算开销
- 移动端场景:弱网下少一次往返对体验影响明显
- 排查「偶发慢请求」:确认是否因恢复失败退回完整握手
- 集群扩容后核对票据密钥分发是否同步
会话恢复能减少一个往返并省下非对称运算,CDN 与网关普遍开启;但票据密钥要在集群内共享并定期轮换,否者既要面对恢复失败又要承担伪造风险。
恢复比例要靠指标而非猜测:在网关侧统计完整握手与恢复握手的占比,配合客户端类型下钻,才能判断该调票据还是该查集群配置。