🐧 Linux ss 命令详解

🐧 Linux ss 命令详解


🎯 学习目标

  1. 掌握 ss(Socket Statistics)命令的基本结构与常用参数。
  2. 熟悉使用 ss 查看 TCP、UDP 连接状态,排查网络问题。
  3. 能够结合 grepawk 等工具进行高效分析。
  4. 了解 ss 与旧版 netstat 的差异及优势。

⚡ 核心重点(知识点提炼)

功能 命令 说明
查看所有连接 ss -a 显示所有 TCP/UDP 连接
查看TCP连接 ss -t 只显示 TCP 连接
查看UDP连接 ss -u 只显示 UDP 连接
显示进程信息 ss -p 显示关联的进程名和 PID(需 root 权限)
显示统计信息 ss -s 显示 socket 统计摘要
过滤特定端口 ss dport = :80 使用表达式过滤指定端口
查看监听状态 ss -l 查看处于 LISTEN 状态的连接
查看连接状态 ss -o 显示超时、重传等 TCP 状态信息

📚 详细讲解

🧩 一、基本语法格式

ss [OPTIONS] [FILTER]
  • OPTIONS

    • -t:TCP 协议
    • -u:UDP 协议
    • -l:LISTEN 状态(监听中的服务)
    • -a:ALL(包括监听和非监听)
    • -n:不解析服务名称(如显示 80 而不是 http)
    • -p:显示进程信息(需要 root 权限)
    • -r:解析服务名称(默认行为)
    • -e:显示详细的 socket 信息(UID、INODE 等)
    • -m:显示内存使用情况
    • -o:显示 TCP 定时器(如 retransmit、keepalive)
    • -s:显示 socket 摘要统计信息
    • -i:显示 TCP 内部信息(RTT、拥塞控制算法等)
  • FILTER

    • dport / sport:源或目的端口
    • src / dst:源或目的 IP 地址
    • state:连接状态(如 established, time-wait 等)

🔍 二、查看所有连接(TCP + UDP)

ss -a

输出示例:

Netid  State   Recv-Q  Send-Q   Local Address:Port     Peer Address:Port
tcp    ESTAB   0       0        192.168.1.100:55432   192.168.1.1:22
tcp    LISTEN  0       128      *:22                 *:*
udp    UNCONN  0       0        *:68                 *:*

📌 字段解释:

  • Netid:协议类型(tcp/udp/sctp)
  • State:连接状态(ESTAB=已建立,LISTEN=监听中,UNCONN=未连接)
  • Recv-Q:接收队列中有多少字节尚未被应用读取
  • Send-Q:发送队列中有多少字节尚未被对方确认
  • Local Address:Port:本地地址和端口
  • Peer Address:Port:对端地址和端口

🛠 三、查看 TCP/UDP 连接

1. 查看所有 TCP 连接

ss -t -a

输出示例:

tcp  LISTEN 0  128  *:ssh  *:*
tcp  ESTAB  0  0    192.168.1.100:ssh  192.168.1.1:54321

2. 查看所有 UDP 连接

ss -u -a

输出示例:

udp  UNCONN 0  0  *:bootpc  *:*
udp  UNCONN 0  0  *:domain   *:*

📌 注意:

  • UDP 是无连接协议,因此大多数状态为 UNCONN
  • bootpc 是 DHCP 客户端使用的端口(68),domain 是 DNS(53)

🕵️‍♂️ 四、查看监听状态的服务(常用)

ss -l -t

输出示例:

tcp  LISTEN 0  128  *:ssh  *:*
tcp  LISTEN 0  128  *:http  *:*

📌 用途:

  • 快速查看哪些服务正在监听端口(如 SSH、HTTP、HTTPS 等)
  • 替代 netstat -tulnp

🧠 五、查看进程信息(需 root)

sudo ss -t -p

输出示例:

tcp  ESTAB 0  0  192.168.1.100:ssh  192.168.1.1:54321  users:(("sshd",pid=1234,fd=3))

📌 说明:

  • users: 后面显示了进程名、PID 和文件描述符
  • 可用于定位哪个进程占用了某个端口

🧱 六、按条件过滤连接

1. 查看特定端口的连接(如 80)

ss dport = :80

或查看源端口:

ss sport = :80

2. 查看特定 IP 的连接(如 192.168.1.1)

ss src 192.168.1.1

3. 查看处于 TIME-WAIT 状态的连接

ss -t state time-wait

输出示例:

tcp  TIME-WAIT 0  0  192.168.1.100:80  192.168.1.1:54321

📌 用途:

  • 高并发场景下可能出现大量 TIME-WAIT 连接
  • 可用于优化服务器性能(调整 net.ipv4.tcp_tw_reuse 参数)

🧪 七、查看 TCP 状态和定时器(进阶)

ss -to

输出示例:

tcp  ESTAB 0  0  192.168.1.100:80  192.168.1.1:54321 timer:(keepalive,60sec,0)

📌 说明:

  • timer 字段显示当前 TCP 状态下的定时器(如 keepalive、retransmit)
  • 可用于调试连接异常或慢响应问题

📊 八、查看 socket 统计信息

ss -s

输出示例:

Total: 23 (kernel 34)
TCP:   15 (established 2, closed 5, orphaned 0, synrecv 0)
UDP:   6
RAW:   0

📌 说明:

  • 显示当前系统中各类 socket 的总数和状态
  • 可用于快速判断是否有大量连接堆积或异常关闭

🧬 九、实战案例:排查高连接数问题

🧩 场景描述:

你的 Web 服务器突然变慢,怀疑是连接数过高导致资源耗尽。你应该如何排查?

✅ 步骤如下:

  1. 查看当前 TCP 连接总数

    ss -s | grep TCP
    
  2. 查看当前活跃的连接数量

    ss -t | wc -l
    
  3. 查看每个 IP 的连接数

    ss -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
    

    输出示例:

    150 192.168.1.100
    30  192.168.1.200
    
  4. 查看特定端口(如 80)的连接数

    ss -t dport = :80 | wc -l
    
  5. 查看 TIME-WAIT 数量

    ss -ant | grep TIME-WAIT | wc -l
    
  6. 查看哪个进程占用了最多连接

    sudo ss -t -p | awk '{print $7}' | grep -v "-" | sort | uniq -c | sort -nr
    

🧠 小贴士:ss vs netstat

功能 ss 命令 netstat
查看连接
查看监听
显示进程信息 ✅(更清晰) ✅(但较慢)
性能表现 ✅ 更快(直接读取内核接口) ❌ 较慢(依赖 /proc/net
支持过滤 ✅ 支持强大表达式 ❌ 表达能力弱
默认安装 ✅ 多数现代发行版自带 ❌ 已弃用,部分系统不再预装

📌 建议:

  • 新项目请统一使用 ss 命令。
  • netstat 已被标记为过时,在某些发行版中甚至不再预装(如 Ubuntu 20.04+)。

🧩 不同发行版差异小结

发行版 默认是否安装 包名 特殊说明
Ubuntu 20.04+/Debian 11+ ✅ 默认安装 iproute2 支持完整功能
CentOS 7+/RHEL 8+ ✅ 默认安装 iproute 支持良好
EulerOS 2.0+ iproute 华为云推荐使用
Alpine Linux 需手动安装 iproute2 精简系统需额外安装

🧪 实验练习题(动手练一练)

  1. 查看当前系统中所有处于 ESTABLISHED 状态的 TCP 连接。
  2. 找出占用 80 端口的所有连接,并统计数量。
  3. 查看本机监听的所有端口及其对应进程(需要 root)。
  4. 使用 ss -s 查看 socket 摘要统计信息,观察变化。
  5. 使用 ss -t -o 查看当前连接的 TCP 定时器信息。

🧩 拓展阅读

  • man ss:查看完整帮助文档
  • ss --help:快速查看可用选项
  • 《Linux Networking Cookbook》——深入理解 Linux 网络诊断
  • 结合 lsoftcpdump 等工具进行综合分析

🎉 恭喜!你已经掌握了 Linux 中最强大的网络状态查看工具之一 ss,下一章节我们将进入《Linux 网络抓包与流量分析(tcpdump)》的学习,敬请期待!🚀


posted @ 2025-06-23 23:22  红尘过客2022  阅读(681)  评论(0)    收藏  举报