其他
HTTPS 的 7 次握手以及 9 倍时延
The following article is from 真没什么逻辑 Author Draveness
TCP 协议 — 通信双方通过三次握手建立 TCP 连接[^4]; TLS 协议 — 通信双方通过四次握手建立 TLS 连接[^5]; HTTP 协议 — 客户端向服务端发送请求,服务端发回响应;
TCP
客户端向服务端发送带有 SYN
的数据段以及客户端开始发送数据段(Segment)的初始序列号SEQ = 100
;服务端收到数据段时,向客户端发送带有 SYN
和ACK
的数据段;通过返回 ACK = 101
确认客户端数据段的初始序列号;通过发送 SEQ = 300
通知客户端,服务端开始发送数据段的初始序列号;客户端向服务端发送带有 ACK
的数据段,确认服务端的初始序列号,其中包含ACK = 301
;
SYN
消息时会携带快启选项,服务端会生成一个 Cookie 并将其发送至客户端,客户端会缓存该 Cookie,当其与服务端重新建立连接时,它会使用存储的 Cookie 直接建立 TCP 连接,服务端验证 Cookie 后会向客户端发送 SYN
和 ACK
并开始传输数据,这也就能减少通信的次数。TLS
客户端向服务端发送 Client Hello 消息,其中携带客户端支持的协议版本、加密算法、压缩算法以及客户端生成的随机数; 服务端收到客户端支持的协议版本、加密算法等信息后; 向客户端发送 Server Hello 消息,并携带选择特定的协议版本、加密方法、会话 ID 以及服务端生成的随机数; 向客户端发送 Certificate 消息,即服务端的证书链,其中包含证书支持的域名、发行方和有效期等信息; 向客户端发送 Server Key Exchange 消息,传递公钥以及签名等信息; 向客户端发送可选的消息 CertificateRequest,验证客户端的证书; 向客户端发送 Server Hello Done 消息,通知服务端已经发送了全部的相关信息; 客户端收到服务端的协议版本、加密方法、会话 ID 以及证书等信息后,验证服务端的证书; 向服务端发送 Client Key Exchange 消息,包含使用服务端公钥加密后的随机字符串,即预主密钥(Pre Master Secret); 向服务端发送 Change Cipher Spec 消息,通知服务端后面的数据段会加密传输; 向服务端发送 Finished 消息,其中包含加密后的握手信息; 服务端收到 Change Cipher Spec 和 Finished 消息后; 向客户端发送 Change Cipher Spec 消息,通知客户端后面的数据段会加密传输; 向客户端发送 Finished 消息,验证客户端的 Finished 消息并完成 TLS 握手;
HTTP
总结
TCP 协议需要通过三次握手建立 TCP 连接保证通信的可靠性(1.5-RTT); TLS 协议会在 TCP 协议之上通过四次握手建立 TLS 连接保证通信的安全性(2-RTT); HTTP 协议会在 TCP 和 TLS 上通过一次往返发送请求并接收响应(1-RTT);
作为传输层协议,QUIC 协议和 TCP 协议之间有什么异同? 为什么可以通过 0-RTT 建立客户端和服务端的连接?
推荐阅读:
好文章,我 在看