前言
在調試網絡程序或者定位網絡相關問題時,有一個命令不得不知,它就是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更詳細的字段解釋可以參考其手冊。