前言

在調試網路程序或者定位網路相關問題時,有一個命令不得不知,它就是netstat。netstat命令用於查看網路連接,路由表,網路介面統計數據, 虛擬連接等信息。netstat的選項很多,但是本文準備介紹一些netstat命令的實用技巧。

查看某個埠是否被佔用

如果你遇到「Address already in use」的錯誤,那麼你就需要好好看看是不是埠已經被佔用了。-a(all)參數用於列出所有監聽和非監聽狀態的連接

$ netstat -a|grep 6379
tcp 0 0 *:6379 *:* LISTEN
tcp6 0 0 [::]:6379 [::]:* LISTEN

這裡我們可以看到,有一個tcp連接使用了6379埠,並且當前處於LISTEN狀態,這些狀態信息對於分析網路連接問題非常有幫助,我們將會在後面的文章中看到它們大放異彩。

當然你也可以使用lsof命令中的方法來查看。關於grep的用法,也可以參考《grep命令詳解》,這裡就不展開了,我們後面會在很多地方用到。

查找佔用埠的進程

前面雖然知道已經有進程使用了6379埠,但是不知道是哪個進程,因此為了知道進程信息,需要使用-p(program)參數

$ netstat -ap|grep 6379
tcp 0 0 *:6379 *:* LISTEN 10011/redis-server
tcp6 0 0 [::]:6379 [::]:* LISTEN 10011/redis-server

這個時候就可以看到是進程id為10011的redis-server進程佔用了6379埠,至此要殺要剮就隨你便了。

查看指定協議的連接

我們都知道,除了TCP之外還有UDP,如果我們想查看指定類型的連接呢?

$ netstat -at #-t,查看tcp連接
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.0.103:42468 113.96.233.139:https ESTABLISHED
tcp 0 0 192.168.0.103:59326 123.58.182.252:https TIME_WAIT
tcp 0 0 192.168.0.103:59328 123.58.182.252:https TIME_WAIT
(未顯示完全)

以此種方式,可以看到所有的TCP連接,而對於UDP連接,只需要使用-u(UDP):

$ netstat -au
udp 0 0 *:36305 *:*
udp 0 0 127.0.1.1:domain *:*
udp 0 0 *:bootpc *:*
udp 0 0 *:ipp *:*

(未顯示完全))

當然了,這兩個參數也是可以一起用的。

除此之外,還可以使用-4或-6來指定查看ipv4還是ipv6的連接:

查看處於監聽狀態的連接

對於還沒有建立完整連接的伺服器來說,它啟動後正常的狀態是LISTEN狀態,如果只想查看處於該狀態的連接,則可以使用-l(LISTEN)參數

$ netstat -l
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.1.1:domain *:* LISTEN
tcp 0 0 localhost:5941 *:* LISTEN
tcp 0 0 localhost:ipp *:* LISTEN
tcp 0 0 localhost:socks *:* LISTEN
tcp 0 0 *:6379 *:* LISTEN
(未顯示完全)

這個時候記得不要帶上-a參數,它會列出所有。

而你如果要查看其他狀態的連接,只需要結合grep使用即可,例如,查看ESTABLISHED狀態的連接:

$ netstat -anp |grep ESTAB
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 192.168.0.103:42468 113.96.233.139:443 ESTABLISHED 2613/chrome
tcp 0 0 192.168.0.103:38024 108.177.125.188:443 ESTABLISHED 2613/chrome

不解析主機,埠等信息

不知道你有沒有發現,在執行前面的命令的時候,速度很慢,讓你一度懷疑是不是自己電腦太卡了。實際上,你觀察前面的輸出結果就會發現,很多連接的主機名和埠對應的應用都解析出來了,例如:

123.58.182.252:https

所以慢是因為它需要做解析,使用-n(numeric)參數就可以快速顯示原始數字埠或地址了

$ netstat -anp

一定要自己嘗試一下奧!

持續輸出連接信息

你在定位網路相關問題的時候,總不想執行一次觀察一次吧?能不能自動反覆執行查看呢?當然可以啦!可以使用-c(continuous)參數:

$ netstat -npc

這樣,它就會每隔一秒執行一次。當然你完全可以使用watch命令,關於watch命令的使用可以參考《解放你的雙手-watch》。

查看用戶和連接的iNode

這條連接是哪個用戶建立的呢?unix下一切皆文件,那麼這個連接的iNode是多少呢?藉助-e(extend)參數可以看到這些信息:

$ netstat -ent
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode
tcp 0 0 192.168.0.103:42468 113.96.233.139:443 ESTABLISHED 1000 134891
tcp 0 0 192.168.0.103:46556 121.9.246.106:443 TIME_WAIT 0 0

可以看到在使用-e參數後,多了最後兩列,分別是user和Inode。而使用id命令可以知道該user到底是誰:

$ id 1000
uid=1000(hyb) gid=1000(hyb) groups=1000(hyb),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)

查看連接相關的定時器

使用-o可以查看和連接相的定時器信息,

$ netstat -nto
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State Timer
tcp 0 0 192.168.0.103:42468 113.96.233.139:443 ESTABLISHED keepalive (18.69/0/0)
tcp 1 1 192.168.0.103:43718 113.96.233.139:443 LAST_ACK on (19.97/7/0)
tcp 0 0 192.168.0.103:38024 108.177.125.188:443 ESTABLISHED keepalive (34.76/0/0)
tcp 0 0 192.168.0.103:60362 123.58.182.252:443 TIME_WAIT timewait (6.70/0/0)
tcp6 0 0 127.0.0.1:9614 127.0.0.1:59736 ESTABLISHED off (0.00/0/0)

最後的timer列相關欄位含義如下:

  • keepalive keepalive的時間計時
  • on 重發的時間計時
  • off 沒有時間計時
  • timewait 等待時間計時

關於定時器的含義,需要對TCP協議有較多理解,這裡就不展開了。

查看數據包統計信息

各種協議的數據包的收發情況如何呢?連接數量如何呢是用-s(statistics)參數可以查看:

$ netstat -s
(僅顯示了TCP協議的結果)
Tcp:
3067 active connections openings
1 passive connection openings
173 failed connection attempts
587 connection resets received
10 connections established
657576 segments received
456349 segments send out
2700 segments retransmited
16 bad segments received.
1321 resets sent

查看路由信息

使用-r(route)參數可以查看路由相關信息,例如:

$ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 wlp3s0
link-local * 255.255.0.0 U 0 0 0 wlp3s0
192.168.0.0 * 255.255.255.0 U 0 0 0 wlp3s0

當然你也可以藉助route命令完成這樣簡單的工作。

總結

netstat命令是我們定位網路相關問題的利器,如果你還不會使用,那麼最好花幾分鐘學習一下。netstat更詳細的欄位解釋可以參考其手冊。

本文最新地址netstat命令實例詳解

微信公眾號【編程珠璣】:專註但不限於分享計算機編程基礎,Linux,C語言,C++,數據結構與演算法,工具,資源等編程相關[原創]技術文章,號內包含大量經典電子書和視頻學習資源。歡迎一起交流學習,一起修鍊計算機「內功」,知其然,更知其所以然。


推薦閱讀:
相關文章