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

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

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

Shell写起来很简单,效果却很神奇,你可以先尝试执行一下这条命令:51Testing软件测试网U}Y5R#J2e3|B

c,H \]6HB0netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
T1V }/rZr0

Q-Q)g HUIxt0会得到类似下面的结果,具体数字会有所不同:
z @"UF&Q5C-[0
)oG8hi4X7Z s8C0LAST_ACK         1
8^1X:M1sJ8F%X%p$g#rJ1X0SYN_RECV         1451Testing软件测试网7GY:fhX _&T
ESTABLISHED      79
m1|J xpM`$fT_0FIN_WAIT1        2851Testing软件测试网Islkzj e KjZl N
FIN_WAIT2        351Testing软件测试网P`N)y$kfe
CLOSING          551Testing软件测试网} g:[n1h9[5` R9`!~J
TIME_WAIT        166951Testing软件测试网+pm/t9H&l7Emr

?-h`;u&oM'LVK c4I0也就是说,这条命令可以把当前系统的网络连接状态分类汇总。
"g2F0d e}1kS051Testing软件测试网0~@$]I0p#F%u
状态:描述51Testing软件测试网$_;t~6EZ E:Kyv
CLOSED:无连接是活动的或正在进行
d'N`F6B0LISTEN:服务器在等待进入呼叫51Testing软件测试网5p,k0W4`7Y
SYN_RECV:一个连接请求已经到达,等待确认51Testing软件测试网V3uh*t2o xxB
SYN_SENT:应用已经开始,打开一个连接51Testing软件测试网 @W SM,V7r"L
ESTABLISHED:正常数据传输状态51Testing软件测试网jxY.LR.EY+m'h
FIN_WAIT1:应用说它已经完成51Testing软件测试网N-L OEJD
FIN_WAIT2:另一边已同意释放51Testing软件测试网!zmIlK]|X-N"d
ITMED_WAIT:等待所有分组死掉51Testing软件测试网0A KHM.gA
CLOSING:两边同时尝试关闭
P|J%^2d9M G0TIME_WAIT:另一边已初始化一个释放51Testing软件测试网C9_-ug|&v1T
LAST_ACK:等待所有分组死掉51Testing软件测试网Q E.r9g^8^kv)a!u Q

m4X0D.fU0下面解释一下为啥要这样写:
)\i2Iv%U5e9J%z A051Testing软件测试网&hhw VVT
一个简单的管道符连接了netstatawk命令。51Testing软件测试网+?U\4tP/Tp CG

S.^L|/QApZ _o-?0------------------------------------------------------------------51Testing软件测试网RY#CZe#v,H]&~/W
51Testing软件测试网tE\1RM3PR1RT%~.z
先来看看netstat:
M+N7R*N0cN3v$X0
-w5K^#W$s,\ m@0QP Sg0netstat -n
8x$O1_ F(d'H.kYiV D0
Oi\g%or8`0Active Internet connections (w/o servers)
q/vh K"U0Proto Recv-Q Send-Q Local Address           Foreign Address         State
Y&ak piQ+ZL3]IWc0tcp        0      0 123.123.123.123:80      234.234.234.234:12345   TIME_WAIT
D pbK.p051Testing软件测试网3Tz2Dpq@
你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。
%O C A7T]ZWG1^051Testing软件测试网z9I)@S h#n+Q
------------------------------------------------------------------
;Uer)OnJz0
,y0I!\z Qe/vu0再来看看awk:51Testing软件测试网4J&{$k _%AGX/iSH Q(I
51Testing软件测试网;a;g]q'V n+} x
/^tcp/
2AP4wq ?0p_f:[0滤出tcp开头的记录,屏蔽udp, socket等无关记录。51Testing软件测试网(h.@8H!WF h%h

ay ~O5AV0state[]相当于定义了一个名叫state的数组51Testing软件测试网 @1t@l0WOK8vv@

W'NM m._8UxP"h0NF51Testing软件测试网9k'Jk#|V`&N:j
表示记录的字段数,如上所示的记录,NF等于651Testing软件测试网gZKd+zs0vwEY:V.T
51Testing软件测试网`6cn d&y
$NF51Testing软件测试网/G%}:Y!~8q-QC e
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
xx;}S%hD*ff051Testing软件测试网"m,rl\8kmD6F5j
state[$NF]表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数51Testing软件测试网5^-P*r@Q!h

;}W"m-{ Ul0++state[$NF]表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
5_dk0Zq]|9G0
@\%SIxm.v0END51Testing软件测试网$Sdm c.s,DlF;{d:_:G
表示在最后阶段要执行的命令
H4Fg-|0G051Testing软件测试网(t%{7Avf%^;h q"B!R
for(key in state)
kQ!p)~P rn%C%RJ0遍历数组51Testing软件测试网Xq3i8[Wz$B!F7Z
51Testing软件测试网Y+_bGF5J(k3b]
print key,"\t",state[key]打印数组的键和值,中间用\t制表符分割,美化一下。 
o\)Z?d9t051Testing软件测试网^Q5C wz
51Testing软件测试网 WQS Cf;];l5S
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'51Testing软件测试网(o5\p9C3P3Q"F
51Testing软件测试网8P:D$fT1_q'qS
状态:描述51Testing软件测试网Lp5@,o8} G1A{
CLOSED:无连接是活动的或正在进行
T-o kI*E t9G7f0LISTEN:服务器在等待进入呼叫
F6G/Kx[4e0SYN_RECV:一个连接请求已经到达,等待确认
nfOhEd^B0SYN_SENT:应用已经开始,打开一个连接51Testing软件测试网R"j6MKg/z^+l)@O
ESTABLISHED:正常数据传输状态
?B)rD2ua]8s0FIN_WAIT1:应用说它已经完成51Testing软件测试网NK)J"}T
FIN_WAIT2:另一边已同意释放51Testing软件测试网8XOtme Xu2M/H
ITMED_WAIT:等待所有分组死掉
'R B,L9~ G b]0CLOSING:两边同时尝试关闭51Testing软件测试网h w"[} XOq
TIME_WAIT:另一边已初始化一个释放51Testing软件测试网 L[0H(bw.^y0k$T_E
LAST_ACK:等待所有分组死掉
!V{z |v6z0F2t-|051Testing软件测试网qE^l+q ic X

"j9WQN5rK)]D(C0如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,51Testing软件测试网l%c'@8T6Cy
vim /etc/sysctl.conf
4YTT&{4aa&\)p G+i0编辑文件,加入以下内容:51Testing软件测试网-ghY[s p
net.ipv4.tcp_syncookies = 151Testing软件测试网PQrYs+?\
net.ipv4.tcp_tw_reuse = 1
t:E$s s}7`0net.ipv4.tcp_tw_recycle = 151Testing软件测试网M$[t*n'R e
net.ipv4.tcp_fin_timeout = 3051Testing软件测试网9ec }/H}&a
然后执行 /sbin/sysctl -p 让参数生效。
i/h#uI9r-E4^` {051Testing软件测试网(Pv6\E!Sm p
net.ipv4.tcp_syncookies = 1 表示开启SYN cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
d*UM5O[*n5~Y7G0net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
#I`,] KC/Kg0net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。51Testing软件测试网@ x$Y!v!r| Et
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
$fQ m,S6COE0
4f:^$p7Sb!}ZwaB5d0下面附上TIME_WAIT状态的意义:51Testing软件测试网KW0^a$y#y Fa+N}v
51Testing软件测试网7I"EB_,E{g0c
客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口51Testing软件测试网7B*D`}z4SVk
状态为TIME_WAIT
"[f]8yR!A4h051Testing软件测试网n;V4|t6@
是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?51Testing软件测试网 a @Xe GJ1vX/q5f2hW
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?51Testing软件测试网5g u ve0v [P
51Testing软件测试网2B_%?dV6`2y
主动关闭的一方在发送最后一个 ack 后51Testing软件测试网 Fp*x[%c
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间51Testing软件测试网wG}*v5cv'l
这个是TCP/IP必不可少的,也就是“解决”不了的。51Testing软件测试网`*U0]xQ[8r$I"f
51Testing软件测试网G(VW9_3a#Q
也就是TCP/IP设计者本来是这么设计的51Testing软件测试网G u Y"O }%M%y
主要有两个原因
o0G,Fx7e6f`01。防止上一次连接中的包,迷路后重新出现,影响新连接
am!Pa TA0(经过2MSL,上一次连接中所有的重复包都会消失)
nOiDo02。可靠的关闭TCP连接
:x8A9c3l } L,cQ~u0在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发51Testing软件测试网,diIT(z1|1Ok*H
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以51Testing软件测试网l\wKH
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
9b;n@7E~d+TFP ~i E051Testing软件测试网4vt}y5V!f
TIME_WAIT 并不会占用很大资源的,除非受到攻击。51Testing软件测试网"s u3I \ I-?t
51Testing软件测试网|2F{sZ*@
还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

TAG: awk netstat

 

评分:0

我来说两句

Open Toolbar