今天我们来快速掌握 Linux 系统中的ss命令。如果你经常需要排查网络连接问题、查看端口占用情况,或者想了解系统网络连接状态,这个工具比传统的netstat更高效、信息更全面。
ss命令(Socket Statistics)是 iproute2 工具包的一部分,专门用于转储套接字统计信息。它能够显示比netstat更详细的 TCP 和状态信息,执行速度也更快。无论是系统管理员、网络工程师还是开发人员,掌握ss命令都能显著提升网络问题排查效率。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 主要功能 | 查看套接字连接状态、端口占用、进程关联等网络信息 |
| 替代工具 | 比 netstat 更快速、信息更详细 |
| 支持协议 | TCP、UDP、UNIX 域套接字、RAW、SCTP 等 |
| 信息维度 | 连接状态、定时器信息、内存使用、进程关联等 |
| 过滤能力 | 支持按状态、端口、地址等条件精确过滤 |
| 系统要求 | 主流 Linux 发行版默认安装,无需额外配置 |
2. ss 命令与 netstat 的对比优势
为什么推荐使用ss而不是传统的netstat?主要有以下几个原因:
性能优势:ss直接从内核空间获取套接字信息,而netstat需要读取/proc/net/tcp等文件,当系统有大量连接时,ss的速度优势非常明显。
信息更丰富:ss可以显示更详细的 TCP 内部信息,包括定时器状态、内存使用情况、拥塞控制参数等,这些对于深度排查网络问题非常有帮助。
过滤功能强大:ss提供了灵活的过滤语法,可以精确筛选出感兴趣的连接,比如只查看特定状态的 TCP 连接,或者只显示某个端口的连接。
未来发展:netstat已经被标记为过时,在新的 Linux 发行版中,ss是推荐的替代工具。
3. 基础语法与常用选项
ss命令的基本语法格式为:
ss [选项] [过滤条件]3.1 常用选项速查
显示选项:
-t:显示 TCP 套接字-u:显示 UDP 套接字-x:显示 UNIX 域套接字-l:仅显示监听套接字-a:显示所有套接字(监听+非监听)-n:以数字形式显示,不解析服务名-p:显示使用套接字的进程信息
信息详细程度:
-e:显示详细套接字信息-m:显示套接字内存使用情况-o:显示定时器信息-i:显示内部 TCP 信息
4. 实战应用场景
4.1 查看所有 TCP 连接
最基本的用法是查看所有 TCP 连接:
ss -t -a这个命令会列出所有 TCP 套接字,包括监听状态和已建立的连接。输出格式通常包括:
- Local Address:Port:本地地址和端口
- Peer Address:Port:对端地址和端口
- State:连接状态(ESTABLISHED、LISTEN、TIME-WAIT 等)
4.2 查看端口监听情况
要查看系统正在监听的端口,使用:
ss -tuln这个组合非常实用:
-t:TCP 协议-u:UDP 协议-l:仅显示监听套接字-n:数字格式,不解析服务名
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp LISTEN 0 100 127.0.0.1:25 0.0.0.0:*4.3 查看进程关联信息
想知道哪个进程在使用某个端口?加上-p选项:
ss -tulnp输出中会显示进程 ID 和进程名:
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))这在排查端口冲突时特别有用,可以快速定位到具体的进程。
4.4 查看详细的 TCP 内部信息
对于需要深度排查的网络问题,可以查看 TCP 内部信息:
ss -ti这会显示包括拥塞窗口、RTT(往返时间)、MSS(最大段大小)等详细信息:
ESTAB 0 0 192.168.1.100:ssh 192.168.1.200:12345 cubic wscale:7,7 rto:204 rtt:1.25/0.75 ato:40 mss:1448 cwnd:10 send 1.0Mbps5. 高级过滤技巧
ss的强大之处在于其灵活的过滤能力。
5.1 按连接状态过滤
只查看已建立的 SSH 连接:
ss -t state established '( dport = :ssh or sport = :ssh )'查看所有处于 FIN-WAIT-1 状态的连接:
ss -t state fin-wait-15.2 按端口号过滤
查看目标端口为 80 或 443 的连接:
ss -t '( dport = :http or dport = :https )'或者使用数字端口:
ss -t '( dport = :80 or dport = :443 )'5.3 按 IP 地址过滤
查看与特定 IP 段的连接:
ss -t dst 192.168.1.0/246. 实际排查案例
6.1 案例一:端口占用排查
场景:启动服务时发现 8080 端口被占用。
排查步骤:
# 查看 8080 端口的占用情况 ss -tulnp | grep :8080 # 如果发现被占用,查看具体连接 ss -tamp | grep :80806.2 案例二:网络连接故障排查
场景:应用无法连接到数据库服务器。
排查步骤:
# 查看到数据库端口的连接状态 ss -t state established '( dport = :5432 )' # 查看连接超时或失败的状态 ss -t state syn-sent6.3 案例三:性能问题排查
场景:网络传输速度慢,怀疑有丢包或拥塞。
排查步骤:
# 查看 TCP 连接的内存和缓冲区状态 ss -tm # 查看详细的 TCP 内部参数 ss -ti7. 内存和资源监控
ss -m可以显示套接字的内存使用情况,格式为:
skmem:(r<rmem_alloc>,rb<rcv_buf>,t<wmem_alloc>,tb<snd_buf>)rmem_alloc:为接收数据包分配的内存rcv_buf:可用于接收数据包的总内存wmem_alloc:用于发送数据包的内存snd_buf:可用于发送数据包的总内存
这对于排查内存泄漏或缓冲区设置不合理的问题很有帮助。
8. 定时器信息分析
ss -o显示 TCP 定时器信息,格式为:
timer:(<timer_name>,<expire_time>,<retrans>)定时器类型包括:
on:重传定时器(TCP retrans timer)keepalive:TCP 保活定时器timewait:TIME-WAIT 阶段定时器persist:零窗口探测定时器
这对于分析连接超时、重传问题非常有用。
9. 常见问题排查指南
9.1 端口被占用错误
问题现象:启动服务时报 "Address already in use"
排查命令:
ss -tulnp | grep <端口号>解决方案:
- 终止占用端口的进程
- 更改服务配置使用其他端口
- 等待 TIME-WAIT 状态超时(通常 60 秒)
9.2 连接数过多问题
问题现象:系统性能下降,无法建立新连接
排查命令:
# 查看总连接数 ss -t | wc -l # 按状态分类统计 ss -t | grep -o 'STATE=[A-Z-]*' | sort | uniq -c解决方案:
- 优化应用连接管理(使用连接池)
- 调整系统文件描述符限制
- 检查是否有连接泄漏
9.3 连接状态异常
问题现象:大量连接处于异常状态
排查命令:
# 查看各种状态的连接数 ss -t -a | awk '{print $1}' | sort | uniq -c # 查看长时间处于特定状态的连接 ss -t state time-wait10. 实用技巧和最佳实践
10.1 组合使用其他工具
ss可以与其他工具组合使用,发挥更大威力:
# 实时监控连接变化 watch -n 1 'ss -t state established' # 统计每个 IP 的连接数 ss -t | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr # 监控特定端口的连接变化 watch -n 1 'ss -t sport = :80'10.2 自动化监控脚本
可以编写脚本定期检查关键指标:
#!/bin/bash # 监控关键端口的连接状态 CRITICAL_PORTS="22 80 443 3306 5432" for port in $CRITICAL_PORTS; do count=$(ss -t sport = :$port state established | wc -l) echo "Port $port: $count established connections" if [ $count -gt 100 ]; then echo "WARNING: Port $port has high connection count!" fi done10.3 性能调优参考
通过ss观察到的信息可以指导性能调优:
- 接收/发送缓冲区大小:通过
ss -m观察,如果rmem_alloc经常接近rcv_buf,可能需要调整缓冲区大小 - TCP 参数优化:通过
ss -ti观察 RTT、拥塞窗口等参数,指导 TCP 参数调优 - 连接池配置:通过连接数统计,合理设置应用连接池大小
11. 安全相关应用
11.1 检测异常连接
定期检查异常的外连或入连:
# 检查不常见的目标端口 ss -t state established | awk '{print $5}' | cut -d: -f2 | sort -n | uniq # 检查不常见的源 IP ss -t state established | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -nr11.2 监控敏感服务
对 SSH、数据库等敏感服务加强监控:
# 监控 SSH 连接 ss -t '( sport = :ssh )' state established # 监控数据库连接 ss -t '( sport = :5432 )' state establishedss命令是 Linux 网络排查的利器,掌握它能够让你在遇到网络问题时快速定位原因。从基本的端口查看到复杂的性能分析,ss都能提供有价值的信息。建议在日常工作中多练习使用,将其纳入常规的监控和排查流程中。
对于系统管理员和开发人员来说,花三分钟学会ss命令的基本用法,在未来的工作中可能会节省数小时的排查时间。这个工具值得投入时间深入掌握。