mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
534 字
2 分钟
为什么 HTTPS 需要 7 次握手以及 9 倍时延
2023-06-18

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 延迟对比#

协议连接建立首次请求延迟
HTTP1 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 RTT0 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.3
ssl_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 Stapling
ssl_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-RTT0ms

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 加密/解密开销

优化策略

  1. 启用 TLS 1.3(1 RTT 握手)
  2. 启用会话复用
  3. 启用 OCSP Stapling
  4. 使用 HTTP/2 或 HTTP/3

参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

为什么 HTTPS 需要 7 次握手以及 9 倍时延
https://blog.souloss.com/posts/why-the-design/why-https-needs-7-handshakes-and-9x-latency/
作者
Souloss
发布于
2023-06-18
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时