Please enable Javascript to view the contents

Linux网络-命令: ss

`ss`(Socket Statistics)是一个强大的 Linux 网络工具,用于显示和分析网络连接、端口监听、套接字信息等。最大的特点就是高效,适合超大规模TCP链接。

 ·  ☕ 4 分钟

1. 简介

ss用来导出socket的统计数据。相比传统的 netstat 命令, ss 更加高效,因为它直接读取内核数据结构,避免了额外的计算过程。ss 提供了比 netstat 更详细的输出,并且在处理大量连接时更加快速。

读取内核数据结构的过程: 主要是通过/proc来获取各种各样的统计信息. 特别是当处理tcp的时候, 用到了tcp_diag功能。
tcp_diag是tcp协议栈用于诊断和统计的一个模块, 用netfilter来获取第一手的信息。保证了信息的快捷获取。

ss隶属于iproute包的, 可以通过命令apt install iproute 安装。

2. 基本用法

2.1 显示所有网络连接

1
ss -a

回显举例说明

Netid: 用来标识Socket的类型、传输协议。
nl(Netlink套接字,用于内核和用户空间之间的通信。常用于网络配置、路由信息交换等)、
u_str(Unix套接字-流stream)、u_dgr(Unix套接字-数据报datagram)
tcpudpicmp
State: 套接字状态
CLOSED: TCP连接初始状态,意味着没有连接活动。
LISTEN: 连接正在监听,等待来自远端的连接请求。
SYN_SENT: 客户端发起连接请求,发送 SYN 报文后,进入此状态, 等待对端的 SYN+ACK 确认包
SYN_RECEIVED: 服务端接收到 SYN 报文后,响应 SYN+ACK 确认包后,进入此状态,等待客户端确认
ESTABLISHED: 客户端收到 SYN+ACK 确认包, 响应 ACK 后,连接建立,双方都进入此状态,开始数据传输
FIN_WAIT_1: 连接终止第一步,本端已经发送了 FIN 包,等待对方的 ACK 回应。
CLOSE_WAIT: 收到对端发送的 FIN 报文后,响应 ACK 报文,后进入此状态,等待对端 (此时连接未关闭,等待应用程序关闭)
FIN_WAIT_2: 本端已经收到对方的 ACK 回应,等待对方发送 FIN 包。
CLOSING: 双方同时发送了 FIN 包,等待对方的 ACK 回应

Recv-Q: 接收队列字节数
Send-Q: 发送队列字节数
Local Address:Port: 本地地址和端口
Peer Address:Port: 对端地址和端口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
hex@ubuntu-22:/mnt/d/Nova/workspace$ ss -a |head -n10
Netid State   Recv-Q Send-Q               Local Address:Port                  Peer Address:Port    Process
nl    UNCONN  0      0                             rtnl:packagekitd/175600                *
nl    UNCONN  0      0                             rtnl:1231                              *
nl    UNCONN  0      0                             rtnl:kernel                            *
nl    UNCONN  768    0                             rtnl:dockerd/530                       *
nl    UNCONN  0      0                             rtnl:systemd-resolve/280               *
tcp   ESTAB   0      0                    192.168.1.100:8080                 192.168.1.200:12345
udp   UNCONN  0      0                          0.0.0.0:5353                       0.0.0.0:*
u_str ESTAB   0      0      /run/dbus/system_bus_socket 12345                            * 0
u_dgr UNCONN  0      0     /var/run/chrony/chronyd.sock 12346                            * 0
u_str ESTAB   0      0                                * 348334                           * 348331
icmp6 UNCONN  0      0                                *:ipv6-icmp                        *:*
p_raw UNCONN  0      0                                *:12345                            *:*

2.2 显示过滤

-t: tcp -u: udp
-l: 监听(listening)端口
-p: 显示进程(process)信息
-n: 地址和端口以数字(numbric)形式显示,不进行解析域名(避免dns查询,加快执行速度)

常用命令(显示当前系统中所有处于监听状态(-l)的 TCP 套接字(-t),并显示相关的进程(-p)信息):

1
ss -ntlp
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
State    Recv-Q   Send-Q   Local Address:Port    Peer Address:Port   Process
LISTEN   0        4096         127.0.0.1:10248        0.0.0.0:*      users:(("kubelet",pid=3772709,fd=18))                     
LISTEN   0        4096         127.0.0.1:10249        0.0.0.0:*      users:(("kube-proxy",pid=416857,fd=17))                   
LISTEN   0        4096         127.0.0.1:9099         0.0.0.0:*      users:(("calico-node",pid=4091308,fd=8))                  
LISTEN   0        4096         127.0.0.1:2379         0.0.0.0:*      users:(("etcd",pid=416811,fd=11))                         
LISTEN   0        4096      172.16.21.70:2379         0.0.0.0:*      users:(("etcd",pid=416811,fd=9))                                       
LISTEN   0        4096                 *:10259              *:*      users:(("kube-scheduler",pid=2776771,fd=3))               
LISTEN   10       4096                 *:10260              *:*      users:(("cloud-controlle",pid=1509735,fd=3))              
LISTEN   0        128               [::]:22              [::]:*      users:(("sshd",pid=450296,fd=4))                          
LISTEN   0        4096                 *:2112               *:*      users:(("kube-vip",pid=1521113,fd=3))                     
LISTEN   0        4096                 *:9345               *:*      users:(("rke2",pid=3638989,fd=9)) 

其他选项:-e: 显示详细的套接字信息 -m: 显示套接字的内存使用情况 -o: 显示套接字的计时器信息

3. 高级用法

3.1 显示特定状态的连接

1
2
3
4
5
ss -t state established  # 显示所有处于 ESTABLISHED 状态的 TCP 连接(数据传输正在进行的链接)  
ss -t state listening    # 显示所有处于 LISTENING 状态的 TCP 连接  (正在监听,并等待连接)
ss -t state syn-sent     # 显示所有 已发送 SYN 包,但未收到 SYN+ACK 确认的连接 (建立TCP连接过程中,出现延迟或问题)
ss -t state time-wait    # 显示所有 连接已关闭,但套接字仍打开,保证所有数据包被正确接受 的连接  (过多time-wait连接,表明过多的连接被快速打开、关闭)
ss -t state close-wait   # 显示所有 本地已收到关闭连接请求,但还未关闭的连接(连接长时间处于此状态,意味着程序未正确关闭连接)

3.2 使用ss过滤语法过滤

ss 过滤语法是其独有特性,是netstat所不具备的功能。详情可以查看ss的官方文档

ss -t -a '( sport = :22 or dport = :22 and dst 10.40.60.29 )'
注意:

  • :是端口号与IP的分隔符,可加可不加,即10.40.60.29 10.40.60.29: 10.40.60.29:*是相同的,*:22 :22 22也是相同的。
  • =是判断,不提供时,默认为判断是否相等。还支持 != > < ,ip地址只支持=!=判断。
  • '( ... )' 引号:以及括号()是可以省略的,但当添加时,注意内部表达式必须与括号之间存在空格分隔。即上面命令可变为 ss -t -a sport = :22 or dport = :22 and dst 10.40.60.29

3.4 显示套接字的统计信息

1
2
# summary
ss -s

回显示例

1
2
3
4
5
6
7
8
9
Total: 3489
TCP:   482 (estab 309, closed 138, orphaned 0, timewait 18)

Transport Total     IP        IPv6
RAW       1         0         1        
UDP       2         2         0        
TCP       344       267       77       
INET      347       269       78       
FRAG      0         0         0

参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
客户端                               服务器
ESTABLISHED                         ESTABLISHED
FIN_WAIT_1  ----------FIN-------->  
                                    CLOSE_WAIT
            <---------ACK--------- 
FIN_WAIT_2
            <---------FIN---------  LAST_ACK
TIME_WAIT                                                
            -----------ACK------->  CLOSED
等待2MSL,后变为 CLOSED
分享

Hex
作者
Hex
CloudNative Developer

目录