> 文档中心 > linux内核网络TIME_WAIT

linux内核网络TIME_WAIT

目录

四次挥手过程

出现的现象

如何查看信息

TIME_WAIT状态等待的时间 

TIME_WAIT 的作用

TIME_WAIT副作用

解决方法

1、将系统值(net.ipv4.tcp_max_tw_buckets)调小

2、调低TCP_TIMEWAIT_LEN

3、SO_LINGER

4、net.ipv4.tcp_tw_reuse

5、SO_REUSEADDR


四次挥手过程

        TCP 连接终止时,主机 1 先发送 FIN 报文,主机 2 进入 CLOSE_WAIT 状态,并发送一个 ACK 应答,同时,主机 2 通过 read 调用获得 EOF,并将此结果通知应用程序进行主动关闭操作,发送 FIN 报文。主机 1 在接收到 FIN 报文后发送 ACK 应答,此时主机 1 进入 TIME_WAIT 状态。

过了2MSL时间之后,主机 1 就进入 CLOSED 状态。

出现的现象

1、大量短连接存在TIME_WAIT

2Too Many Open Files异常,服务崩溃等

如何查看信息

//查询 TCP 连接状态netstat -nat |grep TIME_WAIT//查看统计信息$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'ESTABLISHED 1254TIME_WAIT 1640

TIME_WAIT状态等待的时间 

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME- WAIT state, about 60 seconds  */

MSL,Maximum Segment Lifetime,“报文最大生存时间”

TIME_WAIT 停留持续时间是固定的,一般称之为 2MSL。

进入时机:发送了第四次握手的ACK包后,就进入了TIME_WAIT状态。

必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后,可以再发一个ACK应答包。

在 TIME_WAIT 状态时,两端的端口不能使用,要等到2MSL时间结束,才可继续使用。(IP 层)

当连接处于2MSL等待阶段时,任何迟到的报文段都将被丢弃。

只有发起连接终止的一方会进入 TIME_WAIT 状态。


TIME_WAIT 的作用

  1. 确保对方能够正确收到最后的ACK,帮助其关闭
  2. 防迷走报文对程序带来的影响

TIME_WAIT副作用

  1. 第一是内存资源占用,比较小
  2. 端口资源占用,如果 TIME_WAIT 状态过多,会导致无法创建新连接。

解决方法

        让服务器能够快速回收和重用那些TIME_WAIT的资源

1、将系统值(net.ipv4.tcp_max_tw_buckets)调小

TIME_WAIT的连接一旦超过此值,系统将会对所有的TIME_WAIT连接状态重置。

tcp_max_tw_buckets - INTEGERMaximal number of timewait sockets held by system simultaneously.If this number is exceeded time-wait socket is immediately destroyedand warning is printed. This limit exists only to preventsimple DoS attacks, you _must_ not lower the limit artificially,but rather increase it (probably, after increasing installed memory),if network conditions require more than default value.

2、调低TCP_TIMEWAIT_LEN

        重新编译内核

3、SO_LINGER

        设置套接字选项

int setsockopt(int sockfd, int level, int optname, const void *optval,        socklen_t optlen);

4、net.ipv4.tcp_tw_reuse

  •         可以复用处于 TIME_WAIT 的套接字为新的连接所用。
    •         适用于连接的发起方
      •         对应的TIME_WAIT状态的创建时间超过1s才可以被复用。

文档说明:

tcp_tw_reuse - INTEGEREnable reuse of TIME-WAIT sockets for new connections when it issafe from protocol viewpoint.0 - disable1 - global enable2 - enable for loopback traffic onlyIt should not be changed without advice/request of technicalexperts.Default: 2

5、SO_REUSEADDR

setsockopt设置SO_REUSEADDR这个方法;是解决端口复用的问题,并不是解决TIME_WAIT,这个是告诉内核,即使TIME_WAIT状态的套接字,可以继续使用它做为新的套集字使用。

参考

https://course.0voice.com/v1/course/intro?courseId=2&agentId=0