ss 命令是 Linux 上用于获取和显示 socket 统计信息的工具之一。它是 netstat 的现代替代品,提供了比 netstat 更高效的信息获取方式,尤其是在大规模连接情况下表现更好。
基本用法
ss 的基本语法格式如下:
ss [options] [filter]
常用选项
-
-t:显示 TCP sockets。 -
-u:显示 UDP sockets。 -
-w:显示 RAW sockets。 -
-x:显示 UNIX domain sockets。 -
-l:只列出监听的 sockets。 -
-n:不解析服务名称或主机名称,仅展示数字格式的地址和端口。 -
-p:显示使用 socket 的进程信息。 -
-r:解析 IP 地址为主机名。 -
-a:列出所有的 sockets,不只是监听的。 -
-s:显示 socket 概要统计。 -
-o:显示 timer 信息。 -
-i:显示详细信息。 -
-m:显示网络内存使用情况。 -
-b:显示 socket 缓冲区的使用情况。 -
-4:仅显示 IPv4 sockets。 -
-6:仅显示 IPv6 sockets。 -
-h,--help:显示选项摘要。 -
-V,--version:输出版本信息。 -
-H,--no-header:抑制标题行。 -
-e,--extended:显示详细的套接字信息。 -
-K,--kill:尝试强制关闭套接字。此选项显示成功关闭的套接字并静默跳过内核不支持关闭的套接字。仅支持 IPv4 和 IPv6 套接字。 -
-Z,--context:与-p选项相似,但还显示进程的安全上下文。 -
-z,--contexts:与-Z选项相似,但还显示套接字上下文。套接字上下文来自相关的 inode,而不是内核持有的实际套接字上下文。 -
-N NSNAME,--net=NSNAME:切换到指定的网络命名空间。 -
-0,--packet:显示 PACKET 套接字。 -
-d,--dccp:显示 DCCP 套接字。 -
-S,--sctp:显示 SCTP 套接字。 -
--vsock:显示 vsock 套接字。 -
-f FAMILY,--family=FAMILY:显示指定类型的套接字。当前支持:unix, inet, inet6, link, netlink, vsock。 -
-A QUERY,--query=QUERY,--socket=QUERY:转储指定套接字表,使用逗号分隔。 -
-D FILE,--diag=FILE:不显示任何内容,只转储关于 TCP 套接字的原始信息到指定文件。 -
-F FILE,--filter=FILE:从文件中读取过滤器信息。 -
FILTER := [ state STATE-FILTER ] [ EXPRESSION ]:有关过滤器的详细信息请查阅官方文档。
过滤器
状态过滤器允许构建匹配状态的任意集合。它的语法是关键词 state 和 exclude 后接状态标识符。
可用的状态标识符有:
- 所有标准 TCP 状态:
established,syn-sent,syn-recv,fin-wait-1,fin-wait-2,time-wait,closed,close-wait,last-ack,listen, 和closing。 all- 表示所有状态。connected- 表示所有除listen和closed外的状态。synchronized- 表示所有连接状态,除了syn-sent。bucket- 表示以迷你套接字维护的状态,即time-wait和syn-recv。big- 与bucket相对的状态。state:过滤指定的 TCP 状态,如ESTABLISHED,LISTEN,SYN-RECV等。src和dst:指定源或目标地址(可以是 IP 或子网)。dport和sport:指定源或目的端口。
示例
-
列出所有处于监听状态的 TCP 和 UDP 端口:
ss -lntup -
显示当前所有的 TCP 连接:
ss -ta -
显示详细的所有 TCP 连接,包括 PID 和进程名:
ss -tnp -
显示所有 UNIX sockets:
ss -x -
列出所有处于 ESTABLISHED 状态的连接:
ss -tna state ESTABLISHED
在 ss 命令中,state 参数后面可以跟随各种 TCP 状态以过滤显示特定状态的连接。这些状态对应于 TCP 协议的不同阶段。下面是一些常见的 TCP 连接状态及其描述:
ESTABLISHED: 连接已经建立,数据传输正在进行中。SYN-SENT: 客户端已经发送 SYN 请求,正在等待匹配的 SYN-ACK 响应。SYN-RECV: 服务器收到了 SYN 请求,并发送了 SYN-ACK 响应,正在等待最终的 ACK。FIN-WAIT-1: 主动关闭连接的一端已经发送 FIN 报文,正在等待对方的 ACK。FIN-WAIT-2: 表示一方已经发送完 FIN 留待对方发送 FIN 或 ACK。TIME-WAIT: 表示连接的主动关闭方正在等待足够长的时间以确保对方收到了它的 FIN。CLOSE: 连接处于关闭状态,没有任何传输。CLOSE-WAIT: 一端已经接收到了关闭请求,正在等待其关闭连接。LAST-ACK: 一端在被动关闭上已经收到最后的 FIN 报文,并已经发送过 ACK,正在等待对方的 ACK 以彻底关闭连接。LISTEN: 服务器正在等待进入的连接请求。CLOSING: 双方同时关闭连接,但仍有未被完全传输的数据。
你遇到的问题是因为你使用了小写的 timewait,而正确的状态名称应为 TIME-WAIT。ss 命令对状态名称是区分大小写的,因此请确保输入正确的状态名称。例如,查看处于 TIME-WAIT 状态的连接可以使用下面的命令:
ss -tna4 state TIME-WAIT | more
-
显示用于管理连接计时器的详细信息:
ss -o -
显示当前统计数据:
ss -s
主要用途
- 网络诊断:排查网络连接问题,比如查看有多少 socket 正在使用、状态是什么。
- 性能监控:通过显示 socket 的缓冲区使用、内存使用等来监控系统网络的负载。
- 安全管理:识别不正常的连接,潜在的入侵尝试,未授权的监听服务等。
通过结合不同的选项和过滤器,ss 命令可以为用户提供详细的网络连接状况,使其成为系统管理员解决网络问题的有力工具。