为什么在四次挥手的过程中一般都是客户端先发起呢?(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

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值