4.15 HTTPS 中 TLS 和 TCP 能同时握手吗?
不可以同时进行,主要因为TCP协议的三次握手是需要进行双方收发能力的验证,而TLS基于TCP,所以必须先TCP三次握手再TLS握手
- 对于TLS1.2,握手基本需要4次,2-RTT完成握手
- 对于TLS1.3,握手基本需要2次,1-RTT完成握手
客户端和服务端都开启了 TCP Fast Open 功能,且 TLS 版本是 1.3,且客户端和服务端已经完成过一次通信。那么HTTPS 中的 TLS 握手过程可以同时进行三次握手是可以的
TLSv1.3
TLSv1.3 握手过程只需 1-RTT 的时间,它到整个握手过程,如下图:
TCP 连接的第三次握手是可以携带数据的,如果客户端在第三次握手发送了 TLSv1.3 第一次握手数据,是不是就表示「HTTPS 中的 TLS 握手过程可以同时进行三次握手」?。
不是的,因为服务端只有在收到客户端的 TCP 的第三次握手后,才能和客户端进行后续 TLSv1.3 握手。
TLSv1.3 还有个更厉害到地方在于会话恢复机制,在重连 TLvS1.3 只需要 0-RTT,用“pre_shared_key”和“early_data”扩展,在 TCP 连接后立即就建立安全连接发送加密消息,过程如下图:
TCP Fast Open + TLSv1.3
在前面我们知道,客户端和服务端同时支持 TCP Fast Open 功能的情况下,在第二次以后到通信过程中,客户端可以绕过三次握手直接发送数据,而且服务端也不需要等收到第三次握手后才发送数据。
如果 HTTPS 的 TLS 版本是 1.3,那么 TLS 过程只需要 1-RTT。
因此如果「TCP Fast Open + TLSv1.3」情况下,在第二次以后的通信过程中,TLS 和 TCP 的握手过程是可以同时进行的。
如果基于 TCP Fast Open 场景下的 TLSv1.3 0-RTT 会话恢复过程,不仅 TLS 和 TCP 的握手过程是可以同时进行的,而且 HTTP 请求也可以在这期间内一同完成。
