TCP/IP断开

在TCP/IP数据收发的过程中,这个过程是双向的,如果先完成数据发送的一方主动断开TCP/IP连接,例如A和B通讯,A先发送完数据,那么A先主动断开,这时A会发送一个FIN给B,A进入FIN_WAIT1。B接收到A发送过来的数据包后,进入了CLOSE_WAIT(被动关闭)。如果此时B还在收发数据,那么B会发送一个ACK确认报给A,A收到确认报后进入FIN_WAIT2,这也就是所谓的TCP的半关闭。直到B完成数据的收发,B发送一个FIN给A,此时B进入LAST_ACK状态,等待A发送ACK。A收到数据包之后,向B发送一个ACK,同时A进入TIME_WAIT状态,也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL。为什么这个时间是2MSL呢,其实这个时间设置成2MSL,主要是确认ACK是否丢失。因为B如果在一定的时间内没有收到A发送的确认数据包的话,会重新发送fin。B收到A发送的确认数据包之后,B进入的初始状态。由于A在内存中记录了IP、端口号的使用情况。在A处于TIME_WAIT状态时,直到TIME_WAIT结束时候,端口才能重新被使用。

在断开阶段也有可能会遇到同时断开的情况。A和B同时主动断开。A和B都发送FIN给对方。双方接收到对方发送的FIN数据包后,都向对方发送ack数据包。由于双方都是主动断开因此双方都进入TIME_WAIT状态,直到状态结束IP、端口才能重新被使用。

推荐文章