534 字
2 分钟
为什么 HTTPS 需要 7 次握手以及 9 倍时延
HTTPS(HTTP over TLS)是安全的 HTTP 协议。但建立 HTTPS 连接需要多次握手,带来显著的延迟。本文深入解析 HTTPS 的握手过程和优化策略。
一、HTTPS 连接建立全景
1.1 完整的握手过程
sequenceDiagram
participant C as 客户端
participant S as 服务端
Note over C,S: TCP 三次握手
C->>S: SYN
S->>C: SYN+ACK
C->>S: ACK
Note over C,S: TLS 1.2 握手
C->>S: ClientHello
S->>C: ServerHello + Certificate + ServerHelloDone
C->>S: ClientKeyExchange + ChangeCipherSpec + Finished
S->>C: ChangeCipherSpec + Finished
Note over C,S: HTTP 请求
C->>S: HTTP Request
S->>C: HTTP Response
Note over C,S: 总计: 3 RTT (TCP) + 2 RTT (TLS) = 5 RTT
1.2 延迟分解
| 阶段 | 往返次数 | 延迟占比 |
|---|---|---|
| DNS 查询 | 1 RTT | ~10% |
| TCP 三次握手 | 1 RTT | ~15% |
| TLS 握手 | 2 RTT | ~30% |
| HTTP 请求/响应 | 1 RTT | ~15% |
| 数据生成/传输 | - | ~30% |
二、TLS 1.2 握手详解
2.1 完整握手流程
sequenceDiagram
participant C as 客户端
participant S as 服务端
C->>S: ClientHello<br/>支持的密码套件<br/>TLS 版本<br/>客户端随机数
S->>C: ServerHello<br/>选中的密码套件<br/>TLS 版本<br/>服务端随机数
S->>C: Certificate<br/>服务证书链
S->>C: ServerHelloDone
Note over C: 客户端验证证书
C->>S: ClientKeyExchange<br/>预主密钥(用公钥加密)
C->>S: ChangeCipherSpec<br/>切换到加密模式
C->>S: Finished<br/>加密的握手消息摘要
Note over S: 服务端验证并计算会话密钥
S->>C: ChangeCipherSpec<br/>切换到加密模式
S->>C: Finished<br/>加密的握手消息摘要
Note over C,S: 之后的通信全部加密
2.2 为什么需要这些步骤?
| 步骤 | 目的 |
|---|---|
| ClientHello | 客户端声明能力 |
| ServerHello | 服务端选择密码套件 |
| Certificate | 服务端身份验证 |
| ClientKeyExchange | 密钥协商 |
| ChangeCipherSpec | 通知加密开始 |
| Finished | 验证握手完整性 |
三、TLS 1.3 的优化
3.1 1-RTT 握手
TLS 1.3 将握手减少到 1 RTT:
sequenceDiagram
participant C as 客户端
participant S as 服务端
Note over C,S: TLS 1.3: 1 RTT
C->>S: ClientHello<br/>支持的密码套件<br/>密钥共享
S->>C: ServerHello<br/>选中的密码套件<br/>密钥共享<br/>Certificate<br/>Finished
Note over C,S: 客户端立即可以加密发送
C->>S: Application Data (加密)
Note over C,S: 相比 TLS 1.2 节省 1 RTT
3.2 0-RTT 的可能性
TLS 1.3 还支持 0-RTT:
sequenceDiagram
participant C as 客户端
participant S as 服务端
Note over C,S: 首次连接: 1 RTT
C->>S: ClientHello + Early Data<br/>加密的应用数据
S->>C: ServerHello + Finished
Note over C,S: 后续连接: 0 RTT(使用之前会话密钥)
注意:0-RTT 存在重放攻击风险。
四、为什么 HTTPS 比 HTTP 慢这么多?
4.1 延迟对比
| 协议 | 连接建立 | 首次请求延迟 |
|---|---|---|
| HTTP | 1 RTT (TCP) | 1 RTT |
| HTTPS (TLS 1.2) | 1 RTT (TCP) + 2 RTT (TLS) | 3 RTT |
| HTTPS (TLS 1.3) | 1 RTT (TCP) + 1 RTT (TLS) | 2 RTT |
| HTTPS (TLS 1.3 + 0-RTT) | 0 RTT | 0 RTT(后续请求) |
4.2 性能影响
flowchart LR
HTTP[HTTP] -->|1 RTT| H1[总延迟低]
HTTPS12[TLS 1.2 HTTPS] -->|3 RTT| H2[总延迟高]
HTTPS13[TLS 1.3 HTTPS] -->|2 RTT| H3[总延迟中]
style HTTP fill:#9f9
style HTTPS13 fill:#ff9
style HTTPS12 fill:#f96
五、HTTPS 优化策略
5.1 启用 TLS 1.3
# Nginx 配置 TLS 1.3ssl_protocols TLSv1.3;
# TLS 1.3 是默认开启的5.2 会话复用
# 启用会话票据ssl_session_cache shared:SSL:10m;ssl_session_timeout 1d;ssl_session_tickets on;sequenceDiagram
participant C as 客户端
participant S as 服务端
Note over C,S: 首次连接: 2 RTT
C->>S: ClientHello (Session ID)
S->>C: ServerHello + 会话票据
Note over C,S: 后续连接: 1 RTT
C->>S: ClientHello (Session Ticket)
S->>C: NewSessionTicket
5.3 OCSP Stapling
# 启用 OCSP Staplingssl_stapling on;ssl_stapling_verify on;resolver 8.8.8.8;作用:省去客户端验证证书时的 OCSP 查询。
5.4 HTTP/2 和 HTTP/3
flowchart LR
subgraph HTTP/1.1
H1[请求 1] --> R1[响应 1]
H1 -->|串行| H2[请求 2]
end
subgraph HTTP/2
H3[请求 1] --> R3[响应 1]
H3 -->|并行| H4[请求 2]
end
六、实际延迟数据
6.1 全球平均延迟
| 指标 | 数值 |
|---|---|
| 光速延迟(美国-欧洲) | ~30ms |
| TLS 1.2 握手 | ~60ms |
| TLS 1.3 握手 | ~30ms |
| TLS 1.3 0-RTT | 0ms |
6.2 优化收益
# 未优化 HTTPS总延迟 = DNS + TCP + TLS + HTTP = 30ms + 30ms + 60ms + 30ms = 150ms
# TLS 1.3 优化后总延迟 = DNS + TCP + TLS + HTTP = 30ms + 30ms + 30ms + 30ms = 120ms
# TLS 1.3 + 0-RTT + HTTP/3总延迟 = DNS + QUIC + HTTP = 30ms + 0ms + 30ms = 60ms七、总结
HTTPS 握手延迟的原因:
| 原因 | 说明 |
|---|---|
| TCP 握手 | 1 RTT 不可省略 |
| TLS 协商 | 密码套件协商、密钥交换 |
| 证书验证 | 需要验证证书链 |
| 加密计算 | CPU 加密/解密开销 |
优化策略:
- 启用 TLS 1.3(1 RTT 握手)
- 启用会话复用
- 启用 OCSP Stapling
- 使用 HTTP/2 或 HTTP/3
参考资料
- TLS 1.3 RFC — TLS 1.3 标准
- Google Chrome HTTPS Performance — HTTPS 性能分析
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
为什么 HTTPS 需要 7 次握手以及 9 倍时延
https://blog.souloss.com/posts/why-the-design/why-https-needs-7-handshakes-and-9x-latency/ 部分信息可能已经过时
相关文章 智能推荐
1
为什么 HTTPS 需要证书
技术科普 深入理解 PKI 证书体系的设计原理,掌握 HTTPS 安全认证的核心机制。
2
为什么使用 MD5 存储密码非常危险
技术科普 深入解析 MD5 用于密码存储的危险性,彩虹表攻击,密码哈希的正确方式。
3
TLS 握手实战:从自建 CA 到抓包分析
密码学与安全工程 综合性实战——从零构建 PKI 证书体系、配置 TLS 服务器、用 s_client 和 Python 分析 TLS 1.3 与 TLS 1.2 握手的每一个细节。
4
TLS 1.3 握手详解
密码学与安全工程 深入 TLS 1.3——握手流程、0-RTT、密钥派生、与 TLS 1.2 对比。
5
为什么 WebSocket 需要握手
技术科普 深入解析 WebSocket 握手协议的设计原理,理解从 HTTP 到 WebSocket 的协议升级机制。






