netstat的替代者-ss命令实例详解
來源:公眾號【編程珠璣】
作者:守望先生
原文地址:https://www.yanbinghu.com/2019/06/30/19183.html前言
之前在介紹netstat的時候說過,netstat是一個非常實用的socket查看命令。但是有人留言它已經被ss(Socket Statistics)替代了,那么這個所謂替代netstat的命令,到底怎么用呢?為什么它能替代netstat?
為什么使用ss
值得注意的是,幾乎所有的linux系統都默認支持netstat命令,而并不一定支持ss,從這一點來說,netstat通常還是不二選擇。但是不得不承認的是,ss命令更加快捷高效。
netstat從proc文件系統(可參考linux中不可錯過的信息寶庫)獲取所需要的信息,而ss利用netlink機制,與內核通信,通過TCP 協議棧中 tcp_diag 模塊獲取第一手的內核信息。當然這些都不是我們關注的重點,我們來看看ss命令到底如何使用。
查看TCP/UDP連接
使用-t(TCP)參數查看TCP連接,而使用-u(UDP)參數查看UDP socket:
$?ss?-t State???????Recv-Q?Send-Q?????????????????????????????????????Local?Address:Port??????????????????????????????????????????????????????Peer?Address:Port????????????????ESTAB???????0??????0??????????????????????????????????????????192.168.0.103:56296???????????????????????????????????????????????????113.107.216.82:https???????????????? ESTAB???????0??????0??????????????????????????????????????????192.168.0.103:56540??????????????????????????????????????????????????185.199.108.153:https???????????????? ESTAB???????0??????0??????????????????????????????????????????????127.0.0.1:socks????????????????????????????????????????????????????????127.0.0.1:44452???????????????? ESTAB???????0??????0??????????????????????????????????????????????127.0.0.1:42150????????????????????????????????????????????????????????127.0.0.1:9614?其中state顯示了當前連接的狀態,例如結果的第一行是ESTABLISHED狀態,Local Address:port代表本地連接的ip和端口號。另外使用-n參數顯示數字形式的ip和端口。
查看socket進程信息
查看到某個連接后,怎么知道是哪個進程的連接呢?使用-p(processes)即可,例如:
$?ss?-tp State???????Recv-Q?Send-Q?????????????????????????????????????Local?Address:Port??????????????????????????????????????????????????????Peer?Address:Port???????????????ESTAB???????0??????0??????????????????????????????????????????????127.0.0.1:42150????????????????????????????????????????????????????????127.0.0.1:9614??????????????????users:(("chrome",pid=2578,fd=347)) ESTAB???????0??????0??????????????????????????????????????????????127.0.0.1:41910????????????????????????????????????????????????????????127.0.0.1:9614??????????????????users:(("chrome",pid=2578,fd=383))拖動滾動條到最后可以看到,-p參數顯示了這條連接的進程信息,例如,對于第一條結果,可以看到,該進程是chrome,進程id為2578,并且這條連接的文件描述符為383。
users:(("chrome",pid=2578,fd=383))"chrome",pid=2578,fd=383))查看處于特定狀態的socket
我們知道,對于TCP連接來講,在不同的階段它的狀態不同,常見狀態有
這里還有很多其他狀態,我們會留到介紹TCP的時候展開。
如何查看處于特定狀態的連接呢?例如,要查看處于LISTENING狀態的連接:
$?ss?-t?state?LISTENING Recv-Q?Send-Q??????????????????????????????????????????Local?Address:Port???????????????????????????????????????????????????????????Peer?Address:Port????????????????0??????5???????????????????????????????????????????????????127.0.1.1:domain????????????????????????????????????????????????????????????????????*:*???????????????????? 0??????128?????????????????????????????????????????????????127.0.0.1:5941??????????????????????????????????????????????????????????????????????*:*???????????????????? 0??????5???????????????????????????????????????????????????127.0.0.1:ipp???????????????????????????????????????????????????????????????????????*:*使用state選項即可查看。當然對于LISTENING狀態,也可以使用-l參數。
除此之外,還有以下參數,用于查看某類狀態,例如:
查看TCP相關定時器信息
我們知道在TCP中,有很多定時器,和netstat一樣,可以使用-o參數顯示定時器相關信息:
$?ss?-to State???????Recv-Q?Send-Q?????????????????????????????????????Local?Address:Port??????????????????????????????????????????????????????Peer?Address:Port????????????????ESTAB???????0??????0??????????????????????????????????????????????127.0.0.1:44660????????????????????????????????????????????????????????127.0.0.1:socks?????????????????timer:(keepalive,4min42sec,0) ESTAB???????0??????0??????????????????????????????????????????192.168.0.103:60306????????????????????????????????????????????????????203.208.41.37:https?????????????????timer:(keepalive,9.956ms,0) ESTAB???????0??????0??例如上面顯示的keepalive定時器剩余時間:
timer:(keepalive,9.956ms,0):(keepalive,9.956ms,0)查看socket詳細信息
如果想要查看連接更加詳細信息呢?比如收到多少數據?上一個ACK是什么時候?mss是多大?擁塞窗口大小是多少?這些信息在分析理解TCP的時候非常有幫助,而查看這些信息只需要使用-i(information)參數即可:
$?ss?-ti??#(內容很長,省略了很多信息,可執行嘗試)cubic?wscale:7,7?rto:204?rtt:2.302/4.528?ato:40?mss:23488?cwnd:10?bytes_acked:1560?bytes_received:3907?segs_out:18?segs_in:20?send?816.3Mbps?lastsnd:1384?lastrcv:1384?lastack:1384?pacing_rate?1632.1Mbps?rcv_rtt:546?rcv_space:43690由于顯示的內容比較多,這里就不貼出來了,可自行嘗試,里面展示了TCP很多關鍵信息。
查看socket內存使用情況
使用-m(memory)參數可以查看連接使用內存信息:
$?ss?-tm??#只顯示內存部分信息skmem:(r0,rb374400,t0,tb46080,f0,w0,o0,bl0)由于信息較多,這里只顯示內存部分,括號內從左到右分別代表:
根據IP或端口過濾socket信息
你可以使用grep命令(可參考《Linux下的文本查找技巧》)來過濾出你需要的信息,但是ss本身提供一些參數用來過濾信息。例如,查看本地ip為192.168.0.103的連接:
$?ss?-t?src?192.168.0.103State???????Recv-Q?Send-Q?????????????????????????????????????Local?Address:Port??????????????????????????????????????????????????????Peer?Address:Port???????????????? ESTAB???????0??????0??????????????????????????????????????????192.168.0.103:44528??????????????????????????????????????????????????185.199.109.153:https?? $?ss?-t?src?192.168.0.103:35418 State???????Recv-Q?Send-Q?????????????????????????????????????Local?Address:Port??????????????????????????????????????????????????????Peer?Address:Port???????????????? ESTAB???????0??????0??????????????????????????????????????????192.168.0.103:35418??????????????????????????????????????????????????111.230.120.127:https?src后面跟本地ip:port,而也可以使用dst根據遠端ip來過濾信息。
同樣還可以根據協議類型(端口)來過濾,例如查看https socket信息:
$?ss?-t?'(?dport?=?:https?or?sport?=?:https?)' State???????Recv-Q?Send-Q?????????????????????????????????????Local?Address:Port??????????????????????????????????????????????????????Peer?Address:Port???????????????? ESTAB???????0??????0??????????????????????????????????????????192.168.0.103:44528??????????????????????????????????????????????????185.199.109.153:https???????????????? ESTAB???????0??????0??????????????????????????????????????????192.168.0.103:35418??????????????????????????????????????????????????111.230.120.127:https????? $?ss?-t?dport?=?:https State???????Recv-Q?Send-Q?????????????????????????????????????Local?Address:Port??????????????????????????????????????????????????????Peer?Address:Port???????????????? CLOSE-WAIT??32?????0??????????????????????????????????????????192.168.0.103:46626???????????????????????????????????????????????????123.58.182.252:https $?ss?-t?sport?\>?:44550???#顯示本地端口大于44550的連接 State???????Recv-Q?Send-Q?????????????????????????????????????Local?Address:Port??????????????????????????????????????????????????????Peer?Address:Port???????????????? ESTAB???????390????0??????????????????????????????????????????????127.0.0.1:46468????????????????????????????????????????????????????????127.0.0.1:socks???????????????? ESTAB???????0??????0??????????????????????????????????????????????127.0.0.1:46382????????????????????????????????????????????????????????127.0.0.1:socks???????????????? ESTAB???????0??????0??????????????????????????????????????????????127.0.0.1:46490????????????????????????????????????????????????????????127.0.0.1:socks其中dport,指定本地協議(應用 端口),sport指定遠端協議(應用 端口)。
顯示socket統計信息
使用-s(summary)查看整體統計信息。
$?ss?-sTCP:???68?(estab?58,?closed?1,?orphaned?0,?synrecv?0,?timewait?1/0),?ports?0Transport?Total?????IP????????IPv6 *??????2907??????-?????????-???????? RAW??????1?????????0?????????1???????? UDP??????13????????8?????????5???????? TCP??????67????????47????????20??????? INET??????81????????55????????26??????? FRAG??????0?????????0?????????0????????從統計結果中可以看到,共有67個TCP連接。
總結
本文介紹了ss命令一些實用的用法,為后面介紹網絡編程相關內容打下基礎,其他諸如指定ipv4或協議族等更多ss用法可查看幫助手冊。
本文相關閱讀:
不可不知的網絡命令-netstat
網絡工具中的“瑞士軍刀”了解一下?
linux下的文本查找技巧,你掌握了嗎?
Linux中不可錯過的信息寶庫
?
關注公眾號【編程珠璣】,獲取更多Linux/C/C++/Python/Go/算法/工具等原創技術文章。后臺免費獲取經典電子書和視頻資源
更多內容可閱讀原文查看。
總結
以上是生活随笔為你收集整理的netstat的替代者-ss命令实例详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转载 Fluent中的压力分类
- 下一篇: 三极管电阻作用