网络状态检测的利器 - ss命令

ss命令,它是 socket statistic的缩写,用于统计Linux系统中socket链接相关的信息,和其余的工具相比,ss命令能够显示更多关于 TCP和状态相关的信息css

语法

ss [ OPTIONS ]

在Linux系统中,默认已经安装了 ss 命令,下面介绍该命令经常使用的一些功能mysql

ss 和 netstat 命令

netstat 命令和 ss 命令比较相似,主要功能也是统计系统中socket相关信息,和 netstat相比,ss 命令在跟踪TCP链接和套接字方面速度更快,功能更强大,下面是 ss 和 netstat 统计速度的对比web

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

显示套接字摘要

列出当前已经链接、关闭、等待的TCP链接,当系统中已经存在大量的套接字链接的时候,经过查看套接字摘要信息能够快速了解系统中套接字的整体状况centos

[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流)等套接字ssh

  • State

套接字处于什么状态,下面是TCP套接字的全部状态及说明, 实际上就是TCP的三次握手和四次挥手的全部状态socket

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 状态下,表示内核中还有多少字节的数据没有被上层应用读取,若是这里数值很大,应用程序可能发生了阻塞tcp

  • 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、IPV四、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