Linux网络排查利器:ss命令详解与实战应用
2026/7/26 10:09:20 网站建设 项目流程

今天我们来快速掌握 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.0Mbps

5. 高级过滤技巧

ss的强大之处在于其灵活的过滤能力。

5.1 按连接状态过滤

只查看已建立的 SSH 连接:

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

查看所有处于 FIN-WAIT-1 状态的连接:

ss -t state fin-wait-1

5.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/24

6. 实际排查案例

6.1 案例一:端口占用排查

场景:启动服务时发现 8080 端口被占用。

排查步骤:

# 查看 8080 端口的占用情况 ss -tulnp | grep :8080 # 如果发现被占用,查看具体连接 ss -tamp | grep :8080

6.2 案例二:网络连接故障排查

场景:应用无法连接到数据库服务器。

排查步骤:

# 查看到数据库端口的连接状态 ss -t state established '( dport = :5432 )' # 查看连接超时或失败的状态 ss -t state syn-sent

6.3 案例三:性能问题排查

场景:网络传输速度慢,怀疑有丢包或拥塞。

排查步骤:

# 查看 TCP 连接的内存和缓冲区状态 ss -tm # 查看详细的 TCP 内部参数 ss -ti

7. 内存和资源监控

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-wait

10. 实用技巧和最佳实践

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 done

10.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 -nr

11.2 监控敏感服务

对 SSH、数据库等敏感服务加强监控:

# 监控 SSH 连接 ss -t '( sport = :ssh )' state established # 监控数据库连接 ss -t '( sport = :5432 )' state established

ss命令是 Linux 网络排查的利器,掌握它能够让你在遇到网络问题时快速定位原因。从基本的端口查看到复杂的性能分析,ss都能提供有价值的信息。建议在日常工作中多练习使用,将其纳入常规的监控和排查流程中。

对于系统管理员和开发人员来说,花三分钟学会ss命令的基本用法,在未来的工作中可能会节省数小时的排查时间。这个工具值得投入时间深入掌握。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询