TCP释放连接的四次挥手
- 第一次:发送方向接收方发送FIN释放连接请求报文,进入第一个等待时间FIN-WAIT-1
- 第二次:接收方收到发送方的释放连接的请求,向发送方发送ack表示收到发送方的释放连接请求,但是还无法立即关闭,因为还要未完成处理的发送请求,因此进行关闭等待阶段,在这个期间接收方可以处理还未完成的发送请求;发送方收到接收方的第一次确认后进行第二次等待,等待它处理完发送请求(在这期间还可以进行数据的传输。)
- 接收方处理完成之后,向发送方发送释放连接请求表示自己已经可以执行释放连接操作,并且携带ack再次确认。然后进入最后确认等待,等待发送方的确认,如果没有收到接收方ack,那么会进行重传。
- 第四次:发送方收到接收方的再次确认,最后向接收方发送释放连接的确认。然后进行开启等待计时器(默认2MSL),在等待计时器期间是不会释放连接的(还会继续占用端口),最后等待计时器结束后,释放资源
MSL(Maximum Segment Lifetime),最长报文段寿命,它是任何报文在网络上存在的最长的最长时间,超过这个时间报文将被丢弃。一般建议设置为2分钟
为什么需要四次挥手?
因为不像建立连接的过程,接收方收到连接请求后可以立即发送SYN进行连接,释放资源时,接受方在收到发送方的释放连接请求后,还需要一段时间来处理未完成的发送请求,这里需要两次确认发送方的请求:第一次是未处理完,我还不能释放,但是收到了你的请求,告诉发送方一声,等等我;第二次确认表示已经处理完请求了,我也可以进行释放了。因此需要四次
为什么需要接收方最后需要等待2MSL
本质原因是网络是不可靠的,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果发送方的最后一次ack没有被接收方收到的话,那么接收方会进行重传第三次的释放连接请求,TIME_WAIT就是为了在这种情况下重发丢失了的ack报文。
也就是:
接收方等待最后一次ack+重发的第三次释放连接请求到达发送方的时间<=2MSL,因此需要等待2MSL。