← 返回首页
TCP 四次挥手
目的:安全地断开双向数据流。由于 TCP 是全双工的,关闭连接需要分别关闭“发送”和“接收”两个方向,因此通常需要四次交互。
过程图解:
- FIN (Client -> Server)
- 客户端调用 close(),发送 FIN=1,携带 seq = u。
- 状态变更:客户端进入 FIN_WAIT_1。
- 含义:“我没有数据要发了,准备关闭我这一侧的连接。”
- ACK (Server -> Client)
- 服务端收到 FIN,回复 ACK=1,ack = u + 1。
- 状态变更:服务端进入 CLOSE_WAIT;客户端收到后进入 FIN_WAIT_2。
- 含义:“收到你的关闭请求了,但我可能还有数据没发完,你先等着。”
- 注意:此时连接处于半关闭状态。客户端不能再发数据,但可以接收数据;服务端仍可发送数据。
- FIN (Server -> Client)
- 服务端数据发送完毕后,发送 FIN=1,携带 seq = v(可能中间传了一些数据,所以 seq 变了)。
- 状态变更:服务端进入 LAST_ACK。
- 含义:“我也没数据了,我也要关闭我这一侧的连接。”
- ACK (Client -> Server)
- 客户端收到 FIN,回复 ACK=1,ack = v + 1。
- 状态变更:客户端进入 TIME_WAIT;服务端收到后直接进入 CLOSED。
- 含义:“收到你的关闭请求,再见。”
- 关键点:客户端在发送完这个 ACK 后,不能立即关闭,必须等待一段时间(2MSL)才能进入 CLOSED。