ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netstat 更快。当服务器的 socket 连接数量变得非常大时,无论是使用 netstat 命令还是直接 cat /proc/net/tcp,执行速度都会很慢。ss 命令利用到了 TCP 协议栈中 tcp_diag。tcp_diag 是一个用于分析统计的模块,可以获得 Linux 内核中第一手的信息,因此 ss 命令的性能会好很多。
常用选项
-h, --help 帮助
-V, --version 显示版本号
-t, --tcp 显示 TCP 协议的 sockets
-u, --udp 显示 UDP 协议的 sockets
-x, --unix 显示 unix domain sockets,与 -f 选项相同
-n, --numeric 不解析服务的名称,如 "22" 端口不会显示成 "ssh"
-l, --listening 只显示处于监听状态的端口
-p, --processes 显示监听端口的进程(Ubuntu 上需要 sudo)
-a, --all 对 TCP 协议来说,既包含监听的端口,也包含建立的连接
-r, --resolve 把 IP 解释为域名,把端口号解释为协议名称
显示所有套接字
ss
或 ss -a
:显示所有类型的套接字,包括监听(Listening)和非监听状态的。
仅显示监听套接字
TCP 和 UDP 连接
ss -t
:显示所有 TCP 连接。
ss -u
:显示所有 UDP 连接。
结合选项
ss -at
:显示所有 TCP 连接(包括监听和非监听)。
ss -au
:显示所有 UDP 连接。
过滤与排序
- 可以通过
-f
或--filter
加上表达式来过滤输出,比如state established
只显示已建立的连接。 - 使用
-o
后可以加上列名对输出进行排序,例如,-o state
按照状态排序。
要查看所有正在监听的 TCP 连接
ss -lt
要查看所有 TCP 连接,并解析主机名和端口号
ss -ane
要查看所有连接,并显示进程信息
ss -ap
输出排序与限制
排序:使用 -o 或 --sort 选项可以对输出进行排序,例如按接收或发送的数据量排序。
限制输出数量:使用 -n (与 -t, -u, -x 等结合) 限制输出的条目数,如 ss -nt 10 只显示前10个TCP连接。
目标筛选
指定目标IP或端口:通过 dst 或 sport、dport 参数筛选特定目标或端口的连接,例如 ss dst 192.168.1.1 或 ss sport = :80。
统计与分析
统计信息:-s 或 --summary 提供了关于各种协议(TCP, UDP, RAW, UNIX等)的统计信息,包括连接数、接收/发送字节数等。
计时器信息:使用 -o 选项可以显示每个套接字的计时器信息,这有助于分析网络延迟问题。
高级应用
与其它命令结合:ss 的输出可以方便地与 grep, awk, sed, sort 等命令结合使用,进行更复杂的过滤和数据分析。
实时监控:配合 watch 命令,如 watch -n 1 'ss -ant',可以实时查看网络连接的变化情况,其中 -n 1 表示每秒更新一次。
替代传统命令
ss 命令因其高效性和详细信息,常被推荐作为 netstat, ifconfig, route 等传统网络管理命令的替代品。它不仅提供更详尽的TCP连接状态,还支持现代协议如DCCP和SCTP。
连接状态筛选
状态筛选:可以根据连接的状态来筛选输出。例如,ss state ESTABLISHED
会显示所有已建立的连接。
常见的状态包括:SYN-SENT
, SYN-RECV
, ESTABLISHED
, FIN-WAIT-1
, FIN-WAIT-2
, TIME-WAIT
, CLOSED
, CLOSE-WAIT
, LAST-ACK
, LISTEN
, CLOSING
。
举例:
1)查看所有已建立的连接(ESTABLISHED)
ss state established
这个命令会显示所有TCP连接中状态为“ESTABLISHED”的连接,即数据传输正在进行中的连接。
2)查看监听状态的套接字(LISTEN)
ss state listening
此命令会列出所有正在监听并等待连接请求的套接字,这对于了解哪些服务正在运行并监听端口非常有用。
3)查找处于SYN_SENT状态的连接
ss state syn-sent
此命令显示那些已发送SYN包但尚未收到SYN+ACK确认的连接,这可能意味着连接建立过程中出现了延迟或问题。
4)查看TIME_WAIT状态的连接
ss state time-wait
TIME_WAIT状态表示连接已经关闭,但是为了确保所有数据包都被正确接收,套接字在一段时间内保持打开。过多的TIME_WAIT状态可能表明之前有很多连接被快速打开和关闭。
5)查找CLOSE_WAIT状态的连接
ss state close-wait
CLOSE_WAIT状态意味着本地端已经接收到对方的关闭连接请求,但还没有完成关闭操作。长时间处于此状态可能意味着程序未正确关闭连接。
6)显示所有状态的连接,包括不常见状态
ss state all
此命令将显示所有状态的网络连接,包括但不限于上述提到的状态,有助于全面了解系统的网络连接状况。
7)结合其他条件进行筛选
例如,查找特定IP的ESTABLISHED连接:
ss state established dst 10.0.0.1
这会显示所有与IP地址10.0.0.1之间已建立的TCP连接。