且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

TCP/IP之(三)四次挥手

更新时间:2022-09-22 12:12:07



关于TIME_WAIT:

从上图中可以看到TIME_WAIT状态是客户端受到服务器的FIN并且客户端并返回ACK之后处于的状态,当处于该状态时无法创建新连接,因为端口被占用。存在该状态的原因有2点:

  • 可靠的终止TCP连接,网络是不可靠的,如果服务器没有收到客户端的ACK,那么服务器将在超时之后重新发送FIN,那么客户端必须处于一个可接受的状态就是time_wait,如果直接closed那显然是收不到的。确保对方有充足的时间收到ACK。如果被动关闭的那方没有收到ACK,它会重新发送FIN,这正好是2个MSL。

  • 让后面的数据包不会和这个ACK包混在一起。因为有些路由器会缓存IP数据包。而且客户端连接服务器可能前后两次使用的相同端口这是有可能的,如果客户端不等2MSL而是直接关闭,然后又马上使用相同端口建立连接,连接建立后,刚好有之前连接的数据到达服务器,对于服务器来说无法判断是上一次的还是这一次的,所以等待2MSL也是为了让之前的数据在网络中消失。

1个MSL在Linux中是30秒。

TIME_WAIT主动发起断开的一方(可以是客户端主动断开也可以是服务器主动断开)。如果客户端一般不同担心,但是如果是服务器主动关闭连接则因为它总是使用相同端口比如80或者3306之类的,该端口上存在大量的TIME_WAIT状态连接则会影响后续新连接。所以当遇到这个问题的是可以设置内核参数来优化比如允许重复使用和快速回收。




      本文转自linuxjavachen  51CTO博客,原文链接:http://blog.51cto.com/littledevil/1965153,如需转载请自行联系原作者