我们假定称主动关闭方为客户端,被动关闭方为服务端。
TCP4次挥手阶段,当客户端收到服务端发送的FIN(4次挥手的第三个报文),将维护一个2MSL时长的TIME_WAIT状态。
原因先看课本的答案:
- 可靠地实现TCP全双工连接的终止
- 允许老的重复分节在网络中消逝
对于1的理解:
客户端发送FIN时,客户端必须能够响应,让服务端能知道对方已经收到FIN报文,这样,服务端好进行一些工作,这样一个才能实现双工终止。
否则,不维护TIME_WAIT,则服务端发送FIN时,客户端将回复“RST”报文,这样,服务端会以为遇到了错误。
对2的理解:
TIME_WAIT防止关闭连接后,两端用相同的ip端口重新连接,导致老连接的迷途报文被新的连接收到而被误解(被误解可能以为对方要关闭连接)。
所以在2MSL(报文最大生存时间)的周期中,TCP将不给处于TIME_WAIT状态的socket建立新连接,这段时间内,足够迷途报文自生自灭。
那为什么是2MSL呢?
看下图:
当网络超好时,server发送FIN1给client,client进入TIME_WAIT的时间几乎与server一致。
当网络特别差时,server发送FIN2给client,client在MSL之后进入TIME_WAIT。
服务器的超时重传时间RTO一般小于MSL,我们看看最晚到达client的FIN报文是什么情况?对就是FIN3。
假设RTO为MSL(只是假设),FIN3在MSL之后发起,经过了MSL之后到达client。
如果第一个到达client的包是FIN1,则FIN1到达client之后恰好2MSL时间的时候,FIN3刚好到达client。
因为RTO<MSL,所以,FIN3到达client后,距离TIME_WAIT结束应该还是有点时间的。