TCP链接中包含不一样的状态,如何经过状态来判断程序问题尤其重要。服务器
图中的connection
部分为三次握手。socket
图中的close
部分为四次握手。tcp
服务器接受到FIN关闭请求后为CLOSE_WAIT
状态。
默认状况下,CLOSE_WAIT
状态会至少维持2小时的状态。
因为CLOSE_WAIT
状态后应该发送ACK请求,状态会变为LAST_ACK
,但若是由太多的CLOSE_WAIT
状态,则服务器出现错误。code
客户端在接受到服务器的FIN关闭请求后为TIME_WAIT
状态,最后会自动切换到CLOSE
状态。
当服务器主动关闭连接时造成TIME_WAIT
状态,会持续2个MSL(Max Segment Lifetime),默认为4分钟。blog
TIME_WAIT
状态下的socket不能被回收使用,具体现象是对于一个处理大量短链接的服务器,若是因为服务器主动关闭客户端的链接,将致使服务器产生大量处于TIME_WAIT
状态的socket,严重影响服务器的处理能力。排序
# -n表示-net netstat -n # -v用于定义参数 netstat -net | awk -v i=0,j=0 '{if ($6=="ESTABLISHED") {i++}; if ($6 == "CLOSE_WAIT") {j++}; print i, j, prit $6}' # 最佳用法以下: # 1. 使用正则/xxx/来匹配行 # 2. $NF表明最后一列的数据,命令中定义了一个字典,最后一列数据做为key # 3. 每次匹配都会让value递增 # 4. END表示结束 # 5. 最后的{}用来打印key,value netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}'
那么,如何对结果进行排序呢?it
# 利用管道 netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a] | "sort -r -n -k2"}' # 其中,sort为外部命令,-r表明从大到小(倒序),-n表明按照数字排序,-k2表明按照第2行排序。
此外,也能够使用asort
来实现结果排序。
```io