跳转到内容

ss

ss(socket statistics)用于查看套接字状态:本机开了哪些端口、连到哪些地方、被谁占用。它是 netstat 的替代品,netstat 所属的 net-tools 已经不再维护,新系统默认不装。

Terminal window
ss [选项] [过滤表达式]

选项决定看哪一类套接字,过滤表达式决定筛出其中哪些 不带任何参数时列出所有已建立连接的套接字

netstat 的做法是逐个读 /proc/net/ 下的文本文件再解析,连接数上万时会明显变慢。ss 走的是内核的 netlink 接口(NETLINK_SOCK_DIAG),由内核直接把结构化数据交出来,还能把过滤条件下推到内核侧,只返回匹配的那些。

数据来源不同也带来一个差异:ss 能拿到 netstat 拿不到的 TCP 内部状态,比如 rtt、拥塞窗口、重传次数,用 -i 查看。

选项 说明
-t TCP
-u UDP
-x Unix domain socket
-4 / -6 只看 IPv4 / IPv6
选项 说明
-l 只看监听中的(listening)
-a 全部,监听的和已连接的都要
-n 不把端口号翻译成服务名,也不做反向解析,快很多
-p 显示占用套接字的进程,看别人的进程需要 root
选项 说明
-s 只打印汇总统计
-i 显示 TCP 内部信息:rtt、cwnd、重传
-o 显示计时器状态
-m 显示套接字的内存占用

日常记住 ss -tulnp 这一串就够用了:TCP、UDP、只看监听、纯数字、带进程

写法 含义
state <状态> 按连接状态,如 established、time-wait、listening
sport = :22 源端口等于 22
dport = :443 目的端口等于 443
dst 10.0.0.0/8 目的地址在这个网段内
src 127.0.0.1 源地址

1. 看本机开了哪些端口

Terminal window
ss -tulnp

输出:

Netid State Local Address:Port Peer Address:Port Process
tcp LISTEN 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=812,fd=3))
tcp LISTEN 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1104,fd=21))

重点看 Local Address 那一列:0.0.0.0 表示对所有网卡开放,外部可达;127.0.0.1 表示只有本机能连 「本地连得上、别的机器连不上」,九成是卡在这一列,不是防火墙

2. 查端口被谁占了

Terminal window
ss -tlnp 'sport = :8080'

启动服务报 Address already in use 时用这条,直接给出 PID,再用 kill 处理

3. 按状态筛

Terminal window
ss -tn state established
ss -tn state time-wait | wc -l

大量 TIME-WAIT 一般是短连接太多,本身属于正常现象,只有在把本地端口耗尽时才需要处理

4. 看跟某台机器的连接

Terminal window
ss -tn dst 10.0.0.5
ss -tni dst 10.0.0.5 # 带上 rtt、cwnd

5. 汇总

Terminal window
ss -s

快速看一眼各类套接字的总数,判断是不是连接数异常

6. 和 netstat 的对应关系

netstat ss
netstat -tulnp ss -tulnp
netstat -an ss -an
netstat -s ss -s
netstat -x ss -x

选项字母基本沿用,手上的老命令直接把 netstat 换成 ss 大多能跑

  • man ss
  • man 7 netlink(ss 取数据的接口)