每天进步一点点

【转载】使用netstat和awk命令来统计网络连接数

上一篇 / 下一篇  2010-10-18 10:02:43 / 个人分类:Unix/Linux

 

Shell写起来很简单,效果却很神奇,你可以先尝试执行一下这条命令:
:a q:F/Zv357760
3n?$U.U6{ v ^ H357760netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
R2RpZm357760
51Testing软件测试网 O5F1u+CUB.v4]
会得到类似下面的结果,具体数字会有所不同:51Testing软件测试网4ETTgQu,F{|X;A

9U b B}MP6T*t357760LAST_ACK         1
+N%k0F-K t7h~ M357760SYN_RECV         14
:J u6C6w&V)@-W6}*V357760ESTABLISHED      79
7vBX9J e+WM:E357760FIN_WAIT1        2851Testing软件测试网6Ulx"r;wY%h
FIN_WAIT2        351Testing软件测试网4oIDuVX |5y9M
CLOSING          5
+CIyQq357760TIME_WAIT        166951Testing软件测试网2gU yjU{
51Testing软件测试网'r_f"q,J L:J5Ej
也就是说,这条命令可以把当前系统的网络连接状态分类汇总。
fD-u$qq/W f357760
]&@(gR] [bA357760状态:描述
$[ J%b"f8Ej c357760CLOSED:无连接是活动的或正在进行
v-\$[2hay357760LISTEN:服务器在等待进入呼叫51Testing软件测试网@4K(`k v+sd
SYN_RECV:一个连接请求已经到达,等待确认
+Vd x)]7OVV9x&tl357760SYN_SENT:应用已经开始,打开一个连接
E2XN/y$d/Z357760ESTABLISHED:正常数据传输状态51Testing软件测试网5ad:K.pVZk
FIN_WAIT1:应用说它已经完成51Testing软件测试网4v;_#F[I
FIN_WAIT2:另一边已同意释放51Testing软件测试网%a7b6S m(CE1WH
ITMED_WAIT:等待所有分组死掉
V3Obew y&k&M/M`357760CLOSING:两边同时尝试关闭
0Q[5u!q%zuG357760TIME_WAIT:另一边已初始化一个释放51Testing软件测试网9`R[c5r;c
LAST_ACK:等待所有分组死掉
;OR"jo5aq(oy357760
3{5i#m*_A3|o357760下面解释一下为啥要这样写:
U;I7a l&KJ_0{ C!N;Q357760
2l)l{-T/fS$Cw |\n357760一个简单的管道符连接了netstatawk命令。
p.GJ5BkX'W*dtK A35776051Testing软件测试网 Xf`a+p6zG
------------------------------------------------------------------
yA)Y*g;I ~HV`357760
0Z3g~!O3`q4{C:@d,I357760先来看看netstat:51Testing软件测试网[/ian$Xr\v:h O
51Testing软件测试网Es,[-},q*G Q ^j|9E4y
netstat -n
%^ S#u(O'^:N#P"gk357760
tGE.P)or1ub LH(R357760Active Internet connections (w/o servers)51Testing软件测试网L,GN?,_8KU
Proto Recv-Q Send-Q Local Address           Foreign Address         State51Testing软件测试网-^0W1t5yz@'R-m
tcp        0      0 123.123.123.123:80      234.234.234.234:12345   TIME_WAIT51Testing软件测试网2ET4q"ti0DR)z Ig

?&R0x,nQ357760你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。
!Dqvt;d$@(n357760
8d3p9Q}3KNoo357760------------------------------------------------------------------51Testing软件测试网4SPP1cqW*LwEZ

tG W`q357760再来看看awk:
iu8b7S J&j%AzI|357760
+F%H0Kx%k-T!E U357760/^tcp/51Testing软件测试网;F3^?S6whp^
滤出tcp开头的记录,屏蔽udp, socket等无关记录。51Testing软件测试网W!ztF^pE

2d}+bL ^8wo357760state[]相当于定义了一个名叫state的数组51Testing软件测试网@P9QIj;f8r/Y]$C}

,w5K7q#N%bb;l)b357760NF
h-m_y N,?o1V357760表示记录的字段数,如上所示的记录,NF等于651Testing软件测试网ur:d FpO(m+X
51Testing软件测试网u3W.ei1X
$NF51Testing软件测试网 o%C&pNu~
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
X CtD x9Ay_357760
,ozht o_.l?+l357760state[$NF]表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数
#MM&v9\$_35776051Testing软件测试网/f7e;J#P/i2@
++state[$NF]表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
#kB'z9x8x)Y$g357760
g/Llyh~mYm357760END51Testing软件测试网W6~5JP d7~Og2g
表示在最后阶段要执行的命令51Testing软件测试网;o\gT'O&B He8_

L v R$a-u+PZ^357760for(key in state)
2n` N:L}q U XS357760遍历数组
2O1S @5y%J0AuA%Z357760
~Uy Z+Wq9Qrn3I357760print key,"\t",state[key]打印数组的键和值,中间用\t制表符分割,美化一下。 51Testing软件测试网$Jw*v5Ba utv{4\
51Testing软件测试网;Au p?'` hM[
51Testing软件测试网)@s%w;K^_+M
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'51Testing软件测试网-Z I8A E'G3n*LH
51Testing软件测试网 B?Z~w-U9sL
状态:描述
NDZ i"vA:Q;P#Ae+@{357760CLOSED:无连接是活动的或正在进行51Testing软件测试网"Jx/oaXZ"Q
LISTEN:服务器在等待进入呼叫51Testing软件测试网em J0{]
SYN_RECV:一个连接请求已经到达,等待确认
&Y7P.qMK?357760SYN_SENT:应用已经开始,打开一个连接51Testing软件测试网"[2R)J7gHG q
ESTABLISHED:正常数据传输状态51Testing软件测试网&V1x0A5DkBpX
FIN_WAIT1:应用说它已经完成51Testing软件测试网3H,g#OH$Y jc
FIN_WAIT2:另一边已同意释放
6J0O F3\5b357760ITMED_WAIT:等待所有分组死掉
\;Lm:jm^o357760CLOSING:两边同时尝试关闭51Testing软件测试网NFQ8\rXN/]7oH
TIME_WAIT:另一边已初始化一个释放
m T2?1`o(a'rE zpj t357760LAST_ACK:等待所有分组死掉51Testing软件测试网2f-AdUF[({"{S
51Testing软件测试网[2n U4\ W

dO6h5VIhF357760如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,51Testing软件测试网L4^5X6k5F0mox,R `
vim /etc/sysctl.conf
|A+M&M0t V\k xg357760编辑文件,加入以下内容:
TX%db?4WTgV357760net.ipv4.tcp_syncookies = 151Testing软件测试网 ml!y\A7L%t"gt
net.ipv4.tcp_tw_reuse = 1
6B{ A6@i|Xy357760net.ipv4.tcp_tw_recycle = 1
V?f2Vq^357760net.ipv4.tcp_fin_timeout = 3051Testing软件测试网]0u9WC!SJ6N
然后执行 /sbin/sysctl -p 让参数生效。51Testing软件测试网:_ [\jn:GH&{/S"z2f
51Testing软件测试网V+O-^i%[ qY
net.ipv4.tcp_syncookies = 1 表示开启SYN cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;51Testing软件测试网sW p Q3DIt+q&N
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
IzI:?)F(T(N R'U O357760net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
\;O4Cc@.{ }&LT8L357760net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间51Testing软件测试网3|;]"_Q\[

@ E/[ qt/L357760下面附上TIME_WAIT状态的意义:
aGd!e8u P*B-`&CG35776051Testing软件测试网X&dLhqO {3k1[
客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
Wa-D&H4D357760状态为TIME_WAIT51Testing软件测试网`2rU7q#Ie+h`1L

'W Ys:q qbE a n357760是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
#FD5dO"`#B357760有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?51Testing软件测试网j\j]J0urd
51Testing软件测试网Uc'y ](V ~-zO
主动关闭的一方在发送最后一个 ack 后51Testing软件测试网)pakmf.|}*o
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
'P t|vCN357760这个是TCP/IP必不可少的,也就是“解决”不了的。51Testing软件测试网d)Woa-y:Gxu

-^*s.|M5Oy357760也就是TCP/IP设计者本来是这么设计的
$Y`bIm3]5Bf#Q357760主要有两个原因51Testing软件测试网-XFb q#A"G5G_7y
1。防止上一次连接中的包,迷路后重新出现,影响新连接
4z;X!K8k:A|n;? e357760(经过2MSL,上一次连接中所有的重复包都会消失)51Testing软件测试网-QL2w r2t-P(V3^"_
2。可靠的关闭TCP连接
8z p ^(PAtCr,I7_B357760在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发51Testing软件测试网mxXz4B(Q j1s
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以51Testing软件测试网_&r J.s W4WN"R
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。51Testing软件测试网1\)dG CWv)C-CNk

.sa d1t*T&s357760TIME_WAIT 并不会占用很大资源的,除非受到攻击。
At#\,et:^-p5]357760
q Lj])|-MU-LfB357760还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

来源:http://www.51testing.com/?uid-116228-action-viewspace-itemid-219725


TAG: Linux

 

评分:0

我来说两句

Open Toolbar