命令行手册

Man » ss 手册在线 - `ss` 手册页的详细在线文档

🌍
ss - 另一个用于调查套接字的工具

概要

ss [选项] [过滤器]

描述

`ss` 用于转储套接字统计信息。它允许显示类似于 `netstat` 的信息。 它可以显示比其他工具更多的 TCP 和状态信息。

选项

如果不使用任何选项,ss 将显示打开的非监听套接字(例如,TCP/UNIX/UDP),这些套接字已建立连接。

-h, --help

显示选项摘要。

-V, --version

输出版本信息。

-H, --no-header

禁止显示标题行。

-Q, --no-queues

禁止显示发送和接收队列列。

-O, --oneline

将每个套接字的数据打印在一行中。

-n, --numeric

不要尝试解析服务名称。显示精确的带宽值,而不是人类可读的格式。

-r, --resolve

尝试解析数字地址/端口。

-a, --all

显示监听和非监听套接字(对于 TCP,这意味着已建立的连接)。

-l, --listening

仅显示监听套接字(默认情况下会省略这些套接字)。

-B, --bound-inactive

仅显示 TCP 绑定但未处于活动状态(未监听、连接等)的套接字(默认情况下会省略这些套接字)。

-o, --options

显示计时器信息。对于 TCP 协议,输出格式为:

timer:(<timer_name>,<expire_time>,<retrans>)

<timer_name>
计时器的名称,有五种计时器名称:

on:表示以下计时器中的一个:TCP 重传计时器、TCP 早期重传计时器和尾部丢失探测计时器

keepalive:tcp 保活计时器

timewait:timewait 阶段计时器

persist:零窗口探测计时器

unknown:以上都不是计时器

<expire_time>
计时器将要过期的时长

<retrans>
重传发生的次数

-e, --extended

显示详细的套接字信息。输出格式为:

uid:<uid_number> ino:<inode_number> sk:<cookie>

<uid_number>
套接字所属的用户 ID

<inode_number>
VFS 中的套接字 inode 编号

<cookie>
套接字的 UUID

-m, --memory

显示套接字内存使用情况。输出格式为:

skmem:(r<rmem_alloc>,rb<rcv_buf>,t<wmem_alloc>,tb<snd_buf>,
f<fwd_alloc>,w<wmem_queued>,o<opt_mem>,
bl<back_log>,d<sock_drop>)

<rmem_alloc>
分配用于接收数据包的内存

<rcv_buf>
可以分配用于接收数据包的总内存

<wmem_alloc>
用于发送数据包的内存(已发送到第 3 层)

<snd_buf>
可以分配用于发送数据包的总内存

<fwd_alloc>
套接字作为缓存分配的内存,但尚未用于接收/发送数据包。如果需要内存来发送/接收数据包,则在分配更多内存之前,将首先使用此缓存中的内存。

<wmem_queued>
用于发送数据包的内存(尚未发送到第 3 层)。

<opt_mem>
用于存储 socket 选项的内存,例如 TCP MD5 签名的密钥。

<back_log>
用于存储 sk 后端队列的内存。在进程上下文中,如果进程正在接收数据包,并且接收到新的数据包,则会将其放入 sk 后端队列中,以便进程可以立即接收该数据包。

<sock_drop>
在数据包被分发到 socket 之前,丢弃的数据包数量。

-p, --processes
显示使用 socket 的进程。

-T, --threads
显示使用 socket 的线程。隐含 -p。

-i, --info
显示内部 TCP 信息。以下字段可能会出现:

ts     如果设置了时间戳选项,则显示字符串“ts”。

sack   如果设置了 SACK 选项,则显示字符串“sack”。

ecn    如果设置了显式拥塞通知 (ECN) 选项,则显示字符串“ecn”。

ecnseen
如果收到的数据包中找到 saw ecn 标志,则显示字符串“ecnseen”。

fastopen
如果设置了快速打开选项,则显示字符串“fastopen”。

cong_alg
拥塞控制算法的名称,默认拥塞控制算法为“cubic”。

wscale:<snd_wscale>:<rcv_wscale>
如果使用了窗口缩放选项,则此字段显示发送缩放因子和接收缩放因子。

rto:<icsk_rto>
TCP 重传超时值,单位为毫秒。

backoff:<icsk_backoff>
用于指数退避重传,实际的重传超时值是 icsk_rto << icsk_backoff。

rtt:<rtt>/<rttvar>
rtt 是平均往返时间,rttvar 是 rtt 的平均偏差,它们的单位是毫秒。

ato:<ato>
确认超时,单位为毫秒,用于延迟确认模式。

mss:<mss>
最大分段大小。

cwnd:<cwnd>
拥塞窗口大小。

pmtu:<pmtu>
路径 MTU 值。

ssthresh:<ssthresh>
TCP 拥塞窗口慢启动阈值。

bytes_acked:<bytes_acked>
已确认的字节数。

bytes_received:<bytes_received>
已接收的字节数。

segs_out:<segs_out>
发送的段数。

segs_in:<segs_in>
接收的段数。

send <send_bps>bps
出站 bps。

lastsnd:<lastsnd>
自上次发送数据包以来经过的时间,单位为毫秒。

lastrcv:<lastrcv>
自上次接收数据包以来经过的时间,单位为毫秒。

lastack:<lastack>
自上次接收到确认以来经过的时间,单位为毫秒。

pacing_rate <pacing_rate>bps/<max_pacing_rate>bps
节流速率和最大节流速率。

rcv_space:<rcv_space>
用于 TCP 内部自动调整 socket 接收缓冲区的一个辅助变量。

tcp-ulp-mptcp flags:[MmBbJjecv] token:<rem_token(rem_id)/loc_token(loc_id)> seq:<sn> sfseq:<ssn> ssnoff:<off> maplen:<maplen>
MPTCP 子流信息。

--tos  显示 ToS 和优先级信息。以下字段可能会出现:

tos    IPv4 服务类型字节。

tclass IPv6 流量类别字节。

class_id
由 net_cls cgroup 设置的类别 ID。如果类别为零,则显示由 SO_PRIORITY 设置的优先级。

--cgroup
显示 cgroup 信息。以下字段可能会出现:

cgroup Cgroup v2 路径名。此路径名相对于层次结构的挂载点。

--tipcinfo

显示内部 tipc 套接字信息。

-K, --kill

尝试强制关闭套接字。此选项显示成功关闭的套接字,并静默跳过内核不支持关闭的套接字。它仅支持 IPv4 和 IPv6 套接字。

-s, --summary

打印摘要统计信息。此选项不解析套接字列表,而是从各种来源获取摘要。当套接字数量巨大,以至于解析 /proc/net/tcp 变得困难时,此选项很有用。

-E, --events

持续显示套接字在销毁时的情况。

-Z, --context

类似于 -p 选项,但同时显示进程安全上下文。如果使用了 -T 选项,还会显示线程安全上下文。

对于 netlink(7) 套接字,启动进程的上下文将按以下方式显示:

    如果存在有效的 pid,则显示进程上下文。

    如果目标是内核(pid = 0),则显示内核初始上下文。

    如果内核或 netlink 用户已分配唯一的标识符,则将上下文显示为“不可用”。这通常表示一个进程有多个 netlink 套接字处于活动状态。

-z, --contexts

类似于 -Z 选项,但同时显示套接字上下文。套接字上下文来自关联的 inode,而不是内核中实际持有的套接字上下文。套接字通常使用创建进程的上下文进行标记,但是显示的上下文将反映任何策略角色、类型和/或范围转换规则的应用情况,因此,这是一个有用的参考。

-N NSNAME, --net=NSNAME

切换到指定的网络命名空间名称。

-b, --bpf

显示套接字经典 BPF 过滤器(仅允许管理员获取这些信息)。

-4, --ipv4

仅显示 IPv4 版本的套接字(-f inet 的别名)。

-6, --ipv6

仅显示 IPv6 版本的套接字(-f inet6 的别名)。

-0, --packet

显示 PACKET 套接字(-f link 的别名)。

-t, --tcp

显示 TCP 套接字。

-u, --udp

显示 UDP 套接字。

-d, --dccp

显示 DCCP 套接字。

-w, --raw

显示 RAW 套接字。

-x, --unix

显示 Unix 域套接字(-f unix 的别名)。

-S, --sctp

显示 SCTP 套接字。

--tipc

显示 tipc 套接字(-f tipc 的别名)。

--vsock

显示 vsock 套接字(-f vsock 的别名)。

--xdp

显示 XDP 套接字(-f xdp 的别名)。

-M, --mptcp

显示 MPTCP 套接字。

--inet-sockopt

显示 inet 套接字选项。

-f FAMILY, --family=FAMILY

显示指定类型的套接字。当前支持以下类型:unix、inet、inet6、link、netlink、vsock、tipc、xdp。

-A QUERY, --query=QUERY, --socket=QUERY

要转储的套接字表的列表,用逗号分隔。以下标识符将被理解:all、inet、tcp、udp、raw、unix、packet、netlink、unix_dgram、unix_stream、unix_seqpacket、packet_raw、packet_dgram、dccp、sctp、tipc、vsock_stream、vsock_dgram、xdp、mptcp。 列表中的任何项目都可以可选地以感叹号(!)为前缀,以从转储中排除该套接字表。


-D FILE, --diag=FILE
不显示任何内容,应用过滤器后,将原始 TCP 套接字信息转储到 FILE。如果 FILE 是 -,则使用 stdout。

-F FILE, --filter=FILE
从 FILE 读取过滤器信息。FILE 的每一行都解释为单行命令选项。如果 FILE 是 -,则使用 stdin。

--bpf-maps
漂亮地打印每个套接字的 BPF 套接字本地数据条目。

--bpf-map-id=MAP_ID
漂亮地打印请求的映射 ID 的 BPF 套接字本地数据条目。可以多次使用。

FILTER := [ state STATE-FILTER ] [ EXPRESSION ]
请查看官方文档以获取有关过滤器的详细信息。

STATE-FILTER

STATE-FILTER 允许构建任意状态集合进行匹配。其语法是 state 和 exclude 关键字的序列,后跟状态标识符。

可用的标识符是:

所有标准 TCP 状态:established、syn-sent、syn-recv、fin-wait-1、fin-wait-2、timewait、closed、close-wait、last-ack、listening 和 closing。

all - 所有状态

connected - 除了 listening 和 closed 之外的所有状态

synchronized - 除了 syn-sent 之外的所有已连接状态

bucket - 作为迷你套接字维护的状态,即 time-wait 和 syn-recv

big - bucket 的相反状态

bound-inactive - 已绑定但处于非活动状态的套接字(未处于监听、连接等状态)。

EXPRESSION

EXPRESSION 允许基于特定条件进行过滤。EXPRESSION 由一系列谓词组成,并通过布尔运算符组合。可能的运算符按优先级递增的顺序排列:
or(或 | 或 ||)、and(或 & 或 &&)以及 not(或 !)。如果连续的谓词之间没有运算符,则假定存在隐式 and 运算符。可以使用“(" 和 ")" 对子表达式进行分组。

支持以下谓词:

{dst|src} [=] HOST
测试目标地址或源地址是否与 HOST 匹配。有关详细信息,请参见 HOST 语法。

{dport|sport} [OP] [FAMILY:]:PORT
将目标端口或源端口与 PORT 进行比较。OP 可以是以下任何一个:“<”、“<="、“=”、“!=\"”、“>=" 和 “>”。遵循正常的算术规则。FAMILY 和 PORT 如 HOST 语法中所述。

dev [=|!=] DEVICE
基于连接使用的设备进行匹配。DEVICE 可以是设备名称或接口的索引。

fwmark [=|!=] MASK
基于连接的 fwmark 值进行匹配。这可以是特定的标记值,也可以是标记值,后跟一个“/”,以及一个用于比较的位掩码。例如,“fwmark = 0x01/0x03” 将匹配如果 fwmark 的两个最低有效位为 0x01。

cgroup [=|!=] PATH
如果连接是给定路径中 cgroup 的一部分,则匹配。

autobound
如果源地址的端口或路径是自动分配的(而不是显式指定的),则匹配。

大多数运算符都有别名。如果未提供运算符,则假定为“=”。以下每组运算符都是等效的:

= == eq

!= ne neq

> gt

< lt

>= ge geq

<= le leq

! not

| || or

& && and

HOST 语法

通用的主机语法是 [FAMILY:]ADDRESS[:PORT]。

FAMILY 必须是 -f 选项支持的族之一。如果未提供,则默认为使用 -f 选项指定的族,如果该选项也未提供,则假定为 inet 或 inet6。
请注意,表达式中的所有主机条件应该要么都是相同的族,要么只能是 inet 和 inet6。如果存在其他族混合,结果可能会出乎意料。

ADDRESS 和 PORT 的形式取决于使用的族。可以使用“*”作为地址或端口的通配符。每个族的具体信息如下:

unix   ADDRESS 是一个 glob 模式(参见 fnmatch(3)),它将以区分大小写的方式与 unix socket 的地址进行匹配。同时支持路径名和抽象名。Unix 地址不支持端口,并且不能使用“\*”作为通配符。

link   ADDRESS 是要匹配的以太网协议的区分大小写的名称。PORT 是所需的链接设备的设备名称或设备索引,如 ip link 的输出中所看到的。

netlink
ADDRESS 是 netlink 族的描述符。可能的值来自 /etc/iproute2/nl_protos。PORT 是 socket 的端口 ID,通常与所有进程 ID 相同。可以使用“kernel”来表示内核(端口 ID 为 0)。

vsock  ADDRESS 是一个表示 CIDR 地址的整数,PORT 是端口。

inet 和 inet6
ADDRESS 是一个 IP 地址(v4 或 v6,取决于族),或者解析为所需版本 IP 地址的 DNS 主机名。IPv6 地址必须用“[”和“]”括起来,以区分端口分隔符。地址还可以附加 CIDR 符号(斜杠后跟前缀长度(以比特为单位))。PORT 可以是数字 socket 端口,也可以是匹配的端口服务名称。

使用示例

ss -t -a

显示所有 TCP socket。

ss -t -a -Z

显示所有具有进程 SELinux 安全上下文的 TCP socket。

ss -u -a

显示所有 UDP socket。

ss -o state established '( dport = :ssh or sport = :ssh )'

显示所有处于已建立状态的 ssh 连接。

ss -x src /tmp/.X11-unix/*

查找所有连接到 X 服务器的本地进程。

ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24

列出所有处于 FIN-WAIT-1 状态的 TCP socket,这些 socket 的目标网络是 193.233.7/24,并查看它们的计时器。

ss -a -A 'all,!tcp'

列出所有 socket 表中的所有状态的 socket,但不包括 TCP。

参见

ip(8), RFC 793 - https://tools.ietf.org/rfc/rfc793.txt (TCP 状态)

作者

ss 由 Alexey Kuznetsov 编写,<_>。

此手册页由 Michael Prokop 编写,<_>,用于 Debian 项目(但其他人也可以使用)。