Shell写起来很简单,效果却很神奇,你可以先尝试执行一下这条命令:
+\.`8fI$sI
X0hU2Je&B a$\0netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
1a0H/R%v:U~051Testing软件测试网,Q,{yP'm会得到类似下面的结果,具体数字会有所不同:
51Testing软件测试网4P&[
m3hH,Z.m51Testing软件测试网X"?1S&@%AD#v7~1lLAST_ACK 1
6d\\zf aLU#F#Sq0SYN_RECV 14
n%r']U Gd!V D
V h,p0ESTABLISHED 79
51Testing软件测试网fWV$b+P"]FIN_WAIT1 28
51Testing软件测试网1l El'I9cr.MTFIN_WAIT2 3
&f8d&o i-}Y!jCv0CLOSING 5
51Testing软件测试网5BNJ&r"V D,FTIME_WAIT 1669
Oz5P&C5H'y4R0p0/p8I2geQ7?/K0也就是说,这条命令可以把当前系统的网络连接状态分类汇总。
%_@tj^d$U051Testing软件测试网c2BO0cg5P#n状态:描述
JM `1R)O3O!Zp}l0CLOSED:无连接是活动的或正在进行
,O
v8s$O v)F0LISTEN:服务器在等待进入呼叫
"SI*]D&qV0SYN_RECV:一个连接请求已经到达,等待确认
Si+ES+f0uU0s N0SYN_SENT:应用已经开始,打开一个连接
;d$C%njr
y_;\-q5H]0ESTABLISHED:正常数据传输状态
c4F)gVg4sq0FIN_WAIT1:应用说它已经完成
51Testing软件测试网pIM vPD/B;rFIN_WAIT2:另一边已同意释放
"jn,v7g(]Dk/j0ITMED_WAIT:等待所有分组死掉
|Pp]ac%]b0CLOSING:两边同时尝试关闭
51Testing软件测试网-Tz [+Zm_TIME_WAIT:另一边已初始化一个释放
KFgNY~{0LAST_ACK:等待所有分组死掉
51Testing软件测试网S0M1bE.x qj51Testing软件测试网2O1d4g-i7{3V下面解释一下为啥要这样写:
51Testing软件测试网-X8C!{*]-[j q9hsb.P k3^Q0一个简单的管道符连接了
netstat和
awk命令。
51Testing软件测试网9z/s-I!i8~51Testing软件测试网P2j;~b?R&|/y&Z------------------------------------------------------------------
51Testing软件测试网Yc f0s? m3U?4~n2a
r8Q'R8P)]0先来看看netstat:
Y r]UzrVb0S-R
Qd\?u[;|'?0netstat -n
+Ov
e ]L
V-F.} K1~051Testing软件测试网6KFev|.`X%~5gs*VActive Internet connections (w/o servers)
~:e4vB?
i l] r0Proto Recv-Q Send-Q Local Address Foreign Address State
&L7XQ~*[:i_s0tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT
%}z}XTL)~,}}0_5{ck2Z0你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。
PhE!D Pl#|0Eg%Hw!t [J0------------------------------------------------------------------
51Testing软件测试网6aS2by5S2h+l8lM5J2Ce8H0再来看看awk:
1U#F
G"I _a\c051Testing软件测试网)rx/G@1qHZED,X/^tcp/
(W+Ie@7o(qc}s0滤出tcp开头的记录,屏蔽udp, socket等无关记录。
(a(t\KY6A"J/b0S%BE#P!Y)[6HuFP0state[]相当于定义了一个名叫state的数组
7M3o0d#nJ{051Testing软件测试网%~1_r/g\#mjWNF
51Testing软件测试网2^7r
?!]6k5~
x表示记录的字段数,如上所示的记录,NF等于6
y*X'] u6~c:eE&Bq0)r%g['y~0$NF
9IJuxIX:Mk0表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
lFa }Y ^:W$V051Testing软件测试网.Pp-JMsstate[$NF]表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数
51Testing软件测试网%A,JEdAzr$k&]XB$N"Q](hi0++state[$NF]表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
|V)T)c9U0q!}X'mh0END
!O$I[9Z"s-O[0表示在最后阶段要执行的命令
&}&Y7~nY)[m:p0p'_j'{M
VjE0for(key in state)
e[#?1yAUW0遍历数组
qo!|}8AeSeqH0&I-R2})j%B.Ul0print key,"\t",state[key]打印数组的键和值,中间用\t制表符分割,美化一下。
~.@h~z7~']*P0M0S+kZ%``0$|4H u!Jq0netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
51Testing软件测试网2x
Uy:I;j,PL`gj6`^q0状态:描述
5S i4B)H(q"X{h0CLOSED:无连接是活动的或正在进行
51Testing软件测试网fU3X.c `6`+gLISTEN:服务器在等待进入呼叫
(Op;MS#On'o+rN0SYN_RECV:一个连接请求已经到达,等待确认
x'u p.F&p0YJ#Y:_0SYN_SENT:应用已经开始,打开一个连接
51Testing软件测试网#O/b^tmBqb5`ESTABLISHED:正常数据传输状态
51Testing软件测试网~e}a E'L ecbFIN_WAIT1:应用说它已经完成
Bd`.O4_[Z(O2~0FIN_WAIT2:另一边已同意释放
51Testing软件测试网3J
XU;`
foYITMED_WAIT:等待所有分组死掉
51Testing软件测试网%`
^5\s`-oCLOSING:两边同时尝试关闭
51Testing软件测试网MLM\V!sTIME_WAIT:另一边已初始化一个释放
8d2_6[+};g0LAST_ACK:等待所有分组死掉
2k3L*c5prDm051Testing软件测试网#Z
\`9@*CF^6gF:Y(g~*n5a-T(\m0如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
#l$I-T l&m0LG0vim /etc/sysctl.conf
51Testing软件测试网0LDa#xx|K编辑文件,加入以下内容:
51Testing软件测试网6[;qu
W0N-\6J%P+jnet.ipv4.tcp_syncookies = 1
51Testing软件测试网6fwsH)\net.ipv4.tcp_tw_reuse = 1
51Testing软件测试网8^0Dv$mqf2~,S(YY[
ynet.ipv4.tcp_tw_recycle = 1
t(\6B9?7x2t;N!jHb0net.ipv4.tcp_fin_timeout = 30
0~"g\8U-LqB$Pzhq0然后执行 /sbin/sysctl -p 让参数生效。
51Testing软件测试网/\~(ckfUDb%C;]:XD Hun6ru.W0net.ipv4.tcp_syncookies = 1 表示开启SYN cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
51Testing软件测试网${| m8g-tOhHrUnet.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
KZa|b0net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
51Testing软件测试网8i _0q'Q+O:yknet.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
$Wzp/o-dM:^$t'@pC0
~7b h?*F|8n0下面附上TIME_WAIT状态的意义:
51Testing软件测试网];jKkS&iw4Z[M1Xj}I9y`b`1B0客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
51Testing软件测试网
vz2G
`G状态为TIME_WAIT
51Testing软件测试网N6R#a6n0O
r2@51Testing软件测试网2?`8QAE?r是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
51Testing软件测试网 R|/m??tS
l有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?
O3wZ~5c8L
X9]051Testing软件测试网A
^7v#fWT Ky主动关闭的一方在发送最后一个 ack 后
51Testing软件测试网J8~ Y|2u;aDLgU
H就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
NY(S T$Y%S)?^*t0这个是TCP/IP必不可少的,也就是“解决”不了的。
51Testing软件测试网V"b;ej,T6o1z#f8F_3F*w"\dR!x[0也就是TCP/IP设计者本来是这么设计的
|g$ef;eS0主要有两个原因
51Testing软件测试网m/U/\pmZ\1。防止上一次连接中的包,迷路后重新出现,影响新连接
51Testing软件测试网1F#CM*d/M_(经过2MSL,上一次连接中所有的重复包都会消失)
51Testing软件测试网ja%zX0B)r$E D2。可靠的关闭TCP连接
6g HC\v,O#t0在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
51Testing软件测试网C5fp;Uq#t}fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
v|S%_d|\z!S;N0主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
6iveA]2Ef I051Testing软件测试网7z"N,~0J!~ T*_TIME_WAIT 并不会占用很大资源的,除非受到攻击。
ns)X!r(U:ZX1Ki0qU+o i B0还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态