TLS 1.2 握手过程中的 RTT 次数
TLS 1.2
握手通常需要2 RTT
才能完成。具体步骤如下:
-
第一次 RTT:
- 客户端发送 ClientHello:客户端生成一个随机数(Client Random)并发送
ClientHello
消息。 - 服务器响应 ServerHello:服务器生成一个随机数(Server Random),选择加密套件,发送
ServerHello
消息,可能还包括Certificate
、ServerKeyExchange
、CertificateRequest
和ServerHelloDone
消息。
- 客户端发送 ClientHello:客户端生成一个随机数(Client Random)并发送
-
第二次 RTT:
- 客户端响应 ServerHelloDone:客户端发送
ClientKeyExchange
、ChangeCipherSpec
和Finished
消息。 - 服务器完成握手:服务器接收
ClientKeyExchange
、ChangeCipherSpec
和Finished
消息,并发送ChangeCipherSpec
和Finished
消息。
- 客户端响应 ServerHelloDone:客户端发送
TLS 1.3 1-RTT 初次
TLS 1.3 握手过程中通常只需要 1 个 RTT 即可完成
-
第一次 RTT:
- 客户端发送 ClientHello:客户端生成一个随机数(Client Random),发送
ClientHello
消息,其中包括支持的加密套件列表、协议版本等信息,并附带公钥信息用于密钥交换。如果是 0-RTT 握手,还可以包含早期数据。 - 服务器响应 ServerHello:服务器生成一个随机数(Server Random),选择加密套件,发送
ServerHello
消息,可能包括EncryptedExtensions
、Certificate
、CertificateVerify
和Finished
消息。
- 客户端发送 ClientHello:客户端生成一个随机数(Client Random),发送
-
客户端完成握手:
- 客户端发送 Finished:客户端接收服务器的
ServerHello
消息后,立即发送Finished
消息,完成握手。
- 客户端发送 Finished:客户端接收服务器的
TLS1.3 0-RTT 握手过程
零往返时间
:在传统的握手过程中,客户端需要等待至少一个往返时间(RTT)才能发送数据。但是在 0-RTT 握手中,客户端可以在发送 ClientHello 消息的同时发送应用数据
,而不需要等待服务器的响应。这意味着从客户端开始握手到发送数据的过程中,不需要等待任何往返,故称为 0-RTT
-
0-RTT 数据发送:
- 客户端发送 ClientHello 和早期数据:客户端发送
ClientHello
消息,并附带早期数据
和之前会话的会话票据。
- 客户端发送 ClientHello 和早期数据:客户端发送
-
服务器处理 ClientHello 和早期数据:
- 服务器响应 ServerHello:服务器验证会话票据,恢复会话密钥,发送
ServerHello
消息,处理早期数据,并发送Finished
消息。
- 服务器响应 ServerHello:服务器验证会话票据,恢复会话密钥,发送
-
客户端完成握手:
- 客户端发送 Finished:客户端接收
ServerHello
消息后,发送Finished
消息,完成握手。
- 客户端发送 Finished:客户端接收
在 0-RTT 握手过程中,客户端可以在握手开始时就发送应用数据
,从而实现 0 个 RTT 的数据传输延迟。
总结
- TLS 1.2:通常需要 2 个 RTT 才能完成握手。
- TLS 1.3:通常只需要 1 个 RTT 即可完成握手。
- TLS 1.3(0-RTT):支持 0 个 RTT 数据传输(在之前已有会话的情况下)。