網路狀態檢測的利器 - ss命令

Linux開發那些事兒發表於2020-10-21

ss命令,它是 socket statistic的縮寫,用於統計Linux系統中socket連線相關的資訊,和其他的工具相比,ss命令可以顯示更多關於 TCP和狀態相關的資訊

語法

ss [ OPTIONS ]

在Linux系統中,預設已經安裝了 ss 命令,下面介紹該命令常用的一些功能

ss 和 netstat 命令

netstat 命令和 ss 命令比較類似,主要功能也是統計系統中socket相關資訊,和 netstat相比,ss 命令在跟蹤TCP連線和套接字方面速度更快,功能更強大,下面是 ss 和 netstat 統計速度的對比

[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 替代 netstat

顯示套接字摘要

列出當前已經連線、關閉、等待的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   

上面例子中列說明:

  • Netid

socket型別,在上面的例子中,有 TCP、u_str(unix流)等套接字

  • State

套接字處於什麼狀態,下面是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: 完全沒有連線,套接字連線已經終止了
  • Recv-Q

在 ESTAB 狀態下,表示核心中還有多少位元組的資料沒有被上層應用讀取,如果這裡數值很大,應用程式可能發生了阻塞

  • Send-Q

在 ESTAB 狀態下,表示核心傳送佇列中還有多少位元組的資料沒有收到確認的ACK,如果這個數值很大,表明接收端的接收以及處理需要加強

  • Local Address:Port

本地地址和埠

  • Peer Address:Port

遠端地址和埠

顯示偵聽狀態的套接字

使用 -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、IPV4、IPV6 這些協議型別顯示套接字,下面以常用的TCP/UDP/IPV4協議舉例說明

ss -ua : 顯示Unix套接字
ss -wa : 顯示Raw套接字
ss -6a : 顯示IPV6套接字
  • TCP套接字

使用 -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                                              [::]:*
  • UDP套接字

使用 -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                                              [::]:*    
  • ipv4 套接字

使用 -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地址篩選

  • 通過目標地址篩選

下面例子是篩選出目標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                

相關文章