一、HTTP 的三次握手(TCP 连接建立)
HTTP 是基于 TCP 的协议,三次握手是 TCP 建立可靠连接的核心过程,目的是确保双方都能正常收发数据。
- 三次握手流程
第一次握手(客户端 → 服务器) 客户端发送一个 SYN 包(SYN=1),并携带一个随机生成的初始序列号 seq=x 。此时客户端进入 SYN_SENT 状态,表示“我要和你建立连接”。 类比:你打电话给朋友说“喂,能听到吗?”
第二次握手(服务器 → 客户端) 服务器收到 SYN 包后,回复 SYN+ACK 包(SYN=1, ACK=1),确认客户端的序列号为 ack=x+1 ,并携带自己的初始序列号 seq=y 。 此时服务器进入 SYN_RCVD 状态,表示“我收到你的请求了,我也要和你连接”。 类比:朋友回答“能听到!你能听到我吗?”
第三次握手(客户端 → 服务器) 客户端收到 SYN+ACK 包后,发送 ACK 包(ACK=1),确认服务器的序列号为 ack=y+1 。 此时双方进入 ESTABLISHED 状态,连接建立成功。 类比:你回答“能听到!我们开始聊天吧!”
- 为什么需要三次握手?
防止历史连接干扰:若失效的旧 SYN 包因网络延迟到达服务器,三次握手能通过客户端的最终 ACK 判断是否接受该连接,避免资源浪费。 确认双方收发能力正常:两次握手只能确认客户端的发送能力和服务器的收发能力,第三次握手补齐了客户端的接收能力验证。
二、HTTP 的四次挥手(TCP 连接关闭)
四次挥手是 TCP 断开连接的过程,确保双方数据都传输完毕并有序关闭。
- 四次挥手流程
第一次挥手(客户端 → 服务器) 客户端发送 FIN 包(FIN=1),表示“我要关闭连接了”,进入 FIN_WAIT_1 状态。 类比:你说“我要挂电话了”。
第二次挥手(服务器 → 客户端) 服务器收到 FIN 后,回复 ACK 包(ACK=1),确认客户端的请求,进入 CLOSE_WAIT 状态。 此时客户端到服务器的单向连接关闭,但服务器可能还有数据要发送。 类比:朋友回答“好的,稍等,我还有话要说”。
第三次挥手(服务器 → 客户端) 服务器发送完剩余数据后,发送 FIN 包(FIN=1),表示“我也要关闭连接了”,进入 LAST_ACK 状态。 类比:朋友说“我说完了,我也要挂电话了”。
第四次挥手(客户端 → 服务器) 客户端收到 FIN 后,回复 ACK 包(ACK=1),进入 TIME_WAIT 状态,等待 2MSL(最大报文生存时间)后关闭。 服务器收到 ACK 后立即关闭。 类比:你说“好的,再见!”,等待几秒后挂断。
- 为什么需要四次挥手?
双向关闭:TCP 是全双工协议,客户端和服务器需分别关闭自己的发送通道。 确保数据完整性:服务器可能需要时间处理剩余数据,不能立即关闭。
三、HTTPS 的特殊性:TLS/SSL 握手
HTTPS 在 TCP 三次握手后,需额外进行 TLS/SSL 握手(即安全层的“四次握手”),用于加密通信。
- TLS/SSL 握手流程
1. 客户端请求加密通信:客户端发送支持的加密算法列表和随机数。 2. 服务器返回证书和公钥:服务器发送数字证书(含公钥)和随机数,供客户端验证身份。 3. 客户端生成会话密钥:客户端用公钥加密一个随机生成的 会话密钥,发送给服务器。 4. 服务器解密会话密钥:服务器用私钥解密获取会话密钥,双方后续使用该密钥对称加密数据。
- HTTPS 与 HTTP 的关键区别
安全性:通过证书验证服务器身份,防止中间人攻击。 性能:TLS 握手增加 1-2 次往返时间(RTT),但数据传输阶段使用对称加密,效率高。
四、总结对比
步骤 HTTP HTTPS 连接建立 TCP 三次握手 TCP 三次握手 + TLS 四次握手 数据传输 明文 对称加密(会话密钥) 安全性 无加密,易被窃听/篡改 加密 + 身份验证 性能 高 略低(TLS 握手额外开销)
通过理解三次握手与四次挥手的机制,能更好地排查网络问题(如连接超时、端口占用等)。而 HTTPS 通过 TLS 握手弥补了 HTTP 的安全缺陷,成为现代互联网的标配。