为什么在四次挥手的过程中一般都是客户端先发起呢?(TCP挥手时为什么要等2MSL?)

        在调试客户端和服务器端(使用TCP套接字)的代码时我发现,如果先结束服务器端后结束客户端,紧接着再重启服务器端就会出现绑定失败的错误 OSError: [Errno 98] Address already in use   等待一段时间后大概一分钟左右就能正常重启服务器端。为了找出这个问题的原因,我复习了TCP的十种状态以及四次挥手的详细过程,我的疑问得以解答同时这也解释了文章的题目,为什么在四次挥手的过程中一般是客户端先发起的。

                   TCP十种状态

        因为TCP是全双工的,所以客户端和服务端都可以先进行挥手。在socket编程中哪一方先执行close()操作,哪一方则先进行挥手(发送FIN包)。

        以客户端先挥手为例,在TCP处于TIME_WAIT状态时,客户端从TIME_WAIT状态到CLOSED状态需要2MSL,因为客户端要确定服务端收到了ACK,如果服务端没收到ACK,客户端则一定会在2MSL时间内再收到一次FIN。而在socket编程中客户端一般不需要绑定,而服务器端一般都要绑定,如果先结束服务器端则是服务器端先进行挥手操作,那么服务器端从TIME_WAIT到CLOSED状态则需要2MSL。这段时间服务器端绑定的端口号被占用了,套接字不会释放。所以这段时间重启了服务器之后,会出现绑定失败的错误OSError: [Errno 98] Address already in use。

注解:MSL是什么?

       MSL 是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。RFC 793中规定了MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

要详细了解TCP的三次握手和四次挥手推荐这篇文章。https://www.cnblogs.com/Jessy/p/3535612.html

猜你喜欢

转载自blog.csdn.net/Daputao_net/article/details/81255499