好用netstat指令

系統技術/Windows 2008/08/06 13:42
views: 123073 times
在 windows 下使用 netstat 指令來查詢已開啟的 listen port (-a), 以及已建立的連線 (active connection) 是十分方便的工具. 不過若是要知道該 connection 或 listen port 是由哪個 process 建立的, 在 netstat 指令下是無法達成的, 必須藉由另一個 sysinternals (被 ms 併入了)的 tcpview 工具.

不過, 現在可以不用這麼麻煩了, netstat 工具已經增加了這個功能, 指令是 (-b), 例如:

netstat -nb

可以找出目前建立 connection 的不解析名稱(即使用ip及port number, -n)的方式, 列出對應的執行檔名稱及 process id (PID), 如此一來, 對於要快速追蹤 active connection 及 listen port 的 process (或執行檔名) 可以更快速的利用指令來取得.

常用的方式如下:

netstat -na

netstat -nab

為什麼使用 -n, 因為可以不用反查 hostname, 直接顯示 ip, 速度較快啦.
另外使用 -b 的功能應該是要在 windows 2003 sp2 及以上, windows xp sp3, windows vista 以上才有.
以下為 netstat 的指令功能列表:

顯示通訊協定統計資料以及目前的 TCP/IP 網路連線。

NETSTAT [-a] [-b] [-e] [-n] [-o] [-p proto] [-r] [-s] [-t] [-v] [interval]

  -a            顯示所有連線以及接聽連接埠。
  -b           顯示關於建立各連線或接聽連接埠的可執行檔。某些情況下是知名的可執行主機多重獨立元件,在這些情況下則會顯示關於建立連線或接聽連接埠的元件組合。在此狀況下,可執行檔的名稱顯示於底部的 [] 中,而其呼叫的元件則顯示於頂端,直到取得 TCP/IP 為止。請注意,這個選項可能需要很多時間而且可能會失敗,除非您有足夠的權限。
  -e            顯示乙太網路統計資料。這可結合 -s該選項。
  -n            以數字形式顯示位址與連接埠號。
  -o            顯示與各連線有關之所擁有的處理程序。
  -p 通訊協定   顯示由通訊協定所指定的通訊協定連線;通訊協定可能為下列其中一種:TCP、UDP、TCPv6 或 UDPv6。如果使用此 -s選項顯示每一個通訊協定統計資料,則通訊協定可能為下列其中一種:IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
  -r            顯示路由表。
  -s            顯示每一個通訊協定統計資料。根據預設值,會顯示 IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的統計資料;此 -p 選項可用於指定預設子集。
  -t            顯示目前的連線卸載狀態。
  -v            與 -b 搭配使用時,將顯示關於建立所有可執行檔之連線或接聽連接埠的元件組合。
  間隔      重新顯示已選的統計資料,並在每次顯示的間隔暫停數秒。按下 CTRL+C 以停止顯示統計資料。如果省略此步,則 netstat 將列印目前的組態資訊。


netstat 指令用法,及狀態說明

netstat 指令
netstat是一個可以查詢本機網路和外界網路連線的指令,可以透過這個指令的查詢得知有沒有奇怪的連線在你的機器中連線,也可透過此指令瞭解電腦連線的狀況。
這個指令windows 上也有,Linux上也有,但在參數與用法有一些不同。
Windows 上得說明可以參考 m$ 的 netstat 說明
節錄及翻譯如下:
語法:
netstat [-a] [-e] [-n] [-o] [-p Protocol] [-r] [-s] [Interval]

參數:
-a : 顯示所有活動中的 TCP 連線,及 TCP and UDP ports 上聆聽中的資訊。

-e : 顯示網路的統計資訊,如 bytes 數和封包發送和接收的數量.這參數通常和 -s 並用。

-n : 顯示活動的TCP連線,但是 ip address和port編號沒有被解釋翻譯成為名稱說明。(通常可以加速顯示的速度因為反解通常需要查詢 dns 的時間)

-o : 顯示活動的 TCP 連線並且包含每個連線程序的 ID 編號(PID).你能夠找到應用程式的程序的PID資訊,在 windows 的工作管理員。這個參數通常和 -a, -n, and -p 混合使用.

-p 通訊協定 : 顯示指連線的通訊協定.預設的狀況這個通訊協定包含 tcp, udp, tcpv6, or udpv6. 如果配合 -s 參數則是可以顯示統計數量。

-s : 顯示統計資訊。預設顯示 TCP, UDP, ICMP, and IP 通訊協定. 如果 IPv6 protocol for Windows XP 被安裝的話, 統計資料顯示 TCP over IPv6, UDP over IPv6, ICMPv6, and IPv6 protocols.

-r : 顯示 IP 路由表的內容. 相當於 route print 命令.

Interval : 每隔幾秒重新顯示資訊. 按 CTRL+C 可以停止顯示. 如果省略則只顯示一次。

/? : 此說明

netstat -e



netstat -n

netstat -o

netstat -on 5

在這些資訊中,必須要先瞭解關於TCP 連線的的溝通方式。看起來才不會覺得怪怪的一直看不懂...

Protocol的執行過程描述:

下圖描述為一張簡化的TCP狀態圖,更詳細可以看這份文件(TCP EFSM diagram)


引用自 http://en.wikipedia.org/wiki/Transmission_Control_Protocol


TCP通訊過程可分為三個階段。且必須正確建立連接在一個很多步驟的交握處理(handshake process)然後才進入建立連接(connection establishment),再進入資料傳輸(data transfer) 階段。資料傳輸完成後,最後連接終止(connection termination)建立的虛擬通道關閉並釋放所有分配的資源。

一個TCP連接是由OS管理,TCP連線基本上經歷底下這些變化:

 1. LISTEN:如果是服務程式的話,指的是等待連接請求從任何遠端的客戶端。
 2. SYN-SENT:等待遠端點對點發回一個 TCP segment 並帶有 SYN 和 ACK flag。通常做這件事的為TCP客戶端。
 3. SYN-RECEIVED:等待遠端通道的另一端發回一個確認後發回確認連接到遠程節點。通常做這件事的為TCP服務端。
 4. ESTABLISHED: port 準備好接收/及發送數據從到遠端節點。
 5. FIN-WAIT-1
 6. FIN-WAIT-2
 7. CLOSE-WAIT
 8. CLOSING
 9. LAST-ACK
10. TIME-WAIT:指等待足夠的時間,以確保通過遠端對等機器收到確認其連接終止請求。根據 RFC 793中的連接可以等到最久為四分鐘。
11. CLOSED

詳細網路協定可以參考:市面上的TCP/IP 書籍

底下這是 Linux man netstat 對於狀態的解釋

netstat 的狀態

   State
       The  state  of  the socket. Since there are no states in raw mode and usually no states used in UDP, this column
       may be left blank. Normally this can be one of several values:

       ESTABLISHED
              The socket has an established connection.

       SYN_SENT
              The socket is actively attempting to establish a connection.

       SYN_RECV
              A connection request has been received from the network.

       FIN_WAIT1
              The socket is closed, and the connection is shutting down.

       FIN_WAIT2
              Connection is closed, and the socket is waiting for a shutdown from the remote end.

       TIME_WAIT
              The socket is waiting after close to handle packets still in the network.

       CLOSE  The socket is not being used.

       CLOSE_WAIT
              The remote end has shut down, waiting for the socket to close.

       LAST_ACK
              The remote end has shut down, and the socket is closed. Waiting for acknowledgement.

       LISTEN The socket is listening for incoming connections.  Such sockets are not included in the output unless you
              specify the --listening (-l) or --all (-a) option.

       CLOSING
              Both sockets are shut down but we still don't have all our data sent.

       UNKNOWN
              The state of the socket is unknown.           
         
在 Linux 上有幾種特殊的用法
引用自 http://www.hkcode.com/linux-bsd-notes/559
以下是一些實用的 netstat 語法,可以檢查主機的連線數量:

netstat -na
顯示主機上所有已建立的連線。

netstat -an | grep :80 | sort
顯示所有 port 80 的連線,並把結果排序。

netstat -n -p|grep SYN_REC | wc -l
列出主機上有多少個 SYNC_REC,一般上這個數字應該相當低。

netstat -n -p | grep SYN_REC | sort -u
同樣是列出 SYNC_REC,但不只列出數字,而是將每個 SYNC_REC 的連線列出。

netstat -n -p | grep SYN_REC | awk ‘{print $5}’ | awk -F: ‘{print $1}’
列出發送 SYNC_REC 的所有 ip 地址。

netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
計算每一個 ip 在主機上建立的連線數量。

netstat -anp |grep ‘tcp\|udp’ | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
列出從 TCP 或 UDP 連線到主機的 ip 的數量。

netstat -ntu | grep ESTAB | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr
列出每個 ip 建立的 ESTABLISHED 連線數量。

netstat -plan|grep :80|awk {’print $5′}|cut -d: -f 1|sort|uniq -c|sort -nk 1
列出每個 ip 建立的 port 80 連線數量。

Linux netstat 使用範例:
netstat -alp 列出連線的協定及使用的應用程式