TCP的四次挥手及为什么要等待2MSL
一、四次挥手的详述 1、假设Client端发起中断连接请求,也就是发送FIN报文。2、Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续
一、四次挥手的详述
1、假设Client端发起中断连接请求,也就是发送FIN报文,进入FIN_WAIT-1状态。意思是说:"我Client端没有数据要发给你了,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据”。
2、当Server端接到FIN报文后,先发送ACK,进入CLOSE_WAIT状态,进入半关闭状态。意思是:"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT-2状态,继续等待Server端的FIN报文。
3、当Server端确定数据已发送完成,则向Client端发送FIN报文,进入LAST_ACK状态,表示服务器不再发送数据。意思:"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。
4、Client端收到FIN报文后,发送一个ACK包作为确认。意思是:"我收到了,可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传“。
当Server端收到ACK后,就知道可以断开连接了。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
数据传输结束后,通信的双方都可释放连接,A和B都处于ESTABLISHED状态。
(A、B连接建立状态ESTABLISHED——A终止等待1状态FIN-WAIT-1——B关闭等待状态CLOSE-WAIT——A终止等待2状态FIN-WAIT-2——B最后确认状态LAST-ACK——A时间等待状态TIME-WAIT——B、A关闭状态CLOSED)
- 1)A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
- 2)B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
- 3)A收到B的ACK确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放FIN报文段。
- 4)B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。
- 5)A收到B的连接释放FIN报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。
二、为什么A在TIME-WAIT状态必须等待2MSL的时间?
MSL最长报文段寿命Maximum Segment Lifetime
两个理由:
1)保证A发送的最后一个ACK报文段能够顺利到达B。
2)防止“已失效的连接请求报文段”出现在本连接中。
- 1)这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,而A能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则B无法正常进入到CLOSED状态。
- 2)A在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
下面解释一下为什么要等待2MSL的时间:
-
确保网络中所有副本被丢弃: 在TCP中,MSL是一个数据包在网络中能够存活的最长时间。等待2MSL的时间可以确保网络中的所有副本都被丢弃。在这段时间内,如果有任何在网络中滞留的数据包被接收到,它们都会被丢弃,不会对新的连接产生影响。
-
防止旧连接的延迟数据包对新连接的影响: 在TCP连接的关闭过程中,可能存在一些延迟的数据包,这些数据包可能在网络中滞留一段时间。等待2MSL的时间可以确保任何旧连接的延迟数据包在新连接建立之前都能够被丢弃。
-
防止连接重用时的问题: 在TCP连接的TIME-WAIT状态结束后,系统可能会重新使用相同的本地端口和远程端口。等待2MSL的时间确保了在新连接建立之前,不会出现与之前连接相关的混淆或冲突。
三、服务器大量TIME_WAIT和CLOSE_WAIT的原因及解决办法
更多推荐
所有评论(0)