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

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

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

Shell写起来很简单,效果却很神奇,你可以先尝试执行一下这条命令:51Testing软件测试网Q+QxUo4yE7qe4t,Y
51Testing软件测试网 HQ7t @'P}+DA
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
iF~m5D.?u0

2T2c!b n.X,k#P0会得到类似下面的结果,具体数字会有所不同:
t.l s TX$X{1~0
]7I'Z M_4@Am0LAST_ACK         151Testing软件测试网(t IS5}lh
SYN_RECV         1451Testing软件测试网ywt"\X]!N?
ESTABLISHED      79
;lO2Ot;V6tV0FIN_WAIT1        2851Testing软件测试网 jm0Q7G N'G g,o
FIN_WAIT2        3
|S v kD eO'I0CLOSING          5
S$\#f?Qf0TIME_WAIT        166951Testing软件测试网4U/j5f0C'i.G&{L
51Testing软件测试网gdU Y8ZaR4q\k
也就是说,这条命令可以把当前系统的网络连接状态分类汇总。
y z!io8l!t-]A2Y0
0y#T~p*E/d0状态:描述51Testing软件测试网v?+E0mQ#~v
CLOSED:无连接是活动的或正在进行51Testing软件测试网%c;h,~G$P4w0jo
LISTEN:服务器在等待进入呼叫
&S9z,H er"a/H&G0SYN_RECV:一个连接请求已经到达,等待确认
$D?6Wbav!O5UL2?0SYN_SENT:应用已经开始,打开一个连接51Testing软件测试网Zw ~ y]
ESTABLISHED:正常数据传输状态
b9F$o6u{}8o"XW0FIN_WAIT1:应用说它已经完成
b SLkZ9^0FIN_WAIT2:另一边已同意释放51Testing软件测试网7G4e2Ty/YP
ITMED_WAIT:等待所有分组死掉
;b%J#M4FW[0CLOSING:两边同时尝试关闭51Testing软件测试网$U`d\S6b m3cT0m
TIME_WAIT:另一边已初始化一个释放
6i i(PtR0LAST_ACK:等待所有分组死掉51Testing软件测试网9wO.V;U_c^J
51Testing软件测试网'L0N:g p4pz-k}wb%o
下面解释一下为啥要这样写:
#Z?5H wrG051Testing软件测试网;BSV V.XUk$eZD
一个简单的管道符连接了netstatawk命令。
o+^6YV8pC-JMN*A0
5OL9P9s jh)y0------------------------------------------------------------------51Testing软件测试网 y V6PL_#cD(k)Z
51Testing软件测试网za n7Vc,O
先来看看netstat:
LoQDw;M6F&I\FzJ0
L!u4Amgw2G0netstat -n51Testing软件测试网4_4Jd7g7Tx aL

\6~pUk-k"C Br0Active Internet connections (w/o servers)51Testing软件测试网4[)I)Dp?e9l
Proto Recv-Q Send-Q Local Address           Foreign Address         State51Testing软件测试网&ic-D v$a@FC4fl+~
tcp        0      0 123.123.123.123:80      234.234.234.234:12345   TIME_WAIT51Testing软件测试网,O@t1G1g \I@o(M
51Testing软件测试网xP-{\V.~
你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。
)?$A'm:es4v5_D0
} p?%}+LQ8o|@0a0------------------------------------------------------------------
i Lx)s!O7v;F0
0ip1i"oC ee{ a}0再来看看awk:51Testing软件测试网|w#TDe}
51Testing软件测试网Q.p1i*zU L!`@D
/^tcp/51Testing软件测试网{8a{7C$B)o)u
滤出tcp开头的记录,屏蔽udp, socket等无关记录。
*U C!] s KKY-v051Testing软件测试网&|]N En:}1~ F@q
state[]相当于定义了一个名叫state的数组
,keAB;A6Wk051Testing软件测试网3v8yYE*wTxP
NF
\5M\u{0b0表示记录的字段数,如上所示的记录,NF等于6
5{k;xC/K8pa8AB051Testing软件测试网)C#KW6bq
$NF
Y{H:ip!qxW I0表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
Nx'?W] ]"O,Pj0
n%[Br!jZu0state[$NF]表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数51Testing软件测试网T"p]OA`d:V%n

HOgy%M0++state[$NF]表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一51Testing软件测试网}-CP'qdR lu

OT'K2`8@u/e8W0END
[8]"Z BM5K;m{Q0表示在最后阶段要执行的命令51Testing软件测试网laKBvf?\Y
51Testing软件测试网G)[`:^M
for(key in state)
W[ l h0lbm0M0遍历数组
9lj)Gp2O^7VpVo.HL051Testing软件测试网JtdN&s2C0Q!jo.s n
print key,"\t",state[key]打印数组的键和值,中间用\t制表符分割,美化一下。 51Testing软件测试网hZ Xw| H,i
51Testing软件测试网A\%t;G5An;w4i
51Testing软件测试网r&]:i5B4_7h*a8nwX
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'51Testing软件测试网SQ~u z6oPo

Kv"O.HsF ][4@0状态:描述51Testing软件测试网h|-Re@ok
CLOSED:无连接是活动的或正在进行51Testing软件测试网T2d1t,h"t ^B,qW
LISTEN:服务器在等待进入呼叫51Testing软件测试网0["Rf|W
SYN_RECV:一个连接请求已经到达,等待确认51Testing软件测试网Ho4`awTfi[ Pr l*F
SYN_SENT:应用已经开始,打开一个连接
9`0f,ic!c0ESTABLISHED:正常数据传输状态
` a9bU3a*M6Em)q3_ D0FIN_WAIT1:应用说它已经完成51Testing软件测试网(e*xU\W
FIN_WAIT2:另一边已同意释放51Testing软件测试网#v)gW:eD yH3Uq
ITMED_WAIT:等待所有分组死掉51Testing软件测试网l,tQKAU
CLOSING:两边同时尝试关闭
K%M6g)S _T4J5`0TIME_WAIT:另一边已初始化一个释放
y&F4[+~ ~%Q.I0LAST_ACK:等待所有分组死掉
"Q @cd2v!Xx051Testing软件测试网a\PbN/`h'`
51Testing软件测试网8Km2na]m z |
如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,51Testing软件测试网G3N!ma {:Q6e
vim /etc/sysctl.conf
3Ed:U i*{p*Q_8?0编辑文件,加入以下内容:51Testing软件测试网)wW G,Z.E"t9v }L
net.ipv4.tcp_syncookies = 1
5o'o }3]{SO"J0net.ipv4.tcp_tw_reuse = 151Testing软件测试网1][,d:t#{3~8J
net.ipv4.tcp_tw_recycle = 1
} \3G,l$L0net.ipv4.tcp_fin_timeout = 3051Testing软件测试网P+S&[|8BK h
然后执行 /sbin/sysctl -p 让参数生效。
+]`4]6`.P @0
c7JA3}fg5S&K0net.ipv4.tcp_syncookies = 1 表示开启SYN cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
"^NT@]n&y0net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
jc'M@OO Od0net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
Q5cag:h8n/L0net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
f|2[;WRF`a8`"B:h0
%n)On6u+y1Vz:q IC6N0下面附上TIME_WAIT状态的意义:51Testing软件测试网?7e*J?*k%W*Ry~4E

9w] s6LR@2{!x1I0客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
Q V]Be7?,E0状态为TIME_WAIT
2ctt|lF051Testing软件测试网K5],w/A\r)X&I?
是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
|+oC!LE'}"A0有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?
r%OR8K ]9I0
0J0[0O l~:I!d(V-T0主动关闭的一方在发送最后一个 ack 后51Testing软件测试网X0`TbL[%w4t G8R
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间51Testing软件测试网`ARYS'j4j9X)c
这个是TCP/IP必不可少的,也就是“解决”不了的。
7z^3r I}xT#f T051Testing软件测试网8\ X8B9B8Hk
也就是TCP/IP设计者本来是这么设计的
Gu6c\`RD)r%]!|0主要有两个原因51Testing软件测试网pq q&bxE$c.W
1。防止上一次连接中的包,迷路后重新出现,影响新连接51Testing软件测试网?.KrRsBeFU
(经过2MSL,上一次连接中所有的重复包都会消失)
of un+e3p02。可靠的关闭TCP连接51Testing软件测试网)g4R.rCpu'W&G)jI"x1w#P
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发51Testing软件测试网&oy!O#Ad+_"F1Np
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
:g {(L&H?%yC-I0主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
A PO FOB7{Y0
|;Q^|d!@0TIME_WAIT 并不会占用很大资源的,除非受到攻击。
7y H(Os8s0
9v$]0~^]$^ AI0还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

TAG: awk netstat

 

评分:0

我来说两句

Open Toolbar