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