以下是TCP连接状态迁移图:
主动关闭连接的一方(客户端和服务端都可以主动关闭连接)在收到被动关闭连接的一方发来的FIN包并发送ACK之后,会进入 TIME_WAIT
状态,并且在等待 2MSL
之后,连接状态进入 CLOSED
状态。
MSL(Maxinum Segment Lifetime)报文最大生存时间,TCP连接中,发往对端的报文最大生存时间,即经过该时间之后,可以认为报文不复存在。
等待2MSL是为了保证TCP连接断开时,被动关闭方能正确关闭连接,以及防止新旧连接的数据包发生混淆。
之所以是2MSL,而不是1MSL,因为需要保证最后一个ACK能到达对端,以及等待对端因未收到ACK而可能重传的FIN报文。
主动关闭方我们称之为A方,被动关闭方我们称之为B方。
根据以上过程可知,主动关闭方主动等待2MSL,主要为了防止其发送的对FIN包的ACK包响应可以通知到被动关闭方,保证被动关闭方关闭连接。
以下是控制连接断开的相关参数。
net.ipv4.tcp_orphan_retries
取值为被动关闭方FIN包的重试次数(我的CentOS7系统中设置为3次)net.ipv4.tcp_fin_timeout
通常设置为MSL,我的CentOS7系统中设置为30秒)我们知道FIN包重发的超时时间遵循指数避让原则,也就是说最后一个FIN包的重发时间间隔只要不超过2MSL,连接就能正常断开。通过设置FIN包合理的重试次数,以及MSL的时间,可以保证在2MSL时间内,当前连接中的所有报文失效。