1. 程式人生 > >網路狀態診斷工具——netstat命令

網路狀態診斷工具——netstat命令

netstat命令可以用來查詢整個系統的網路狀態。百度百科的定義如下:

Netstat的定義是: Netstat是在核心中訪問網路連線狀態及其相關資訊的程式,它能提供TCP連線,TCP和UDP監聽,程序記憶體管理的相關報告。

Netstat是控制檯命令,是一個監控TCP/IP網路的非常有用的工具,它可以顯示路由表、實際的網路連線以及每一個網路介面裝置的狀態資訊。Netstat用於顯示與IP、TCP、UDP和ICMP協議相關的統計資料,一般用於檢驗本機各埠的網路連線情況。

從上面的百科介紹我們可以看出,netstat命令在查詢網路問題的時候十分有用。下面就來詳細介紹下netstat的用法。

使用語法

netstat [-acCeFghilMnNoprstuvVwx][-A<網路型別>][--ip]

引數說明

  • -a或--all 顯示所有連線中的Socket。
  • -A<網路型別>或--<網路型別> 列出該網路型別連線中的相關地址。
  • -c或--continuous 持續列出網路狀態。
  • -C或--cache 顯示路由器配置的快取資訊。
  • -e或--extend 顯示網路其他相關資訊。
  • -F或--fib 顯示FIB。
  • -g或--groups 顯示多重廣播功能群組組員名單。
  • -h或--help 線上幫助。
  • -i或--interfaces 顯示網路介面資訊表單。
  • -l或--listening 顯示監控中的伺服器的Socket。
  • -M或--masquerade 顯示偽裝的網路連線。
  • -n或--numeric 直接使用IP地址,而不通過域名伺服器。
  • -N或--netlink或--symbolic 顯示網路硬體外圍裝置的符號連線名稱。
  • -o或--timers 顯示計時器。
  • -p或--programs 顯示正在使用Socket的程式識別碼和程式名稱。
  • -r或--route 顯示Routing Table。
  • -s或--statistice 顯示網路工作資訊統計表。
  • -t或--tcp 顯示TCP傳輸協議的連線狀況。
  • -u或--udp 顯示UDP傳輸協議的連線狀況。
  • -v或--verbose 顯示指令執行過程。
  • -V或--version 顯示版本資訊。
  • -w或--raw 顯示RAW傳輸協議的連線狀況。
  • -x或--unix 此引數的效果和指定"-A unix"引數相同。
  • --ip或--inet 此引數的效果和指定"-A inet"引數相同。

使用例項


[root@SHA-L0161171 arthas]$ netstat -an            
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:8004            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:11052           0.0.0.0:*               LISTEN     
tcp        0      0 172.24.248.108:8004     192.168.202.31:57588    ESTABLISHED
tcp        0      0 127.0.0.1:51092         127.0.0.1:8091          TIME_WAIT  
tcp        0      0 172.24.248.108:8004     192.168.202.38:32283    ESTABLISHED
tcp        0      0 172.24.248.108:8004     192.168.202.38:58923    TIME_WAIT  
tcp        0      0 172.24.248.108:8004     192.168.202.32:39983    ESTABLISHED
tcp        0      0 172.24.248.108:8004     192.168.202.37:38230    ESTABLISHED
tcp        0      0 172.24.248.108:8004     192.168.202.34:5081     ESTABLISHED
tcp        0      0 172.24.248.108:8004     192.168.202.32:17240    ESTABLISHED
tcp        0      0 127.0.0.1:38784         127.0.0.1:12050         TIME_WAIT  

...

Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  3      [ ]         DGRAM                    18442    /run/systemd/notify
unix  2      [ ]         DGRAM                    18444    /run/systemd/cgroups-agent
unix  2      [ ]         DGRAM                    23822    /var/run/chrony/chronyd.sock
unix  8      [ ]         DGRAM                    18455    /run/systemd/journal/socket
unix  18     [ ]         DGRAM                    18457    /dev/log
unix  2      [ ]         DGRAM                    14151    /var/run/nscd/socket
unix  2      [ ]         DGRAM                    584      /run/systemd/shutdownd
unix  3      [ ]         STREAM     CONNECTED     124439388 /run/dbus/system_bus_socket
unix  3      [ ]         STREAM     CONNECTED     42312    /run/systemd/journal/stdout
unix  3      [ ]         STREAM     CONNECTED     39909

上面的輸出包含兩個部分:

1、Active Internet connections 有源TCP連線,其中"Recv-Q"和"Send-Q"指接收佇列和傳送佇列。這些數字一般都應該是0。如果不是則表示軟體包正在佇列中堆積。這種情況只能在非常少的情況見到。

2、Active UNIX domain sockets 有源Unix域套介面(和網路套接字一樣,但是隻能用於本機通訊,效能可以提高一倍)。

對於Internet connections部分輸出引數,做下重點介紹

  • Proto:表示連線使用的協議,常見的有tcpudptcp6等;
  • Recv-Q:指接收佇列,這個數字一般都應該是0,如果不是則表示資料包正在佇列中堆積。拿Tomcat伺服器舉個列子:當Tcp連線建立後,Tomcat伺服器中會有一個accepter執行緒取出這個連線讓worker執行緒處理,現在假如連線建立的速度遠遠大於accepter執行緒取連線的速度,那麼連線就在佇列中堆積,此時Recv-Q就會大於0;還有一種可能就是系統遭遇到了Dos攻擊,已經不能再響應外部請求;
  • Send-Q:傳送佇列,對方沒有收到的資料或者說沒有Ack的,還是本地緩衝區,如果傳送佇列Send-Q不能很快的清零,可能是有應用向外傳送資料包過快,或者是對方接收資料包不夠快;
  • Local Address:表示本地地址,這個欄位一般有三種形式的值:

    • 172.24.248.108:8004 : 這種形式的值是最常見的值,表示本機有個ip地址是172.24.248.108,有個程式正在使用本機的8004埠和外部程式建立連線;
    • 0.0.0.0:8004 : 這種形式的值看起來比較奇怪,其實其中的0.0.0.0表示的是所有能表示本機的ip地址。我們知道機器是可以配置多塊網絡卡的,比如現在我們的機器配置了兩個網絡卡,其中一塊配置的地址是172.24.248.108,另外一塊配置的地址是172.24.248.109,那麼這邊的0.0.0.0就是表示172.24.248.108、172.24.248.109和127.0.0.1這三個IP。
    • :::8004 : 其中的::表示全0的IP地址,比如:::* 表示全0的IPv6地址,*表示任意的埠號,全0的含義和0.0.0.0的含義相同。
  • Foreign Address:和本機通訊的外部IP地址,顯示規則和Local Address類似,不再贅述了;
  • State:表示連線狀態,常見的連線狀態如下:

LISTEN :The socket is listening for incoming  connections (偵聽來自遠方TCP埠的連線請求)
SYN_SENT:The socket is actively attempting to establish aconnection. (在傳送連線請求後等待匹配的連線請求)
SYN_RECV:A connection request has been received from the network. (在收到和傳送一個連線請求後等待對連線請求的確認)
ESTABLISHED:The socket has an established connection. (代表一個開啟的連線,資料可以傳送給使用者)
FIN_WAIT1: The socket is closed, and the connection is shutting down. (等待遠端TCP的連線中斷請求,或先前的連線中斷請求的確認 )
CLOSE_WAIT:The remote end has shut down, waiting for the socketto close. (等待從本地使用者發來的連線中斷請求)
FIN_WAIT2:Connection is closed, and the socket is waiting for a shutdownfrom the remote end. (從遠端TCP等待連線中斷請求 )
LAST_ACK: The remote end has shut down, and the socket is closed. Waiting foracknowledgement. (等待原來發向遠端TCP的連線中斷請求的確認)
TIME_WAIT:Thesocket is waiting after close to handle packets still in the network (等待足夠的時間以確保遠端TCP接收到連線中斷請求的確認)
CLOSING: Bothsockets are shut down but we still don’t have all our datasent. (等待遠端TCP對連線中斷的確認)
CLOSED:The socket is not being used. (沒有任何連線狀態 )
UNKNOWN:Thestate of the socket is unknown。

備註

  • SYN: (同步序列編號,SynchronizeSequence Numbers)該標誌僅在三次握手建立TCP連線時有效。表示一個新的TCP連線請求。
  • ACK: (確認編號,AcknowledgementNumber)是對TCP請求的確認標誌,同時提示對端系統已經成功接收所有資料。
  • FIN: (結束標誌,Finish)用來結束一個TCP回話.但對應埠仍處於開放狀態,準備接收後續資料。

常用netstat命令

1. 列出所有資訊

netstat -a
# 其中n表示使用IP地址表示機器資訊,而不是使用域名
netstat -an

這個命令配合grep最常使用。

2. 只顯示監聽埠

netstat -l

3. 顯示PID和程序名稱

netstat -anp

4. 持續輸出狀態資訊

netstat -anpc

5. 檢視連線某服務埠最多的的IP地址(前20個)

netstat -nat | grep "xx.xx.xx.xx:port" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20

輸出

      4 192.168.202.38
      4 192.168.202.37
      4 192.168.202.36
      4 192.168.202.35
      3 192.168.202.34
      3 192.168.202.33
      3 192.168.202.32
      2 192.168.202.31

參考

  • https://blog.csdn.net/dongl890426/article/details/86981901
  • https://blog.csdn.net/qq_42014600/article/details/90372315
  • https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html