ss
ss(socket statistics)用于查看套接字状态:本机开了哪些端口、连到哪些地方、被谁占用。它是 netstat 的替代品,netstat 所属的 net-tools 已经不再维护,新系统默认不装。
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. 看本机开了哪些端口
ss -tulnp输出:
Netid State Local Address:Port Peer Address:Port Processtcp 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. 查端口被谁占了
ss -tlnp 'sport = :8080'启动服务报 Address already in use 时用这条,直接给出 PID,再用 kill 处理
3. 按状态筛
ss -tn state establishedss -tn state time-wait | wc -l大量 TIME-WAIT 一般是短连接太多,本身属于正常现象,只有在把本地端口耗尽时才需要处理
4. 看跟某台机器的连接
ss -tn dst 10.0.0.5ss -tni dst 10.0.0.5 # 带上 rtt、cwnd5. 汇总
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 ssman 7 netlink(ss 取数据的接口)