TCP狀態

TCP狀態

TCP鏈接中包含不一樣的狀態,如何經過狀態來判斷程序問題尤其重要。服務器

三次握手

圖中的connection部分爲三次握手。socket

四次握手

圖中的close部分爲四次握手。tcp

CLOSE_WAIT

服務器接受到FIN關閉請求後爲CLOSE_WAIT狀態。
默認狀況下,CLOSE_WAIT狀態會至少維持2小時的狀態。
因爲CLOSE_WAIT狀態後應該發送ACK請求,狀態會變爲LAST_ACK,但若是由太多的CLOSE_WAIT狀態,則服務器出現錯誤。code

TIME_WAIT

客戶端在接受到服務器的FIN關閉請求後爲TIME_WAIT狀態,最後會自動切換到CLOSE狀態。
當服務器主動關閉連接時造成TIME_WAIT狀態,會持續2個MSL(Max Segment Lifetime),默認爲4分鐘。blog

TIME_WAIT狀態下的socket不能被回收使用,具體現象是對於一個處理大量短鏈接的服務器,若是因爲服務器主動關閉客戶端的鏈接,將致使服務器產生大量處於TIME_WAIT狀態的socket,嚴重影響服務器的處理能力。排序

AWK和NETSTAT命令

# -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

相關文章
相關標籤/搜索