Linux netstat命令詳解
前言
對於netstat
命令,我還是非常熟悉的,最開始使用這個命令時,我主要用它來檢視埠的佔用情況,自從知道了netstat
命令的這個功能後,在後續的工作中,我基本都是使用這個命令來檢視埠的佔用情況,後來知道使用lsof
命令也可以,不清楚的夥計可以看下這篇《Linux lsof命令詳解》,但是也就知道這個命令的這個功能而已,其它功能基本上都是一無所知,後來說要了解網路的效能,講到也可以使用這個命令來玩,哎呦,出乎我的意料,使用了快三年的命令,居然還不知道這貨還有這個功能,索性就藉著這個機會,好好的把這個netstat
命令好好的整理一番。
命令簡介
netstat
命令用於顯示與IP、TCP、UDP和ICMP協議相關的統計資料,同時還可用於檢驗本機各埠的網路連線情況。伺服器有時候接收到的資料包導致資料出錯或故障,不必感到奇怪,TCP/IP可以容許這些型別的錯誤,並能夠自動重發資料報。但如果累計的出錯情況數目佔到所接收的IP資料報相當大的百分比,或者它的數目正迅速增加,那麼我們就應該使用netstat
查一查為什麼會出現這些情況了。
命令詳解
該工具對Linux網路管理員以及系統管理員非常有用,而且使用起來也是非常簡單的,雖然選項比較多,但是常用的就那麼幾個。
netstat
常用命令格式如下:
netstat <選項>
常用選項說明如下:
-a -t -u -n -l -p -r -e -s -c -i
LISTEN和LISTENING的狀態只有用-a
或者-l
才能看到
下面就對我們常用的使用方式進行詳細的總結。
使用例項
-
命令:
netstat -a
說明:列出所有連線
輸出:
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local AddressForeign AddressState tcp00 0.0.0.0:http0.0.0.0:*LISTEN tcp00 0.0.0.0:https0.0.0.0:*LISTEN tcp00 jellythink:https39.154.11.104:8543ESTABLISHED tcp00 jellythink:50398100.100.30.25:httpESTABLISHED tcp600 [::]:ftp[::]:*LISTEN tcp600 [::]:mysql[::]:*LISTEN udp00 jellythink:ntp0.0.0.0:* Active UNIX domain sockets (servers and established) Proto RefCnt FlagsTypeStateI-NodePath unix9[ ]DGRAM6897/dev/log unix2[ ]DGRAM9721/run/systemd/shutdownd unix3[ ]STREAMCONNECTED11477 unix3[ ]STREAMCONNECTED11478/run/systemd/journal/stdout unix3[ ]STREAMCONNECTED11234/run/systemd/journal/stdout unix2[ ]STREAMCONNECTED709729 unix3[ ]STREAMCONNECTED56906077 /run/systemd/journal/stdout unix3[ ]STREAMCONNECTED56906070
輸出主要包含兩部分:
- Active Internet connections (servers and established),稱為有源TCP連結,包括TCP和UDP等的詳細狀態;
- Active UNIX domain sockets (servers and established),稱為有源Unix域套介面(和網路套接字一樣,但是隻能用於本機通訊,效能可以提高一倍);
有源TCP連線欄位詳解:
-
Proto
:當前連線的協議;如TCP、UDP; -
Recv-Q
:網路接收佇列; -
Send-Q
:網路傳送佇列;接收佇列和傳送佇列一般都應該是0,如果不是則表示資料包正在佇列中堆積,但是這種情況比較少見; -
Local Address
:本機的ip:port(注意此處127.0.0.1預設顯示主機名,0.0.0.0預設顯示*,埠可能顯示別名。若強制顯示數字,加-n
引數) -
Foreign Address
:對端ip:port;與Local Address
規則相同 -
State
:當前套接字的網路狀態,有以下幾種狀態:LISTEN SYN-SENT SYN-RECEIVED ESTABLISHED FIN-WAIT-1 FIN-WAIT-2 CLOSE-WAIT CLOSING LAST-ACK TIME-WAIT CLOSED
如果對這裡的狀態不是很明白,可以參考我之前總結的一篇《簡析TCP的三次握手與四次分手 》
-
命令:
netstat -antp
說明:以數字的形式顯示所有的TCP連線,並顯示對應程式所監聽的埠號
輸出:
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local AddressForeign AddressStatePID/Program name tcp00 0.0.0.0:800.0.0.0:*LISTEN12886/nginx: worker tcp4010 172.17.169.20:45058106.11.68.13:80CLOSE_WAIT- tcp032 172.17.169.20:44392.247.181.16:34102FIN_WAIT1- tcp036 172.17.169.20:50022111.126.59.237:19225ESTABLISHED - tcp00 172.17.169.20:8092.247.181.16:59840TIME_WAIT-
-
命令:
netstat -anup
說明:以數字的形式顯示所有的UDP連線,並顯示對應程式所監聽的埠號
輸出:Active Internet connections (servers and established) Proto Recv-Q Send-Q Local AddressForeign AddressStatePID/Program name udp00 172.17.169.20:1230.0.0.0:*- udp00 127.0.0.1:1230.0.0.0:*- udp00 0.0.0.0:1230.0.0.0:*- udp600 :::123:::*-
-
命令:
netstat -st
說明:統計TCP協議相關的網路統計資料 -
命令:
netstat -rn
說明:列印核心路由資訊
輸出:
Kernel IP routing table DestinationGatewayGenmaskFlagsMSS Windowirtt Iface 0.0.0.0172.17.175.2530.0.0.0UG0 00 eth0 169.254.0.00.0.0.0255.255.0.0U0 00 eth0 172.17.160.00.0.0.0255.255.240.0U0 00 eth0
輸出內容詳解:
-
Destination
:目標網路或目標主機 -
Gateway
:閘道器地址,如果沒有就顯示星號 -
Genmask
:網路掩碼,0.0.0.0
表示預設路由 -
Flags
:標誌位,有以下常用取值:U H G
-
Iface
:網路介面名
-
-
命令:
netstat -ie
說明:顯示網路介面資訊
輸出:
Kernel Interface table eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500 inet 172.17.169.20netmask 255.255.240.0broadcast 172.17.175.255 ether 00:16:3e:08:08:55txqueuelen 1000(Ethernet) RX packets 118652133bytes 32809811588 (30.5 GiB) RX errors 0dropped 0overruns 0frame 0 TX packets 117764824bytes 141868266007 (132.1 GiB) TX errors 0dropped 0 overruns 0carrier 0collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING>mtu 65536 inet 127.0.0.1netmask 255.0.0.0 looptxqueuelen 1(Local Loopback) RX packets 176847758bytes 366499506703 (341.3 GiB) RX errors 0dropped 0overruns 0frame 0 TX packets 176847758bytes 366499506703 (341.3 GiB) TX errors 0dropped 0 overruns 0carrier 0collisions 0
這裡的輸出內容和《Linux ip命令詳解》中
ip -s link
的輸出內容是很像的,這裡就不再一一解釋了。
常用指令碼
netstat
命令在我們工作中是經常使用的,至少我是這樣。對於那些常用的指令碼,很多時候我們都是直接使用我們平時積累下來的指令碼。下面就將我經常使用的指令碼和大家分享。
-
統計TCP各個狀態數量
netstat -n | awk '/^tcp/{++state[$NF]}; END{for(key in state) print key, "\t", state[key]}'
通過上面的指令碼,我們可以快速的統計中當前TCP每個狀態的數量,通過這個數量,我們就可以大致知道伺服器TCP連線當前的健康狀態。
-
統計連線某服務埠最多的IP地址
netstat -nat | grep ":80" | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -20
總結
大過年的,還在寫部落格,我是多麼的愛學習。這篇關於netstat
命令的文章到此就總結完畢了,說實話,這篇文章總結的還是比較水的,有些細節的地方還是沒有總結到的,後續再根據實際的工作經驗繼續完善吧。最後,恭祝大家新年快樂!
果凍想,認真玩技術的地方。
2019年2月8日,於內蒙古包頭。