Linux TCP不同狀態的連接數統計


方法一:利用netstat命令

統計 TIME_WAIT/CLOSE_WAIT/ESTABLISHED/LISTEN 等TCP狀態的連接數

netstat -tan |grep ^tcp |awk '{++a[$6]} END{for (i in a) print i, a[i]}'

 

方法二:利用ss命令

ss -s

 

Total: 541 (kernel 0)
TCP:   77 (estab 27, closed 45, orphaned 0, synrecv 0, timewait 45/0), ports 0

Transport Total     IP        IPv6
*	  0         -         -
RAW	  0         0         0
UDP	  8         5         3
TCP	  32        31        1
INET	  40        36        4
FRAG	  0         0         0

 

TCP連接狀態回顧

  • CLOSED:初始狀態,表示沒有任何連接。
  • LISTEN:Server端的某個Socket正在監聽來自遠方的TCP端口的連接請求。
  • SYN_SENT:發送連接請求后等待確認信息。當客戶端Socket進行Connect連接時,會首先發送SYN包,隨即進入SYN_SENT狀態,然后等待Server端發送三次握手中的第2個包。
  • SYN_RECEIVED:收到一個連接請求后回送確認信息和對等的連接請求,然后等待確認信息。通常是建立TCP連接的三次握手過程中的一個中間狀態,表示Server端的Socket接收到來自Client的SYN包,並作出回應。
  • ESTABLISHED:表示連接已經建立,可以進行數據傳輸。
  • FIN_WAIT_1:主動關閉連接的一方等待對方返回ACK包。若Socket在ESTABLISHED狀態下主動關閉連接並向對方發送FIN包(表示己方不再有數據需要發送),則進入FIN_WAIT_1狀態,等待對方返回ACK包,此后還能讀取數據,但不能發送數據。在正常情況下,無論對方處於何種狀態,都應該馬上返回ACK包,所以FIN_WAIT_1狀態一般很難見到。
  • FIN_WAIT_2:主動關閉連接的一方收到對方返回的ACK包后,等待對方發送FIN包。處於FIN_WAIT_1狀態下的Socket收到了對方返回的ACK包后,便進入FIN_WAIT_2狀態。由於FIN_WAIT_2狀態下的Socket需要等待對方發送的FIN包,所有常常可以看到。若在FIN_WAIT_1狀態下收到對方發送的同時帶有FIN和ACK的包時,則直接進入TIME_WAIT狀態,無須經過FIN_WAIT_2狀態。
  • TIME_WAIT:主動關閉連接的一方收到對方發送的FIN包后返回ACK包(表示對方也不再有數據需要發送,此后不能再讀取或發送數據),然后等待足夠長的時間(2MSL)以確保對方接收到ACK包(考慮到丟失ACK包的可能和迷路重復數據包的影響),最后回到CLOSED狀態,釋放網絡資源。
  • CLOSE_WAIT:表示被動關閉連接的一方在等待關閉連接。當收到對方發送的FIN包后(表示對方不再有數據需要發送),相應的返回ACK包,然后進入CLOSE_WAIT狀態。在該狀態下,若己方還有數據未發送,則可以繼續向對方進行發送,但不能再讀取數據,直到數據發送完畢。
  • LAST_ACK:被動關閉連接的一方在CLOSE_WAIT狀態下完成數據的發送后便可向對方發送FIN包(表示己方不再有數據需要發送),然后等待對方返回ACK包。收到ACK包后便回到CLOSED狀態,釋放網絡資源。
  • CLOSING:比較罕見的例外狀態。正常情況下,發送FIN包后應該先收到(或同時收到)對方的ACK包,再收到對方的FIN包,而CLOSING狀態表示發送FIN包后並沒有收到對方的ACK包,卻已收到了對方的FIN包。有兩種情況可能導致這種狀態:其一,如果雙方幾乎在同時關閉連接,那么就可能出現雙方同時發送FIN包的情況;其二,如果ACK包丟失而對方的FIN包很快發出,也會出現FIN先於ACK到達。

 

 

【參考】

http://www.cnblogs.com/fczjuever/archive/2013/04/05/3000680.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM