ss命令,它是 socket statistic的縮寫,用於統計Linux系統中socket鏈接相關的信息,和其餘的工具相比,ss命令能夠顯示更多關於 TCP和狀態相關的信息css
ss [ OPTIONS ]
在Linux系統中,默認已經安裝了 ss 命令,下面介紹該命令經常使用的一些功能mysql
netstat 命令和 ss 命令比較相似,主要功能也是統計系統中socket相關信息,和 netstat相比,ss 命令在跟蹤TCP鏈接和套接字方面速度更快,功能更強大,下面是 ss 和 netstat 統計速度的對比sql
[cgyx@cghost35 ~]$ time ss -a | wc -l 439 real 0m0.014s user 0m0.004s sys 0m0.010s [cgyx@cghost35 ~]$ time netstat -a | wc -l 366 real 0m0.029s user 0m0.005s sys 0m0.008s
從上面例子能夠看出,ss 統計439條socket信息花費了0.014s, netstat 統計366條socket信息花費了0.029s,ss 統計信息的速度更快,因此實際使用中通常都是用 ss 替代 netstatcentos
列出當前已經鏈接、關閉、等待的TCP鏈接,當系統中已經存在大量的套接字鏈接的時候,經過查看套接字摘要信息能夠快速瞭解系統中套接字的整體狀況服務器
[root@ecs-centos-7 ~]# ss -s Total: 185 (kernel 264) TCP: 7 (estab 2, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 264 - - RAW 0 0 0 UDP 7 4 3 TCP 7 4 3 INET 14 8 6 FRAG 0 0 0
當不使用任何選項時,ss將顯示已創建鏈接的處於非監聽狀態的套接字列表,因爲原始結果太長,下面的例子只截取了一部分網絡
[root@ecs-centos-7 ~]# ss Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_str ESTAB 0 0 /run/dbus/system_bus_socket 12050 * 11962 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.56:ssm-cssps tcp ESTAB 0 4200 192.168.0.9:ssh 27.38.240.56:rsmtp tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.56:pearldoc-xact
上面例子中列說明:ssh
socket類型,在上面的例子中,有 TCP、u_str(unix流)等套接字socket
套接字處於什麼狀態,下面是TCP套接字的全部狀態及說明, 實際上就是TCP的三次握手和四次揮手的全部狀態tcp
LISTEN: 服務端偵聽套接字等待客戶端的鏈接 SYN-SENT: 客戶端已發送套接字鏈接請求報文,等待鏈接被服務器接收 SYN-RECEIVED: 服務器端接收鏈接請求報文後,等待客戶端的確認鏈接的回覆報文 ESTABLISHED: 服務端和客戶端之間成功創建了一條有效的鏈接,能夠互相傳輸數據 FIN-WAIT-1: 服務器或客戶端調用close函數主動向對方發出終止鏈接的請求報文,同時等待對方確認終止鏈接的回覆報文 FIN-WAIT-2: 主動關閉鏈接端收到對方確認終止鏈接的回覆報文,同時等待對方鏈接終止的請求報文,這時的狀態是TCP鏈接的半關閉狀態,能夠接受數據,可是不能發送數據 CLOSE-WAIT: 被動關閉端收到主動關閉端終止鏈接的請求報文後,向主動關閉端發送確認終止鏈接的回覆報文,同時被動關閉端等待本地用戶終止鏈接,這時被動關閉端的狀態是TCP鏈接的半關閉狀態,能夠發送數據,可是不能接收數據 CLOSING: 服務器和客戶端同時向對方發送終止鏈接(調用close函數)請求報文,而且雙方都是在收到對方發送的終止鏈接回覆報文以前收到了對方的發送的終止鏈接請求報文,這個時候雙方都進入了CLOSING狀態,進入CLOSING狀態以後,只要收到了對方對本身終止鏈接的回覆報文,就會進入TIME-WAIT狀態,因此CLOSING狀態的持續時間會特別短,通常很難捕獲到 LAST-ACK: 被動關閉端發送徹底部數據以後,向主動關閉端發送終止鏈接的請求報文,等待主動關閉端發送終止鏈接的回覆報文 TIME-WAIT: 主動關閉端收到被動關閉端終止鏈接的請求報文後,給被動關閉端發送終止鏈接的回覆報文,等待足夠時間以確保被動關閉端收到了主動關閉段發送的終止鏈接的回覆報文 CLOSED: 徹底沒有鏈接,套接字鏈接已經終止了
在 ESTAB 狀態下,表示內核中還有多少字節的數據沒有被上層應用讀取,若是這裏數值很大,應用程序可能發生了阻塞函數
在 ESTAB 狀態下,表示內核發送隊列中還有多少字節的數據沒有收到確認的ACK,若是這個數值很大,代表接收端的接收以及處理須要增強
本地地址和端口
遠程地址和端口
使用 -l
選項能夠列出全部處於偵聽(LISTEN)狀態的套接字
[root@ecs-centos-7 ~]# ss -l Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 100 127.0.0.1:smtp *:* tcp LISTEN 0 128 *:ssh *:* tcp LISTEN 0 100 [::1]:smtp [::]:* tcp LISTEN 0 254 [::]:mysql [::]:* tcp LISTEN 0 128 [::]:ssh [::]:*
使用 -a
選項能夠列出全部的狀態的套接字,因爲全部的套接字列表太多,下面的例子中只列出了少量的數據
[root@ecs-centos-7 ~]# ss -a Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 100 127.0.0.1:smtp *:* tcp LISTEN 0 128 *:ssh *:* tcp ESTAB 0 16644 192.168.0.9:ssh 27.38.240.99:21669 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.103:kyoceranetdev tcp LISTEN 0 100 [::1]:smtp [::]:* tcp LISTEN 0 254 [::]:mysql [::]:* tcp LISTEN 0 128 [::]:ssh [::]:*
能夠經過 TCP、UDP、Unix、Raw、IPV四、IPV6 這些協議類型顯示套接字,下面以經常使用的TCP/UDP/IPV4協議舉例說明
ss -ua : 顯示Unix套接字 ss -wa : 顯示Raw套接字 ss -6a : 顯示IPV6套接字
使用 -t
選項(TCP), 讓結果只列出TCP套接字
[root@ecs-centos-7 ~]# ss -a -t State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* LISTEN 0 128 *:ssh *:* ESTAB 0 52 192.168.0.9:ssh 27.38.240.99:21787 ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21669 ESTAB 0 0 192.168.0.9:ssh 27.38.240.103:kyoceranetdev LISTEN 0 100 [::1]:smtp [::]:* LISTEN 0 254 [::]:mysql [::]:* LISTEN 0 128 [::]:ssh [::]:*
使用 -u
選項(UCP), 讓結果只列出UCP套接字
[root@ecs-centos-7 ~]# ss -a -u State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:bootpc *:* UNCONN 0 0 192.168.0.9:ntp *:* UNCONN 0 0 127.0.0.1:ntp *:* UNCONN 0 0 *:ntp *:* UNCONN 0 0 [fe80::f816:3eff:fee0:4fb8]%eth0:ntp [::]:* UNCONN 0 0 [::1]:ntp [::]:* UNCONN 0 0 [::]:ntp [::]:*
使用 -4
選項(IPV4), 讓結果只列出IPV4的套接字
[root@ecs-centos-7 ~]# ss -4a Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:bootpc *:* udp UNCONN 0 0 192.168.0.9:ntp *:* udp UNCONN 0 0 127.0.0.1:ntp *:* udp UNCONN 0 0 *:ntp *:* tcp LISTEN 0 100 127.0.0.1:smtp *:* tcp LISTEN 0 128 *:ssh *:* tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21787
有時咱們查詢到指定的套接字了,可是沒法知道套接字是哪一個應用程序在使用,這時可使用 -p
選項
[root@ecs-centos-7 ~]# ss -a -t -p State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 254 [::]:mysql [::]:*
上面的例子中,從Local Address:Port
列能夠知道,這個套接字時mysql在使用,若是沒有加 -p
選項的話,這裏顯示的時mysql的端口號3306
有時候咱們啓動應用程序的時候,發現端口已經被佔用了,此時先要查找出佔用目標端口的應用程序,而後關閉它,再啓動咱們本身的應用程序
[root@ecs-centos-7 ~]# ss -ap sport eq 3306 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 254 [::]:mysql [::]:*
上面的例子中,sport 表示源,對應的 dport 表示目標,命令查找端口3306是被哪一個進程使用了,最終發現3306是mysql在使用
經過端口篩選還支持小於、大於、小於等於、大於等於、不等於,具體的說明以下:
ss -ap sport le 3306 : 篩選出源端口小於等於3306的套接字 ss -ap sport lt 3306 :篩選出源端口小於3306的套接字 ss -ap sport ge 3306 : 篩選出源端口大於等於3306的套接字 ss -ap sport gt 3306 : 篩選出源端口大於3306的套接字 ss -ap sport ne 3306 : 篩選出源端口不等於3306的套接字
[root@ecs-centos-7 ~]# ss -an sport eq mysql Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 254 [::]:3306 [::]:*
上面的例子中篩選出進程名爲mysql
的套接字, 執行的命令中 -n
選項是不解析服務名字,加了此選項就顯示成端口了,不會解析成服務名稱了
下面例子是篩選出目標IP地址爲27.38.240.99的套接字,dst 是目標地址
[root@ecs-centos-7 ~]# ss -a dst 27.38.240.99 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 52 192.168.0.9:ssh 27.38.240.99:21907 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21787 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:23260 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:22810
下面例子是篩選出源IP地址爲192.168.0.99的套接字,src 是源地址
[root@ecs-centos-7 ~]# ss -a src 192.168.0.9 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 192.168.0.9:ntp *:* tcp ESTAB 0 52 192.168.0.9:ssh 27.38.240.99:21907 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21787 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:23260