網絡狀態檢測的利器:ss 命令

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

上面例子中列說明:

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

套接字處於什麼狀態,下面是 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、IPV4、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 表示源,對應的 dst 表示目標,命令查找端口 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
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/-5xHXIZWiCzs9HvDbkm5ZQ