HTTP 和 HTTPS 是互联网通信中广泛使用的两种协议,它们在数据传输的安全性、连接建立过程和性能方面存在显著差异。HTTP 协议基于 TCP 连接,提供明文数据传输,而 HTTPS 在 HTTP 的基础上引入了 TLS/SSL 加密层,确保数据在传输过程中的机密性和完整性。以下将详细阐述 TCP 连接的三次握手与四次挥手过程,以及 TLS 握手的机制,帮助理解这两种协议的工作原理和区别。
TCP 三次握手
TCP 是一种面向连接的可靠传输协议,在数据传输开始前,客户端和服务器需要通过三次握手建立连接。这个过程确保双方能够同步序列号和确认号,为后续的数据交换做好准备。具体步骤如下:
第一次握手(SYN):客户端向服务器发送一个 SYN(同步)包,其中包含初始序列号(ISN),表示客户端希望建立连接并开始通信。
第二次握手(SYN-ACK):服务器收到 SYN 包后,响应一个 SYN-ACK 包,其中包含服务器的初始序列号以及对客户端序列号的确认(ACK)。这表明服务器同意建立连接。
第三次握手(ACK):客户端收到 SYN-ACK 包后,发送一个 ACK 包,确认服务器的序列号。至此,TCP 连接正式建立,双方可以开始数据传输。
三次握手不仅建立了连接,还协商了初始序列号,用于后续数据包的顺序控制和重传机制,确保传输的可靠性。
TLS 握手
HTTPS 在 TCP 连接建立后,会进行 TLS(传输层安全)握手,以协商加密参数、验证身份并生成会话密钥。TLS 握手通常需要 2 到 4 次往返通信,具体步骤可能因配置(如是否启用会话恢复或客户端认证)而略有不同。以下是典型的 TLS 握手过程:
ClientHello:客户端向服务器发送 ClientHello 消息,其中包括支持的 TLS 版本、加密套件列表、随机数以及会话 ID(用于会话恢复)。
ServerHello:服务器响应 ServerHello 消息,选择双方都支持的 TLS 版本和加密套件,并发送服务器的随机数。此外,服务器会发送其数字证书,以验证身份。
证书验证与密钥交换:客户端验证服务器的证书(例如,检查证书链和有效期)。验证通过后,客户端生成预主密钥(Pre-Master Secret),使用服务器的公钥加密后发送给服务器。
Finished 消息:服务器使用私钥解密预主密钥,双方根据预主密钥、客户端随机数和服务器随机数生成相同的会话密钥。随后,客户端和服务器交换 Finished 消息,使用会话密钥加密,以确认握手完成且密钥一致。
TLS 握手确保了通信的保密性和完整性,同时通过数字证书提供了身份认证功能。如果启用客户端认证,服务器可能还会请求客户端的证书,增加额外的验证步骤。
TCP 四次挥手
当数据传输完成或连接需要关闭时,TCP 通过四次挥手过程优雅地终止连接。这个过程确保双方都有足够的时间处理未完成的数据传输和确认。具体步骤如下:
第一次挥手(FIN):主动关闭方(通常是客户端)发送 FIN 包,表示不再发送数据,但可能还会接收数据。
第二次挥手(ACK):被动关闭方(服务器)收到 FIN 包后,发送 ACK 包作为确认,但可能继续发送未完成的数据。
第三次挥手(FIN):被动关闭方完成数据发送后,发送 FIN 包,表示也不再发送数据。
第四次挥手(ACK):主动关闭方收到 FIN 包后,发送 ACK 包作为确认。连接进入 TIME_WAIT 状态,等待可能出现的延迟数据包,最终连接关闭。
四次挥手确保了连接的双向关闭,避免了数据丢失或半开连接的问题。
性能与安全考量
HTTP 由于缺乏加密,数据传输为明文,容易受到窃听和篡改,因此适用于非敏感信息的传输。HTTPS 通过 TLS 加密提供了更高的安全性,但握手过程增加了延迟和计算开销。优化手段如会话恢复、OCSP Stapling 和 TLS 1.3 的简化握手有助于减少性能影响。