TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个过程通常需要四个步骤:
- 第一次挥手 (FIN): 客户端(或首先发起关闭的一方)发送一个FIN报文段,表示其数据已发送完毕,请求关闭连接。客户端进入FIN_WAIT_1状态。 (Seq=X)
- 第二次挥手 (ACK): 服务器收到FIN后,发送一个ACK报文段作为确认。服务器进入CLOSE_WAIT状态。客户端收到ACK后,进入FIN_WAIT_2状态。 (Ack=X+1, Seq=Y)
- 第三次挥手 (FIN): 当服务器也准备好关闭连接时(其数据已发送完毕),它会发送一个FIN报文段给客户端。服务器进入LAST_ACK状态。 (FIN=1, Ack=X+1, Seq=Y)
- 第四次挥手 (ACK): 客户端收到服务器的FIN后,发送一个ACK报文段进行确认。客户端进入TIME_WAIT状态(等待一段时间以确保服务器收到ACK),之后进入CLOSED状态。服务器收到ACK后,进入CLOSED状态。连接断开。 (Ack=Y+1, Seq=X+1)
标志位说明:
- FIN (Finish): 表示发送方数据发送完毕,请求关闭连接。
- ACK (Acknowledge): 确认收到的数据。