CLOSE_WAIT状态 生产过程分析
上一篇 / 下一篇 2011-06-14 22:26:27 / 个人分类:HTTP
首先我们知道,如果我们的服务器程序APACHE,nginx,resin处于CLOSE_WAIT状态的话,说明套接字是被动关闭的!
,a+Grhb:@p5r,i:}.D0因为如果是CLIENT端主动断掉当前连接的话,那么双方关闭这个TCP连接共需要四个packet:51Testing软件测试网k6a|;C4z,@
Client —> FIN —> ServerClient <— ACK <— Server
b1w0\R&Q0L8QE0这时候Client端处于FIN_WAIT_2状态;而Server 程序处于CLOSE_WAIT状态。
.sJ O)g$kgm0Client <— FIN <— Server
#Fs!uq \8V^ QQ/bB0这时Server 发送FIN给Client,Server 就置为LAST_ACK状态。51Testing软件测试网1|!I0NrkD l)\
Client —> ACK —> Server51Testing软件测试网F/VmF_ p L
Client回应了ACK,那么Server 的套接字才会真正置为CLOSED状态。
7R3Ws&No ]0Server 程序处于CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Client,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。51Testing软件测试网F mu#x9{ L9V"c
vi /etc/sysctl.conf 添加51Testing软件测试网/B rY3ub-R)zL't-|_S
net.ipv4.tcp_fin_timeout = 351Testing软件测试网6w1J%d+o\
net.ipv4.tcp_keepalive_time = 360
w^x U4NM8]2Q#{0net.ipv4.tcp_syncookies = 151Testing软件测试网@xeQ!Nk6k
net.ipv4.tcp_tw_reuse = 1
Zf4h6[H9z|0net.ipv4.tcp_tw_recycle = 151Testing软件测试网$G,F-\Lfl:U&{(d1~M
net.ipv4.ip_local_port_range = 1024 65000
FU?U E;FDW0net.ipv4.tcp_max_syn_backlog = 8192
Hc#E2ss-le0net.ipv4.tcp_max_tw_buckets = 5000
8w%?bd9i"~i4i0执行命令生效
Ar(AC:A0/sbin/sysctl -p
tZe1i?0说明:51Testing软件测试网b9Mv$tX
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;51Testing软件测试网H a0kHAKL4B;`
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;51Testing软件测试网4R5yX3KE
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
]KpK h6C t @S0net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。51Testing软件测试网nfFl"f/a
net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。51Testing软件测试网sEN(_N#z
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。51Testing软件测试网0K3S0J \S&U'Y:E
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。51Testing软件测试网Yj1?#r,z&b
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
G5pXPx-f0linux系统中 /proc/sys/net/ipv4/下各项的意义
&v uNe;eD0tcp_syn_retries :INTEGER
jY |z"pq|5k$H%S0默认值是551Testing软件测试网JsfL-]HZ]1@
对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)51Testing软件测试网7ZH o7Kdrt0h
tcp_synack_retries :INTEGER51Testing软件测试网v F;a.fK-Ua%x
默认值是5
pB QRF Q0对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据上面的 tcp_syn_retries 来决定这个值)51Testing软件测试网#jQRlj Z,C A&{+\1j
tcp_keepalive_time :INTEGER
$Y#n*I%Ze)\0默认值是7200(2小时)51Testing软件测试网9K7[$cm1k"t%iy
当keepalive打开的情况下,TCP发送keepalive消息的频率。(由于目前网络攻击等因素,造成了利用这个进行的攻击很频繁,曾经也有cu的朋友提到过,说如果2边建立了连接,然后不发送任何数据或者rst/fin消息,那么持续的时间是不是就是2小时,空连接攻击? tcp_keepalive_time就是预防此情形的.我个人在做nat服务的时候的修改值为1800秒)51Testing软件测试网/@ r2lU5n:H
tcp_keepalive_probes:INTEGER51Testing软件测试网+Kg%Y/TGu
默认值是9
#U,|_#i6g"U0TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)
/C'ZU`8p(sP7P9g v0tcp_keepalive_intvl:INTEGER
A e8SN }@2f+l0默认值为7551Testing软件测试网1a]Rcr:{+pB
探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)
MDwB5t0tcp_retries1 :INTEGER
*~h;G7@b:G9d,z0默认值是3
ohg#R$uU1a-_ \0放弃回应一个TCP连接请求前﹐需要进行多少次重试。RFC 规定最低的数值是3﹐这也是默认值﹐根据RTO的值大约在3秒 – 8分钟之间。(注意:这个值同时还决定进入的syn连接)
7w T EO{(}0tcp_retries2 :INTEGER
k#~*E8z"d4PV3Ph `4AL0默认值为1551Testing软件测试网D&h#T,q[2[.@]+s
在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)51Testing软件测试网4j [%wI)cg&p)wIg0{
tcp_orphan_retries :INTEGER51Testing软件测试网7]IRtS(T$`w
默认值是7
%oJ$~~;h,U0在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是7个﹐相当于 50秒 – 16分钟﹐视 RTO 而定。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源。另外参的考 tcp_max_orphans 。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为3)51Testing软件测试网5LZ0`/Z;Y
tcp_fin_timeout :INTEGER51Testing软件测试网FOJi&KtqQc _
默认值是 60
PoO0CW_i0对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在2.2版本的内核中是 180 秒。您可以设置该值﹐但需要注意﹐如果您的机器为负载很重的web服务器﹐您可能要冒内存被大量无效数据报填满的风险﹐FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1 ﹐因为它们最多只吃 1.5K 的内存﹐但是它们存在时间更长。另外参考 tcp_max_orphans。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为30)
C-@+Yr5c9HBT0tcp_max_tw_buckets :INTEGER51Testing软件测试网 YF)}RQ DP#H
默认值是18000051Testing软件测试网'G;}Di'gE(w|
系 统在同时所处理的最大 timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要人为的降低这个限制﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。(事实上做NAT的时候最好可以适当地增加该值)51Testing软件测试网Eb+l|E0O
tcp_tw_recycle :BOOLEAN51Testing软件测试网i1|&e.?zL V
默认值是0
/h:e^1h!C]m$pw0打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求﹐请不要随意修改这个值。(做NAT的时候,建议打开它)51Testing软件测试网 u6SIm|3@F
tcp_tw_reuse:BOOLEAN
3`;I`.iOk&TS1w0默认值是051Testing软件测试网-D}1Ez,J@({
该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)51Testing软件测试网/Efg.Y5H7g1nu
tcp_max_orphans :INTEGER51Testing软件测试网Yg sW+` | r7A
缺省值是819251Testing软件测试网W{4B Is
系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)