linux内核网络TIME_WAIT
Posted 为了维护世界和平_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内核网络TIME_WAIT相关的知识,希望对你有一定的参考价值。
目录
1、将系统值(net.ipv4.tcp_max_tw_buckets)调小
四次挥手过程
TCP 连接终止时,主机 1 先发送 FIN 报文,主机 2 进入 CLOSE_WAIT 状态,并发送一个 ACK 应答,同时,主机 2 通过 read 调用获得 EOF,并将此结果通知应用程序进行主动关闭操作,发送 FIN 报文。主机 1 在接收到 FIN 报文后发送 ACK 应答,此时主机 1 进入 TIME_WAIT 状态。
过了2MSL时间之后,主机 1 就进入 CLOSED 状态。
出现的现象
1、大量短连接存在TIME_WAIT
2、Too 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 的作用
- 确保对方能够正确收到最后的ACK,帮助其关闭
- 防迷走报文对程序带来的影响
TIME_WAIT副作用
- 第一是内存资源占用,比较小
- 端口资源占用,如果 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状态的出现和解决方法