1. 简介
ss
用来导出socket的统计数据。相比传统的 netstat
命令, ss
更加高效,因为它直接读取内核数据结构,避免了额外的计算过程。ss
提供了比 netstat
更详细的输出,并且在处理大量连接时更加快速。
读取内核数据结构的过程: 主要是通过/proc
来获取各种各样的统计信息. 特别是当处理tcp的时候, 用到了tcp_diag
功能。
tcp_diag
是tcp协议栈用于诊断和统计的一个模块, 用netfilter
来获取第一手的信息。保证了信息的快捷获取。
ss
隶属于iproute
包的, 可以通过命令apt install iproute
安装。
2. 基本用法
2.1 显示所有网络连接
回显举例说明
Netid
: 用来标识Socket的类型、传输协议。
nl
(Netlink套接字,用于内核和用户空间之间的通信。常用于网络配置、路由信息交换等)、
u_str
(Unix套接字-流stream)、u_dgr(Unix套接字-数据报datagram)
tcp
、udp
、icmp
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
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
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
|