TCP三次握手四次挥手

下面是 TCP 三次握手(建立连接)与四次挥手(断开连接)过程的详细解释,配合图示说明非常好理解👇


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

目的是:在客户端与服务端之间建立可靠连接,双方确认彼此的接收/发送能力

📶 过程如下:

步骤 发送方 接收方 描述
第一次握手 客户端 → 服务端 客户端发送 SYN 报文,随机一个初始序号 seq = x
第二次握手 服务端 → 客户端 服务端收到 SYN,回复 SYN+ACK 报文,seq = yack = x+1
第三次握手 客户端 → 服务端 客户端收到 SYN+ACK,回复 ACK 报文,ack = y+1

🔁 连接建立后,双方进入 ESTABLISHED 状态,开始数据传输。


🎯 三次握手目的:

  1. 双方都能发送、接收数据(双向通信)
  2. 初始化序列号,用于后续数据确认
  3. 防止旧连接误触(防止伪连接)

🔚 二、TCP 四次挥手(断开连接)

目的是:优雅地关闭连接,确保双方数据都收发完毕

📶 过程如下:

步骤 发送方 接收方 描述
第一次挥手 客户端 → 服务端 客户端发送 FIN 报文,请求关闭连接
第二次挥手 服务端 → 客户端 服务端收到 FIN,回复 ACK 报文
第三次挥手 服务端 → 客户端 服务端处理完数据后,发送自己的 FIN 报文
第四次挥手 客户端 → 服务端 客户端收到 FIN 后,回复 ACK,进入 TIME_WAIT 状态

🔁 服务器进入 CLOSED,客户端在 TIME_WAIT 状态保持一段时间(通常 2MSL),确保最后 ACK 能被收到。


🎯 为什么是“四次挥手”不是三次?


📉 总结对比表

名称 步数 关键字 双向确认 保证内容
三次握手 3 SYN / ACK 建立可靠连接
四次挥手 4 FIN / ACK 安全释放连接

🖼️ 简易图示(纯文字版):

三次握手:

客户端                        服务端
  | --- SYN (seq=x) ------> |
  |                         |
  | <-- SYN+ACK (seq=y) --- |
  |                         |
  | --- ACK (ack=y+1) ----> |

连接建立完成 ✅


四次挥手:

客户端                        服务端
  | --- FIN (seq=u) ------> |
  |                         |
  | <-- ACK (ack=u+1) ----- |
  |                         |
  | <-- FIN (seq=v) ------- |
  |                         |
  | --- ACK (ack=v+1) ----> |

连接断开 ✅


在Unix环境高级编程部分

你可以看见C函数各个socket编程函数操作与三次握手四次挥手的关系。

TCP 半关闭状态

一端发送 FIN 后,进入半关闭状态,表示该端不再发送数据但可接收。

另一端仍可发送数据直到自己关闭连接。