`netstat`命令可以用來查詢整個系統的網路狀態。百度百科的定義如下: Netstat的 "定義" 是: Netstat是在 "內核" 中訪問網路連接狀態及其相關信息的 "程式" ,它能提供TCP連接,TCP和UDP監聽,進程 "記憶體管理" 的相關報告。 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:表示連接使用的協議,常見的有
tcp
、udp
和tcp6
等; - 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