web服务器下出现大量TIME_WAIT

本文介绍了解决服务器因大量TIME_WAIT状态导致连接问题的方法。通过调整内核参数,如tcp_tw_reuse和tcp_tw_recycle,加快TIME_WAIT状态的资源回收,缓解连接积压问题。

查看系统的网络连接状态检测到服务器有大量的time_wait,决定优化内核参数试验下:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT        836   
FIN_WAIT1        2      
ESTABLISHED      47    
SYN_RECV         1     

状态:描述 
CLOSED:无连接是活动的或正在进行 
LISTEN:服务器在等待进入呼叫 
SYN_RECV:一个连接请求已经到达,等待确认 
SYN_SENT:应用已经开始,打开一个连接 
ESTABLISHED:正常数据传输状态 ,表示正通信
FIN_WAIT1:应用说它已经完成 
FIN_WAIT2:另一边已同意释放 
ITMED_WAIT:等待所有分组死掉 
CLOSING:两边同时尝试关闭 
TIME_WAIT:另一边已初始化一个释放 ,表示主动关闭    CLOSE_WAIT:被动关闭
LAST_ACK:等待所有分组死掉

在高并发短连接的server端,当处理完client请求后立刻closesocket此时会出现time_wait,client再并发2000个连接,此时部分连接则连接不上了。

time_wait状态,持续2*MSL(Max Segment Lifetime)两倍最大段生存期,MSL的值是2分钟,缺省240s,但是在实际的实现中,常用的值有以下三种:30秒,1分钟,2分钟。对于基于TCP的HTTP协议,关闭TCP连接的是Server端,这样,Server端会进入TIME_WAIT状态,可想而知,对于访问量大的Web Server,会存在大量的TIME_WAIT状态,假如server一秒钟接收1000个请求,那么就会积压240*1000=240,000个TIME_WAIT的记录

服务器保持了大量TIME_WAIT状态

这种情况比较常见,一些爬虫服务器或者WEB服务器(如果网管在安装的时候没有做内核参数优化的话)上经常会遇到这个问题,TIME_WAIT是主动关闭连接的一方保持的状态,对于爬虫服务器来说他本身就是“客户端”,在完成一个爬取任务之后,他就会发起主动关闭连接,从而进入TIME_WAIT的状态,然后在保持这个状态2MSL(max segment lifetime)时间之后,彻底关闭回收资源。为什么要这么做?明明就已经主动关闭连接了为啥还要保持资源一段时间呢?这个是TCP/IP的设计者规定的,主要出于以下两个方面的考虑:

1.防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2.可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。

#以下引用摘自网上的/etc/sysctl.conf文件的修改参考说明:
#对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃,不应该大于255,默认值是5,对应于180秒左右时间
net.ipv4.tcp_syn_retries=2
#net.ipv4.tcp_synack_retries=2
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为300秒
net.ipv4.tcp_keepalive_time=300
net.ipv4.tcp_orphan_retries=3
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout=30
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 4096
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1
#减少超时前的探测次数
net.ipv4.tcp_keepalive_probes=5
#优化网络设备接收队列
net.core.netdev_max_backlog=3000


目前的解决思路,就是让服务器能够快速回收和重用那些TIME_WAIT的资源,让每个TIME_WAIT早点过期。

#vim /etc/sysctl.conf 追加或修改两行参数

  net.ipv4.tcp_tw_reuse = 1 让TIME_WAIT状态可以重用,即使time_wait占满了所有端口,也不会拒绝新请求
  net.ipv4.tcp_tw_recycle = 1 让time_wait尽快回收,开启是为了加速回收处于TIME_WAIT状态的资源
#sysctl –p 使内核参数生效

注另外参数:

net.ipv4.tcp_tw_reusenet.ipv4.tcp_tw_recycle的开启都是为了加速回收处于TIME_WAIT状态的资源。
net.ipv4.tcp_fin_timeout这个时间可以减少在异常情况下服务器从FIN-WAIT-2转到TIME_WAIT的时间。
net.ipv4.tcp_keepalive_*一系列参数,是用来设置服务器检测连接存活的相关配置。
 

再用netstat查了下:

TIME_WAIT 2087  已从13695多降为2087,先试运行一段时间看看有无问题
ESTABLISHED 553
LAST_ACK 1
转载 http://iceeggplant.blog.51cto.com/1446843/699601

<think>嗯,用户想了解TCP连接中TIME_WAIT状态的概念和作用。这个问题属于网络协议底层细节,用户可能是开发人员或运维工程师,遇到了连接资源问题需要排查。 从引用内容看,TIME_WAIT是TCP四次挥手过程中的关键状态。引用[3][5]明确指出它出现在主动关闭方(如客户端),需要等待2MSL时间。引用[5]提到的"2MSL"概念很重要,MSL是报文最大生存时间,通常30秒到2分钟。 核心作用有两个层面:首先是防止旧连接的数据包干扰新连接(引用[3][5]都强调了四元组复用问题),其次是确保被动关闭方收到最终ACK(引用[4]提到这是为了可靠关闭)。引用[2]补充了实际影响——高并发服务器可能积累大量TIME_WAIT导致资源压力。 用户可能隐含的诉求是解决服务器性能问题,所以需要强调"主动关闭方"这个关键点。对于Web服务器来说,如果它主动关闭连接就会产生TIME_WAIT,这点在引用[2]的HTTP场景有印证。另外要注意区分CLOSE_WAIT(引用[4]说明这是被动关闭方未处理完数据的状态),避免概念混淆。 需要补充说明MSL的取值差异(Linux默认60秒),以及为什么是2倍MSL——既要考虑报文往返时间,又要考虑重传可能性。虽然引用材料没提,但实际优化方案如tcp_tw_reuse也值得在相关问题里提及。</think>### TIME_WAIT状态的概念与作用 在TCP协议的四次挥手断开连接过程中,**TIME_WAIT状态是主动发起关闭连接的一方(通常是客户端或主动关闭的服务端)在发送最后一个ACK确认包后进入的状态**。该状态会持续 **2MSL**(Maximum Segment Lifetime,报文最大生存时间,通常30秒-2分钟)后才进入CLOSED状态[^3][^5]。 #### 核心作用: 1. **确保连接可靠关闭** - 若被动关闭方(如服务器)未收到最终ACK,会重发FIN包。 - TIME_WAIT状态使主动方保留连接信息,可重传ACK保证对方正确关闭[^3][^5]。 - 数学表达:设MSL为$T$,则等待时间$t_{\text{wait}} = 2T$。 2. **防止旧连接数据污染新连接** - 延迟到达的数据包可能被新建立的同四元组(源IP/端口 + 目标IP/端口)连接错误接收。 - 等待$2T$确保网络中所有旧连接报文失效[^3][^5]。 - 不等式约束:$t_{\text{wait}} > \text{数据包最大延迟}$。 #### 状态转移示意图: ```mermaid graph LR A[主动关闭方] -- FIN --> B[被动关闭方] B -- ACK --> A B -- FIN --> A A -- ACK + 进入TIME_WAIT --> B A -- 等待2MSL --> C[CLOSED] ``` #### 对系统的影响: - **资源占用问题**: 高并发场景(如Web服务器主动关闭连接时)会积累大量TIME_WAIT连接,消耗端口和内存资源[^2]。 计算示例:若QPS=1000,TIME_WAIT存活240秒,则最大积压量$N = 1000 \times 240 = 240,000$。 - **优化方案**: 可通过`tcp_tw_reuse`(允许重用TIME_WAIT连接)或调整`net.ipv4.tcp_max_tw_buckets`(限制数量)缓解[^2]。 --- ### 相关问题 1. TIME_WAIT状态为何需要等待**2倍MSL**而非1倍? 2. 服务器出现大量**CLOSE_WAIT**状态的可能原因和解决方法? 3. 如何通过内核参数优化高并发场景下的**TIME_WAIT连接数**? 4. TCP协议中**MSL的具体取值**在不同操作系统中有何差异? > 关键引用: > [^1]: TIME_WAIT状态设计原理分析 > [^2]: Web服务器TIME_WAIT的资源消耗问题 > [^3]: 防止延迟数据段和保证可靠关闭 > [^5]: 2MSL等待的双重目的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值