← 返回首页

TCP 四次挥手

目的:安全地断开双向数据流。由于 TCP 是全双工的,关闭连接需要分别关闭“发送”和“接收”两个方向,因此通常需要四次交互。

过程图解:

  1. FIN (Client -> Server)
    1. 客户端调用 close(),发送 FIN=1,携带 seq = u。
    2. 状态变更:客户端进入 FIN_WAIT_1。
    3. 含义:“我没有数据要发了,准备关闭我这一侧的连接。”
  2. ACK (Server -> Client)
    1. 服务端收到 FIN,回复 ACK=1,ack = u + 1。
    2. 状态变更:服务端进入 CLOSE_WAIT;客户端收到后进入 FIN_WAIT_2。
    3. 含义:“收到你的关闭请求了,但我可能还有数据没发完,你先等着。”
    4. 注意:此时连接处于半关闭状态。客户端不能再发数据,但可以接收数据;服务端仍可发送数据。
  3. FIN (Server -> Client)
    1. 服务端数据发送完毕后,发送 FIN=1,携带 seq = v(可能中间传了一些数据,所以 seq 变了)。
    2. 状态变更:服务端进入 LAST_ACK。
    3. 含义:“我也没数据了,我也要关闭我这一侧的连接。”
  4. ACK (Client -> Server)
    1. 客户端收到 FIN,回复 ACK=1,ack = v + 1。
    2. 状态变更:客户端进入 TIME_WAIT;服务端收到后直接进入 CLOSED。
    3. 含义:“收到你的关闭请求,再见。”
    4. 关键点:客户端在发送完这个 ACK 后,不能立即关闭,必须等待一段时间(2MSL)才能进入 CLOSED。