图中“客户”与“服务器”是相对的!谁是客户谁又是服务器你说了算。

    图中显示了“TCP正常连接建立和终止”所对应的状态,那么TIME_WAIT的来由已经很清晰了。主动发起关闭的一方,关闭完成后会进入TIME_WAIT状态。

    TIME_WAIT自身并不会对系统有大的影响,但对于服务器系统来讲,当然是希望尽可能提高服务器性能。由于TIME_WAIT数量多会导致TimeWait数据表大,从而影响处理效率。建议设置如下:

    在文件“/etc/sysctl.conf ”中添加如下数据:

# ip_local_port_range为向外连接的端口范围。缺省为:32768到61000。可根据实际应用修改
net.ipv4.ip_local_port_range = 10000 65000

# tcp_fin_timeout为保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_fin_timeout = 30

# tcp_keepalive_time默认值是7200(2小时)。当keepalive打开的情况下,TCP发送keepalive消息的频率。(由于目前网络***等因素,造成了利用这个进行的***很频繁,曾经也有cu的朋友提到过,说如果2边建立了连接,然后不发送任何数据或者rst/fin消息,那么持续的时间是不是就是2小时,空连接***?tcp_keepalive_time就是预防此情形的.我个人在做nat服务的时候的修改值为1800秒)
net.ipv4.tcp_keepalive_time = 1200

# tcp_max_syn_backlog为SYN队列的长度,以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 8192

# tcp_max_tw_buckets为系统同时保持TIME_WAIT套接字的最大数量。当超过这个数字时,TIME_WAIT套接字将在系统日志报出警告。默认为180000
net.ipv4.tcp_max_tw_buckets = 5000

# tcp_syn_retries默认值是5。对于一个新建连接,内核要发送多少个SYN连接请求才决定放弃。不应该大于255,默认值是5,对应于180 秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)
net.ipv4.tcp_syn_retries = 2

# tcp_syncookies开启SYN Cookies。当SYN等待队列溢出时,启用cookies来处理,可防范少量SYN***,默认为0(关闭)。
net.ipv4.tcp_syncookies = 1

# tcp_synack_retries默认值是5。对于远端的连接请求SYN,内核会发送SYN+ACK数据报,以确认收到上一个SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的SYN+ACK数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据上面的tcp_syn_retries来决定这个值)
net.ipv4.tcp_synack_retries = 2

# tcp_tw_recycle开启TCP连接中TIME-WAIT sockets的快速回收,默认为0(关闭)。
net.ipv4.tcp_tw_recycle = 1

# tcp_tw_reuse将TIME-WAIT sockets重新用于新的TCP连接,默认为0(关闭)。
net.ipv4.tcp_tw_reuse = 1

    添加完成之后执行如下指令使配置生效

`sysctl -p`

 

     OK,这时再监控一下服务器的TimeWait数量吧:

watch -d -n 3 "netstat -n|awk "\''/^tcp/{++S[$NF]} END {for(a in S) print a,S[a]}'\';

    此时的TimeWait已完全在你的控制之中了 

    另外,Windows下TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟(即240秒),TIME_WAIT状态下的socket不能被回收使用。

    修改方法:在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters添加名为TcpTimedWaitDelay的DWORD键(譬如设置为60),以缩短TIME_WAIT的等待时间。注意重启系统!

    更多网络参数设置参考:Linux网络参数优化。