天天看點

linux netstat tcp(全連接配接半連接配接)詳解

  1. 功能介紹(參考 LINUX MAN指令 大家可以自己去看一下 這裡隻是列出常用的部分說明)

    顯示網絡連接配接狀态(如:LISTEN、ESTABLISHED、TIME_WAIT),路由位址,應用使用協定(如:TCP、UDP),IP和端口使用情況等其他網絡資訊。

  2. 常用參數

    –route , -r:顯示核心路由表

    –all , -a:顯示所有套接字

    -l, --listening:隻顯示正在偵聽的套接字

    –numeric , -n:顯示數字形式位址而不是去解析主機、端口或使用者名(注意 如果不使用這個參數的話 netstat指令的輸出回很慢 因為它會把數字形式的位址通過網絡去解析主機、端口或使用者名然後再展示)

    –groups , -g:顯示IPv4 和 IPv6的IGMP多點傳播組成員關系資訊

    –interprism language-linux">netstat -anp | more 列出所有端口并展示PID 和應用名稱 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:8008 0.0.0.0:* LISTEN 7037/nginx: worker tcp 0 0 0.0.0.0:8104 0.0.0.0:* LISTEN 7037/nginx: worker tcp 0 0 0.0.0.0:808 0.0.0.0:* LISTEN 7037/nginx: worker tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 7037/nginx: worker tcp 0 0 0.0.0.0:9001 0.0.0.0:* LISTEN 7037/nginx: worker tcp 0 0 0.0.0.0:8041 0.0.0.0:* LISTEN 10258/nginx: master

    netstat -ne | more 展示其他相關屬性 例如User
    
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode     
    tcp        0      0 10.10.151.199:58218     10.9.106.44:6379        ESTABLISHED 0          247408949 
    tcp        0      0 10.10.151.199:44732     10.9.109.91:11211       ESTABLISHED 1001       254160642 
    tcp        0      0 10.10.151.199:55368     10.9.109.91:11211       ESTABLISHED 1001       254170734 
    tcp        0      0 10.10.151.199:51250     10.9.106.44:6379        ESTABLISHED 0          246984680 
    tcp        0      0 10.10.151.199:22        10.10.123.101:60782     ESTABLISHED 0          251455650 
    tcp        0      0 10.10.151.199:22        10.10.123.101:46285     ESTABLISHED 0          253605784
               
    netstat -nu | more 展示UDP連接配接情況 t代表tcp
    
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    udp        0      0 10.10.170.211:38608     10.10.255.1:53          ESTABLISHED
    udp        0      0 10.10.170.211:55056     10.10.255.1:53          ESTABLISHED
    udp        0      0 10.10.170.211:39151     10.10.255.2:53          ESTABLISHED
               
    netstat -r 顯示路由相關資訊
    
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    default         gateway         0.0.0.0         UG        0 0          0 eth0
    10.10.0.0       0.0.0.0         255.255.0.0     U         0 0          0 eth0
               
    netstat -l | more 顯示監聽端口
    
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 0.0.0.0:8008            0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:8104            0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:omirr           0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN 
               
    netstat -s | grep TCP | more   顯示TCP協定的統計資訊
     
     105128896 TCP sockets finished time wait in fast timer
     39460900 TCP sockets finished time wait in slow timer
     TCPLostRetransmit: 287
     3358476 other TCP timeouts
     TCPLossProbes: 78189
     TCPLossProbeRecovery: 34923
               

    各列的含義

    Proto: 套接字使用的協定

    Recv-Q: 連接配接此套接字的使用者程式未拷貝的位元組數

    Send-Q:遠端主機未确認的位元組數

    Local Address: 套接字的本地位址(本地主機名)和端口号。除非給定-n 選項,否則套接字位址按标準主機名(FQDN)進行解析,而端口号則轉換到相應的服務名。

    Foreign Address:套接字的遠端位址(遠端主機名)和端口号

    State:套接字的狀态。因為在RAW協定中沒有狀态,而且UDP也不用狀态資訊,是以此行留白。通常它為以下幾個值之一:ESTABLISHED、SYN_SENT、SYN_RECV、FIN_WAIT1、FIN_WAIT2、TIME_WAIT、CLOSED、CLOSE_WAIT、LAST_ACK、LISTEN、CLOSING、UNKNOWN(就是TCP協定裡面的伺服器的網絡狀态 後面有詳細講解TCP哈 )

    User:套接字屬主的名稱或UID

    PID/Program name: 以斜線分隔的處理套接字程式的PID及程序名。-p使此欄目被顯示。你需要sudo權限來檢視不是你擁有的套接字的資訊。對IPX套接字還無法獲得此資訊。

  3. TCP三向交握

    過程如下:

    伺服器準備接收用戶端請求 此時伺服器處于LISTEN(監聽)狀态

    用戶端送出請求 此時用戶端進入SYN-SENT(同步已發送)狀态

    伺服器接收請求後确認建立連接配接 向用戶端發送确認 此時伺服器處于SYN_RCVD(同步收到)

    用戶端收到确認後還需要向伺服器确認 此時進入ESTABLISHED(已建立連接配接)狀态

    linux netstat tcp(全連接配接半連接配接)詳解

    如圖所示:

    syns queue: 半連接配接隊列用來存儲 SYN_RCVD狀态的未完成連接配接的資訊 服務端第一次收到用戶端請求時将連接配接資訊放在隊列中

    accept queue: 全連接配接隊列用來存儲ESTABLISH狀态的已完成連接配接的資訊 第三步伺服器收到用戶端确認時會把半連接配接隊列中的資訊放到全連接配接當中

    cat /proc/sys/net/ipv4/tcp_max_syn_backlog 檢視系統設定半隊列長度
    256
    
    cat /proc/sys/net/core/somaxconn  檢視系統設定全隊列長度
    128
    
    cat /proc/sys/net/ipv4/tcp_abort_on_overflow  檢視全連接配接隊列溢出後OS如何處理 0 丢掉用戶端傳來的請求 1 傳回用戶端reset 取消握手
    0
    
    cat /proc/sys/net/ipv4/tcp_synack_retries  全連接配接溢出後 伺服器重新和用戶端連接配接嘗試次數
    5
               

    全連接配接隊列的大小取決于:min(backlog,somaxconn)。backlog 是在 Socket 建立的時候傳入的,Somaxconn 是一個 OS 級别的系統參數。

    半連接配接隊列的大小取決于:max(64,/proc/sys/net/ipv4/tcp_max_syn_backlog),不同版本的 OS 會有些差異。

    netstat -s | grep SYNs   檢視半連接配接溢出量
    17484 SYNs to LISTEN sockets dropped
    
    netstat -s | grep TCPBacklogDrop 檢視全連接配接溢出量
    TCPBacklogDrop: 181071
               
    ss -lnt |more  展示每一個端口對應的全連接配接隊列大小 Send-Q  Recv-Q表示有多少等待連接配接數
    State      Recv-Q Send-Q                    Local Address:Port                                   Peer     Address:Port              
    LISTEN     0      128                                   *:8008                                              *:*                  
    LISTEN     0      128                                   *:8104                                              *:*                  
    LISTEN     0      128                                   *:808                                               *:*                  
    LISTEN     0      128                                   *:8009                                              *:*                  
    LISTEN     0      128                                   *:9001                                              *:*     
               
    在出現全連接配接和半連接配接溢出的情況是 會導緻用戶端通路時間(網絡時間+排隊時間+重試時間+服務時間)過長 而伺服器真正服務的時候又很短 是以适當合理的控制一下全連接配接隊列的大小 可以幫助我們避免全連接配接隊列溢出的情況

參考文章:

https://mp.weixin.qq.com/s/eZU573-o-KVmVyU11esb4A

https://www.cnxct.com/something-about-phpfpm-s-backlog/

https://blog.csdn.net/feeltouch/article/details/83155607

http://www.orczhou.com/index.php/2011/10/tcpip-protocol-start-rto/