ss是Socket Statistics的縮寫。顧名思義,ss命令可以用來獲取socket統計資訊,它可以顯示和netstat類似的內容。但ss的優勢在於它能夠顯示更多更詳細的有關TCP和連線狀態的資訊,而且比netstat更快速更高效。
當伺服器的socket連線數量變得非常大時,無論是使用netstat命令還是直接cat /proc/net/tcp,執行速度都會很慢。可能你不會有切身的感受,但請相信我,當伺服器維持的連線達到上萬個的時候,使用netstat等於浪費 生命,而用ss才是節省時間。
天下武功唯快不破。ss快的祕訣在於,它利用到了TCP協議棧中tcp_diag。tcp_diag是一個用於分析統計的模組,可以獲得Linux 核心中第一手的資訊,這就確保了ss的快捷高效。當然,如果你的系統中沒有tcp_diag,ss也可以正常執行,只是效率會變得稍慢。(但仍然比 netstat要快。)
1.命令格式:
1 2 3 |
ss [引數] ss [引數] [過濾] |
2.命令功能:
ss(Socket Statistics的縮寫)命令可以用來獲取 socket統計資訊,此命令輸出的結果類似於 netstat輸出的內容,但它能顯示更多更詳細的 TCP連線狀態的資訊,且比 netstat 更快速高效。它使用了 TCP協議棧中 tcp_diag(是一個用於分析統計的模組),能直接從獲得第一手核心資訊,這就使得 ss命令快捷高效。在沒有 tcp_diag,ss也可以正常執行。
3.命令引數:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
-h, --help 幫助資訊 -V, --version 程式版本資訊 -n, --numeric 不解析服務名稱 -r, --resolve 解析主機名 -a, --all 顯示所有套接字(sockets) -l, --listening 顯示監聽狀態的套接字(sockets) -o, --options 顯示計時器資訊 -e, --extended 顯示詳細的套接字(sockets)資訊 -m, --memory 顯示套接字(socket)的記憶體使用情況 -p, --processes 顯示使用套接字(socket)的程式 -i, --info 顯示 TCP內部資訊 -s, --summary 顯示套接字(socket)使用概況 -4, --ipv4 僅顯示IPv4的套接字(sockets) -6, --ipv6 僅顯示IPv6的套接字(sockets) -0, --packet 顯示 PACKET 套接字(socket) -t, --tcp 僅顯示 TCP套接字(sockets) -u, --udp 僅顯示 UCP套接字(sockets) -d, --dccp 僅顯示 DCCP套接字(sockets) -w, --raw 僅顯示 RAW套接字(sockets) -x, --unix 僅顯示 Unix套接字(sockets) -f, --family=FAMILY 顯示 FAMILY型別的套接字(sockets),FAMILY可選,支援 unix, inet, inet6, link, netlink -A, --query=QUERY, --socket=QUERY QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY] -D, --diag=FILE 將原始TCP套接字(sockets)資訊轉儲到檔案 -F, --filter=FILE 從檔案中都去過濾器資訊 FILTER := [ state TCP-STATE ] [ EXPRESSION ] |
4.使用例項:
例項1:顯示TCP連線
命令:
1 |
ss -t -a |
輸出:
1 2 3 4 5 6 7 |
[root@localhost ~]# ss -t -a State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 0 127.0.0.1:smux *:* LISTEN 0 0 *:3690 *:* LISTEN 0 0 *:ssh *:* ESTAB 0 0 192.168.120.204:ssh 10.2.0.68:49368 [root@localhost ~]# |
說明:
例項2:顯示 Sockets 摘要
命令:
1 |
ss -s |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@localhost ~]# ss -s Total: 34 (kernel 48) TCP: 4 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 3 Transport Total IP IPv6 * 48 - - RAW 0 0 0 UDP 5 5 0 TCP 4 4 0 INET 9 9 0 FRAG 0 0 0 [root@localhost ~]# |
說明:
列出當前的established, closed, orphaned and waiting TCP sockets
例項3:列出所有開啟的網路連線埠
命令:
1 |
ss -l |
輸出:
1 2 3 4 5 6 |
[root@localhost ~]# ss -l Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 127.0.0.1:smux *:* 0 0 *:3690 *:* 0 0 *:ssh *:* [root@localhost ~]# |
說明:
例項4:檢視程式使用的socket
命令:
1 |
ss -pl |
輸出:
1 2 3 4 5 6 |
[root@localhost ~]# ss -pl Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 127.0.0.1:smux *:* users:(("snmpd",2716,8)) 0 0 *:3690 *:* users:(("svnserve",3590,3)) 0 0 *:ssh *:* users:(("sshd",2735,3)) [root@localhost ~]# |
說明:
例項5:找出開啟套接字/埠應用程式
命令:
1 |
ss -lp | grep 3306 |
輸出:
1 2 3 4 5 6 |
[root@localhost ~]# ss -lp|grep 1935 0 0 *:1935 *:* users:(("fmsedge",2913,18)) 0 0 127.0.0.1:19350 *:* users:(("fmsedge",2913,17)) [root@localhost ~]# ss -lp|grep 3306 0 0 *:3306 *:* users:(("mysqld",2871,10)) [root@localhost ~]# |
說明:
例項6:顯示所有UDP Sockets
命令:
1 |
ss -u -a |
輸出:
1 2 3 4 5 6 |
[root@localhost ~]# ss -u -a State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 127.0.0.1:syslog *:* UNCONN 0 0 *:snmp *:* ESTAB 0 0 192.168.120.203:39641 10.58.119.119:domain [root@localhost ~]# |
說明:
例項7:顯示所有狀態為established的SMTP連線
命令:
1 |
ss -o state established '( dport = :smtp or sport = :smtp )' |
輸出:
1 2 3 |
[root@localhost ~]# ss -o state established '( dport = :smtp or sport = :smtp )' Recv-Q Send-Q Local Address:Port Peer Address:Port [root@localhost ~]# |
說明:
例項8:顯示所有狀態為Established的HTTP連線
命令:
1 |
ss -o state established '( dport = :http or sport = :http )' |
輸出:
1 2 3 4 |
[root@localhost ~]# ss -o state established '( dport = :http or sport = :http )' Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 75.126.153.214:2164 192.168.10.42:http [root@localhost ~]# |
說明:
例項9:列舉出處於 FIN-WAIT-1狀態的源埠為 80或者 443,目標網路為 193.233.7/24所有 tcp套接字
命令:
1 |
ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24 |
輸出:
說明:
例項10:用TCP 狀態過濾Sockets:
命令:
1 2 3 |
ss -4 state FILTER-NAME-HERE ss -6 state FILTER-NAME-HERE |
輸出:
1 2 3 |
[root@localhost ~]#ss -4 state closing Recv-Q Send-Q Local Address:Port Peer Address:Port 1 11094 75.126.153.214:http 192.168.10.42:4669 |
說明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
FILTER-NAME-HERE 可以代表以下任何一個: established syn-sent syn-recv fin-wait-1 fin-wait-2 time-wait closed close-wait last-ack listen closing all : 所有以上狀態 connected : 除了listen and closed的所有狀態 synchronized :所有已連線的狀態除了syn-sent bucket : 顯示狀態為maintained as minisockets,如:time-wait和syn-recv. big : 和bucket相反. |
例項11:匹配遠端地址和埠號
命令:
1 2 3 4 5 6 7 8 9 |
ss dst ADDRESS_PATTERN ss dst 192.168.1.5 ss dst 192.168.119.113:http ss dst 192.168.119.113:smtp ss dst 192.168.119.113:443 |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@localhost ~]# ss dst 192.168.119.113 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.119.103:16014 192.168.119.113:20229 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:61056 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:61623 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:60924 ESTAB 0 0 192.168.119.103:16050 192.168.119.113:43701 ESTAB 0 0 192.168.119.103:16073 192.168.119.113:32930 ESTAB 0 0 192.168.119.103:16073 192.168.119.113:49318 ESTAB 0 0 192.168.119.103:16014 192.168.119.113:3844 [root@localhost ~]# ss dst 192.168.119.113:http State Recv-Q Send-Q Local Address:Port Peer Address:Port [root@localhost ~]# ss dst 192.168.119.113:3844 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.119.103:16014 192.168.119.113:3844 [root@localhost ~]# |
說明:
例項12:匹配本地地址和埠號
命令:
1 2 3 4 5 6 7 8 9 10 11 |
ss src ADDRESS_PATTERN ss src 192.168.119.103 ss src 192.168.119.103:http ss src 192.168.119.103:80 ss src 192.168.119.103:smtp ss src 192.168.119.103:25 |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@localhost ~]# ss src 192.168.119.103:16021 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.119.103:16021 192.168.119.201:63054 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:62894 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:63055 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:2274 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:44784 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:7233 ESTAB 0 0 192.168.119.103:16021 192.168.119.103:58660 ESTAB 0 0 192.168.119.103:16021 192.168.119.201:44822 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56737 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:57487 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56736 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:64652 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56586 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:64653 ESTAB 0 0 192.168.119.103:16021 10.2.1.206:56587 [root@localhost ~]# |
說明:
例項13:將本地或者遠端埠和一個數比較
命令:
1 2 3 |
ss dport OP PORT ss sport OP PORT |
輸出:
1 2 3 4 5 6 7 8 9 10 |
[root@localhost ~]# ss sport = :http [root@localhost ~]# ss dport = :http [root@localhost ~]# ss dport \> :1024 [root@localhost ~]# ss sport \> :1024 [root@localhost ~]# ss sport \< :32000 [root@localhost ~]# ss sport eq :22 [root@localhost ~]# ss dport != :22 [root@localhost ~]# ss state connected sport = :http [root@localhost ~]# ss \( sport = :http or sport = :https \) [root@localhost ~]# ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24 |
說明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
ss dport OP PORT 遠端埠和一個數比較;ss sport OP PORT 本地埠和一個數比較。 OP 可以代表以下任意一個: <= or le : 小於或等於埠號 >= or ge : 大於或等於埠號 == or eq : 等於埠號 != or ne : 不等於埠號 < or gt : 小於埠號 > or lt : 大於埠號 |
例項14:ss 和 netstat 效率對比
命令:
1 2 3 |
time netstat -at time ss |
輸出:
1 2 3 4 5 6 7 8 9 10 |
[root@localhost ~]# time ss real 0m0.739s user 0m0.019s sys 0m0.013s [root@localhost ~]# [root@localhost ~]# time netstat -at real 2m45.907s user 0m0.063s sys 0m0.067s [root@localhost ~]# |
說明:
用time 命令分別獲取通過netstat和ss命令獲取程式和概要佔用資源所使用的時間。在伺服器連線數比較多的時候,netstat的效率完全沒法和ss比。
本系列文章:
每天一個 Linux 命令(1):ls命令
每天一個 Linux 命令(2):cd命令
每天一個 Linux 命令(3):pwd命令
每天一個 Linux 命令(4):mkdir命令
每天一個 Linux 命令(5):rm 命令
每天一個 Linux 命令(6):rmdir 命令
每天一個 Linux 命令(7):mv命令
每天一個 Linux 命令(8):cp 命令
每天一個 Linux 命令(9):touch 命令
每天一個 Linux 命令(10):cat 命令
每天一個 Linux 命令(11):nl 命令
每天一個 Linux 命令(12):more 命令
每天一個 Linux 命令(13):less 命令
每天一個 Linux 命令(14):head 命令
每天一個 Linux 命令(15):tail 命令
每天一個 Linux 命令(16):which命令
每天一個 Linux 命令(17):whereis 命令
每天一個 Linux 命令(18):locate 命令
每天一個 Linux 命令(19):find 命令概覽
每天一個 Linux 命令(20):find命令之exec
每天一個 Linux 命令(21):find命令之xargs
每天一個 Linux 命令(22):find 命令的引數詳解
每天一個 Linux 命令(23):Linux 目錄結構
每天一個 Linux 命令(24):Linux 檔案型別與副檔名
每天一個 Linux 命令(25):Linux 檔案屬性詳解
每天一個 Linux 命令(26):用 SecureCRT 來上傳和下載檔案
每天一個 Linux 命令(27):linux chmod 命令
每天一個 Linux 命令(28):tar 命令
每天一個 Linux 命令(29): chgrp 命令
每天一個 Linux 命令(30): chown 命令
每天一個 Linux 命令(31): /etc/group 檔案詳解
每天一個 Linux 命令(32):gzip 命令
每天一個 Linux 命令(33):df 命令
每天一個 Linux 命令(34): du 命令
每天一個 Linux 命令(35): ln 命令
每天一個 Linux 命令(36): diff 命令
每天一個 Linux 命令(37): date 命令
每天一個 Linux 命令(38): cal 命令
每天一個 Linux 命令(39): grep 命令
每天一個 Linux 命令(40): wc 命令
每天一個 Linux 命令(41): ps 命令
每天一個 Linux 命令(44): top 命令
每天一個 Linux 命令(45): free 命令
每天一個 Linux 命令(46): vmstat 命令
每天一個 Linux 命令(47): iostat 命令
每天一個 Linux 命令(48): watch 命令
每天一個 Linux 命令(49): at 命令
每天一個 Linux 命令(50): crontab 命令
每天一個 Linux 命令(51): lsof 命令
每天一個 Linux 命令(52): ifconfig 命令
每天一個 Linux 命令(53): route 命令
每天一個 Linux 命令(54): ping 命令
每天一個 Linux 命令(55): traceroute 命令
每天一個 Linux 命令(56): netstat 命令