linux内核网络TIME_WAIT

Posted 为了维护世界和平_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 1254
TIME_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 - INTEGER
	Maximal number of timewait sockets held by system simultaneously.
	If this number is exceeded time-wait socket is immediately destroyed
	and warning is printed. This limit exists only to prevent
	simple 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 - INTEGER
	Enable reuse of TIME-WAIT sockets for new connections when it is
	safe from protocol viewpoint.
	0 - disable
	1 - global enable
	2 - enable for loopback traffic only
	It should not be changed without advice/request of technical
	experts.
	Default: 2

5、SO_REUSEADDR

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

参考

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


以上是关于linux内核网络TIME_WAIT的主要内容,如果未能解决你的问题,请参考以下文章

Linux网络tcp连接大量CLOSE_WAIT和TIME_WAIT状态的出现和解决方法

Linux内核优化

Linux下TIME_WAIT连接优化内核参数tcp_tw_reuse与tcp_tw_recycle区别与联系浅析

linux内核—进程调度时机

linux内核参数调优

内核 TCP 参数调优