天天看點

netstat指令 常用參數

前言

在調試網絡程式或者定位網絡相關問題時,有一個指令不得不知,它就是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指令中的方法來檢視。

查找占用端口的程序

前面雖然知道已經有程序使用了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
           

這樣,它就會每隔一秒執行一次。

檢視使用者和連接配接的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更詳細的字段解釋可以參考其手冊。

繼續閱讀