十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

使用netstat和awk命令来统计网络连接数

上一篇 / 下一篇  2010-09-04 12:25:50 / 个人分类:liunx相关

Shell写起来很简单,效果却很神奇,你可以先尝试执行一下这条命令:51Testing软件测试网wVv-u4]HN|+xO-B+R
51Testing软件测试网S6cz2URt0d4T
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'51Testing软件测试网O8l"{2Si~W

\s$f:cm1x*Bs8p%Y_QA0会得到类似下面的结果,具体数字会有所不同:
B!G Ate4D&hJ+f0
Nu.y3ln3fpOJ0LAST_ACK         151Testing软件测试网%Qb L)j~%Z:f
SYN_RECV         1451Testing软件测试网n&K0N:Y%K
ESTABLISHED      7951Testing软件测试网|9A![4WBn5R P ~f
FIN_WAIT1        28
K%w6@`o} W6m0FIN_WAIT2        351Testing软件测试网2T GR(j-|
CLOSING          5
VhKr4yy0TIME_WAIT        1669
C_y+doE6_&c0
"\ t4b%]0V(y0也就是说,这条命令可以把当前系统的网络连接状态分类汇总。51Testing软件测试网*P%a8bZ+V-f-p5p'A

PvSQ3{0状态:描述51Testing软件测试网ZGr@xbG'oq?
CLOSED:无连接是活动的或正在进行51Testing软件测试网\,v.K1D r4z3l
LISTEN:服务器在等待进入呼叫
}7v;_7JS0SYN_RECV:一个连接请求已经到达,等待确认51Testing软件测试网A3~kXIPZ
SYN_SENT:应用已经开始,打开一个连接
4D!jd1x$eDq5J0ESTABLISHED:正常数据传输状态
C n5j9n!fzR0FIN_WAIT1:应用说它已经完成
KSB` k0FIN_WAIT2:另一边已同意释放51Testing软件测试网mX'V {$w }
ITMED_WAIT:等待所有分组死掉51Testing软件测试网:j~"Gc{}`1K
CLOSING:两边同时尝试关闭
P3^H1V}r d0TIME_WAIT:另一边已初始化一个释放
6K.XdP Z6~O'e%o1h0LAST_ACK:等待所有分组死掉51Testing软件测试网*F;RgeiHDY

X,w#\/i3Eg0下面解释一下为啥要这样写:
%pfp(pM\2y\(Vfe~0q0
+Q'Y\4H T*K0一个简单的管道符连接了netstatawk命令。
/zlg V%_051Testing软件测试网$M"DYZ$FJ7Y
------------------------------------------------------------------51Testing软件测试网X\H6M3a7Ct!b i)X't
51Testing软件测试网\w1t fr1h
先来看看netstat:51Testing软件测试网-CQ-l#nL_,u

9FHiBD0netstat -n51Testing软件测试网4ofQJ6Qt%g i
51Testing软件测试网!i {~i bvj$VO&j&{
Active Internet connections (w/o servers)51Testing软件测试网%pY1`K*j b:C;X w
Proto Recv-Q Send-Q Local Address           Foreign Address         State51Testing软件测试网3^-Ih b&u"}#h3~~J
tcp        0      0 123.123.123.123:80      234.234.234.234:12345   TIME_WAIT51Testing软件测试网~3A0n| b#},_0n

0`M2d;ltDGR'K0你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。51Testing软件测试网 hz.@[^

$O7U0C4[4v3KZ0------------------------------------------------------------------51Testing软件测试网Sk5aKiu|+_Hk
51Testing软件测试网 Gl4n i0z
再来看看awk:51Testing软件测试网?yw a#n0X4l7[ Aax4Yk
51Testing软件测试网$I)O-E'H)FL ~S
/^tcp/
jm%b'H4`-\1N0滤出tcp开头的记录,屏蔽udp, socket等无关记录。
&N/i4P6GND[V5A9K0
y4sVM S+ex0state[]相当于定义了一个名叫state的数组51Testing软件测试网BN s _ |
51Testing软件测试网,@1bG"mIE3p
NF
0I-fer*p:jw0表示记录的字段数,如上所示的记录,NF等于6
v1n V a^^B}D051Testing软件测试网/W*BO:J5E#p"b;XV
$NF51Testing软件测试网R7e7[/K?$o ^5Qa?
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
#wxE+M6t2T!OW.u"fN9T051Testing软件测试网3O;k I)|3m7SR
state[$NF]表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数51Testing软件测试网!NRR4M:w5s+F(b
51Testing软件测试网8B)S]x[*X'\
++state[$NF]表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一51Testing软件测试网2b:P$MA+p"t ^ C'E
51Testing软件测试网OJn,H&k#x$~8@7IR
END51Testing软件测试网;~IG"lf?/[/z
表示在最后阶段要执行的命令
7F&e;}2BhnUM0
Q1]:q*j oY0for(key in state)
|V&J'{C9{$I0遍历数组
f|o(D9C#M0
| kF jq[0print key,"\t",state[key]打印数组的键和值,中间用\t制表符分割,美化一下。 
YX deZl O0
(PQ)qFx~"K051Testing软件测试网#lNDIf W~)X
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'51Testing软件测试网0Q!Xa9P H'lz.wg%h1A
51Testing软件测试网y/Dn;\.Cw/LI%b
状态:描述51Testing软件测试网O)@c)V qo
CLOSED:无连接是活动的或正在进行51Testing软件测试网$[S WwP4V?M
LISTEN:服务器在等待进入呼叫51Testing软件测试网'u1Y4J!J Y(r
SYN_RECV:一个连接请求已经到达,等待确认
cfbx5E`y-pu0SYN_SENT:应用已经开始,打开一个连接
K"R.Z` W9r6Wk0ESTABLISHED:正常数据传输状态51Testing软件测试网\f5B!\0v
FIN_WAIT1:应用说它已经完成51Testing软件测试网iuY%i*D+I
FIN_WAIT2:另一边已同意释放51Testing软件测试网TAy-g[#uU;w YE
ITMED_WAIT:等待所有分组死掉51Testing软件测试网pei|amB
CLOSING:两边同时尝试关闭
9@8_5v-o8xq0TIME_WAIT:另一边已初始化一个释放51Testing软件测试网q1Wi0kB@ a{!e
LAST_ACK:等待所有分组死掉51Testing软件测试网F;]0O aW C
51Testing软件测试网?W2ds-Han
51Testing软件测试网DU8HSmQ3r
如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,51Testing软件测试网iM6tW*}N
vim /etc/sysctl.conf
/n'[,ge&o4V0l0编辑文件,加入以下内容:
^7G*x:C ?Q"i0net.ipv4.tcp_syncookies = 151Testing软件测试网^2~3_[!O.E7D
net.ipv4.tcp_tw_reuse = 151Testing软件测试网~#[ No%r A0P7a
net.ipv4.tcp_tw_recycle = 151Testing软件测试网V0d ] J0RSI
net.ipv4.tcp_fin_timeout = 3051Testing软件测试网 c u:`3~9yMkFx9M#B
然后执行 /sbin/sysctl -p 让参数生效。51Testing软件测试网 [-We&]%W^V(n

'Q t1d&JJ;R&^0net.ipv4.tcp_syncookies = 1 表示开启SYN cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;51Testing软件测试网[f;di,n!i&\
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
p"s'N_ ~6QD%~P5G6Z0net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
_ ]8l&f.D k8A0net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间51Testing软件测试网'~n"^ E6Z9V }
51Testing软件测试网 W(]G,ps0m
下面附上TIME_WAIT状态的意义:51Testing软件测试网G,F#ZN!? t)a/D:T

E$V4gUxWM*[t0客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口51Testing软件测试网 [9Cd9F&QV&HDr
状态为TIME_WAIT
#J)tg!qW051Testing软件测试网$Pe+ZK#{[m]!qL
是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?51Testing软件测试网;{&?U;x u#Z#D'w&i,Q
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?
3A/|(u~Cm:y:j+~051Testing软件测试网Y:w!H X/_b7B
主动关闭的一方在发送最后一个 ack 后
p!sF1]P0就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
C3GFfa.ST0这个是TCP/IP必不可少的,也就是“解决”不了的。51Testing软件测试网,b@` G0~gw3O.lqX.k

0H_.h eI E0也就是TCP/IP设计者本来是这么设计的
9gUQL~h)VL}0主要有两个原因
2{,z4bv ^j01。防止上一次连接中的包,迷路后重新出现,影响新连接
)@$MJ-w#n4{ A0(经过2MSL,上一次连接中所有的重复包都会消失)51Testing软件测试网,G GR3iiQ7d@ro
2。可靠的关闭TCP连接
eE J7YX ih0在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
.o!M,SF'R1L1c'M.y0fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以51Testing软件测试网[h0c0[Xv*{
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
AX2xI g6_0
C5YQ:}o5~ w6cj0TIME_WAIT 并不会占用很大资源的,除非受到攻击。
|edH`'|G051Testing软件测试网d^teK1V
还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

TAG: awk netstat

 

评分:0

我来说两句

Open Toolbar