HTTP和HTTPS的三次握手和挥手(超详细)

3 阅读4分钟

一、HTTP 的三次握手(TCP 连接建立)

HTTP 是基于 TCP 的协议,三次握手是 TCP 建立可靠连接的核心过程,目的是确保双方都能正常收发数据。

  1. 三次握手流程

第一次握手(客户端 → 服务器) 客户端发送一个 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  状态,连接建立成功。 类比:你回答“能听到!我们开始聊天吧!”

  1. 为什么需要三次握手?

防止历史连接干扰:若失效的旧 SYN 包因网络延迟到达服务器,三次握手能通过客户端的最终 ACK 判断是否接受该连接,避免资源浪费。 确认双方收发能力正常:两次握手只能确认客户端的发送能力和服务器的收发能力,第三次握手补齐了客户端的接收能力验证。

 

二、HTTP 的四次挥手(TCP 连接关闭)

四次挥手是 TCP 断开连接的过程,确保双方数据都传输完毕并有序关闭。

  1. 四次挥手流程

第一次挥手(客户端 → 服务器) 客户端发送 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 后立即关闭。 类比:你说“好的,再见!”,等待几秒后挂断。

  1. 为什么需要四次挥手?

双向关闭:TCP 是全双工协议,客户端和服务器需分别关闭自己的发送通道。 确保数据完整性:服务器可能需要时间处理剩余数据,不能立即关闭。

 

三、HTTPS 的特殊性:TLS/SSL 握手

HTTPS 在 TCP 三次握手后,需额外进行 TLS/SSL 握手(即安全层的“四次握手”),用于加密通信。

  1. TLS/SSL 握手流程

1. 客户端请求加密通信:客户端发送支持的加密算法列表和随机数。 2. 服务器返回证书和公钥:服务器发送数字证书(含公钥)和随机数,供客户端验证身份。 3. 客户端生成会话密钥:客户端用公钥加密一个随机生成的 会话密钥,发送给服务器。 4. 服务器解密会话密钥:服务器用私钥解密获取会话密钥,双方后续使用该密钥对称加密数据。

  1. HTTPS 与 HTTP 的关键区别

安全性:通过证书验证服务器身份,防止中间人攻击。 性能:TLS 握手增加 1-2 次往返时间(RTT),但数据传输阶段使用对称加密,效率高。

 

四、总结对比

步骤 HTTP HTTPS 连接建立 TCP 三次握手 TCP 三次握手 + TLS 四次握手 数据传输 明文 对称加密(会话密钥) 安全性 无加密,易被窃听/篡改 加密 + 身份验证 性能 高 略低(TLS 握手额外开销)

通过理解三次握手与四次挥手的机制,能更好地排查网络问题(如连接超时、端口占用等)。而 HTTPS 通过 TLS 握手弥补了 HTTP 的安全缺陷,成为现代互联网的标配。