linux内核网络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
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 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 的作用
- 确保对方能够正确收到最后的ACK,帮助其关闭
- 防迷走报文对程序带来的影响
TIME_WAIT副作用
- 第一是内存资源占用,比较小
- 端口资源占用,如果 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