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}/rZr0Q-Q)g HUIx t0会得到类似下面的结果,具体数字会有所不同:
z @"UF&Q5C-[0)oG8hi4X7Z s8C0LAST_ACK 1
8^1X:M1sJ8F%X%p$g#rJ1X0SYN_RECV 14
51Testing软件测试网7GY:f hX
_&TESTABLISHED 79
m1|J xpM`$fT_0FIN_WAIT1 28
51Testing软件测试网IslkzjeKjZl
NFIN_WAIT2 3
51Testing软件测试网P`N)y$kf eCLOSING 5
51Testing软件测试网}
g:[n1h9[5` R9`!~JTIME_WAIT 1669
51Testing软件测试网+pm/t9H&l7Emr?-h`;u&oM'LVK c4I0也就是说,这条命令可以把当前系统的网络连接状态分类汇总。
"g2F0de}1kS051Testing软件测试网0~@$] I0p#F%u状态:描述
51Testing软件测试网$_;t~6EZ E:KyvCLOSED:无连接是活动的或正在进行
d'N`F6B0LISTEN:服务器在等待进入呼叫
51Testing软件测试网5p,k0W4`7YSYN_RECV:一个连接请求已经到达,等待确认
51Testing软件测试网V3uh*t2oxxBSYN_SENT:应用已经开始,打开一个连接
51Testing软件测试网@WSM,V7r"LESTABLISHED:正常数据传输状态
51Testing软件测试网jxY.LR.EY+m'hFIN_WAIT1:应用说它已经完成
51Testing软件测试网N-L OEJDFIN_WAIT2:另一边已同意释放
51Testing软件测试网!zmIlK]|X-N"dITMED_WAIT:等待所有分组死掉
51Testing软件测试网0A
KHM.g ACLOSING:两边同时尝试关闭
P|J%^2d9M
G0TIME_WAIT:另一边已初始化一个释放
51Testing软件测试网C9_-ug|&v1TLAST_ACK:等待所有分组死掉
51Testing软件测试网QE.r9g^8^kv)a!u
Qm4X0D.fU0下面解释一下为啥要这样写:
)\ i2Iv%U5e9J%z A051Testing软件测试网&hhw
VVT一个简单的管道符连接了
netstat和
awk命令。
51Testing软件测试网+? U\4tP/Tp CGS.^L|/QApZ
_o-?0------------------------------------------------------------------
51Testing软件测试网RY#CZe#v,H]&~/W51Testing软件测试网tE\1RM3PR1RT%~.z先来看看netstat:
M+N7R*N0cN3v$X0-w5K^#W$s,\ m@0QPSg0netstat -n
8x$O1_ F(d'H.kYiV
D0Oi\g%or8`0Active Internet connections (w/o servers)
q/vhK"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)@Sh#n+Q------------------------------------------------------------------
;Uer)OnJz0,y0I!\z
Qe/vu0再来看看awk:
51Testing软件测试网4J&{$k _%AGX/iSH
Q(I51Testing软件测试网;a;g]q'V n+}x/^tcp/
2AP4wq
?0p_f:[0滤出tcp开头的记录,屏蔽udp, socket等无关记录。
51Testing软件测试网(h.@8H!WFh%hay~O5AV0state[]相当于定义了一个名叫state的数组
51Testing软件测试网 @1t@l0WOK8vv@W'NM
m._8UxP"h0NF
51Testing软件测试网9k'Jk#|V`&N:j表示记录的字段数,如上所示的记录,NF等于6
51Testing软件测试网gZKd+zs0vwEY:V.T51Testing软件测试网`6cnd&y$NF
51Testing软件测试网/G%}:Y!~8q-QC
e表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
xx;}S%hD*f f051Testing软件测试网"m,rl\8kmD6F5jstate[$NF]表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数
51Testing软件测试网5^-P*r@Q!h;}W"m-{
Ul0++state[$NF]表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
5_dk0Zq]|9G0@\%SIx m.v0END
51Testing软件测试网$Sdm
c.s,DlF;{d:_:G表示在最后阶段要执行的命令
H4Fg-|0G051Testing软件测试网(t%{7Avf%^;hq"B!Rfor(key in state)
kQ!p)~Prn%C%RJ0遍历数组
51Testing软件测试网Xq3i8[Wz$B!F7Z51Testing软件测试网Y+_bGF5J(k3b]print key,"\t",state[key]打印数组的键和值,中间用\t制表符分割,美化一下。
o \)Z?d9t051Testing软件测试网^ Q5C wz51Testing软件测试网 WQSCf;];l5Snetstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
51Testing软件测试网(o5\p9C3P3Q"F51Testing软件测试网8P:D$fT1_q'qS状态:描述
51Testing软件测试网Lp5@,o8}G1A{CLOSED:无连接是活动的或正在进行
T-okI*E t9G7f0LISTEN:服务器在等待进入呼叫
F6G/Kx[4e0SYN_RECV:一个连接请求已经到达,等待确认
nfOhEd^B0SYN_SENT:应用已经开始,打开一个连接
51Testing软件测试网R"j6MKg/z^+l)@OESTABLISHED:正常数据传输状态
?B)rD2ua]8s0FIN_WAIT1:应用说它已经完成
51Testing软件测试网 NK)J"}TFIN_WAIT2:另一边已同意释放
51Testing软件测试网8XOtmeXu2M/HITMED_WAIT:等待所有分组死掉
'R
B,L9~ Gb]0CLOSING:两边同时尝试关闭
51Testing软件测试网h
w"[}
XOqTIME_WAIT:另一边已初始化一个释放
51Testing软件测试网L[0H(bw.^y0k$T_ELAST_ACK:等待所有分组死掉
!V{z|v6z0F2t-|051Testing软件测试网qE^l+q
ic X"j9WQN5rK)]D(C0如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
51Testing软件测试网l%c'@8T6Cyvim /etc/sysctl.conf
4YTT&{4aa&\)p
G+i0编辑文件,加入以下内容:
51Testing软件测试网-ghY[spnet.ipv4.tcp_syncookies = 1
51Testing软件测试网PQrYs+?\net.ipv4.tcp_tw_reuse = 1
t:E$s s}7`0net.ipv4.tcp_tw_recycle = 1
51Testing软件测试网M$[t*n'R
enet.ipv4.tcp_fin_timeout = 30
51Testing软件测试网9ec
}/H}&a然后执行 /sbin/sysctl -p 让参数生效。
i/h#uI9r-E4^` {051Testing软件测试网(Pv6\E!Smpnet.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`,]K C/Kg0net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
51Testing软件测试网@x$Y!v!r|Etnet.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
$fQm,S6COE04f:^$p7Sb!}ZwaB5d0下面附上TIME_WAIT状态的意义:
51Testing软件测试网KW0^a$y#y
Fa+N}v51Testing软件测试网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 [P51Testing软件测试网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"f51Testing软件测试网G(V W9_3a#Q也就是TCP/IP设计者本来是这么设计的
51Testing软件测试网G
uY"O}%M%y主要有两个原因
o0G,Fx7e6f`01。防止上一次连接中的包,迷路后重新出现,影响新连接
am!Pa TA0(经过2MSL,上一次连接中所有的重复包都会消失)
nOiDo02。可靠的关闭TCP连接
:x8A9c3l } L,cQ~u0在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
51Testing软件测试网,diIT(z1|1Ok*Hfin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
51Testing软件测试网l\wKH主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
9b;n@7E~d+TFP
~i
E051Testing软件测试网4vt}y5V!fTIME_WAIT 并不会占用很大资源的,除非受到攻击。
51Testing软件测试网"s
u3I
\
I-?t51Testing软件测试网|2F{sZ*@还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态