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 项目(但其他人也可以使用)。