ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Linux网络连接排查实战:ss与netstat工具详解与TCP状态分析

Linux网络连接排查实战:ss与netstat工具详解与TCP状态分析 这次我们来看一个 Linux 网络连接状态排查的实战主题。在服务器运维、应用开发和性能调优中TCP/IP 连接和 Socket 状态是必须掌握的核心技能。无论是服务端口被占、连接数异常飙升还是应用卡在TIME_WAIT状态都需要快速定位和解决。本文不空谈理论直接聚焦于两个最实用的工具ss和netstat带你从零到一掌握连接状态排查的完整流程。如果你关心如何快速找出占用端口的进程、分析 TCP 连接的各种状态、定位网络瓶颈或者解决socket未连接、端口冲突等问题这篇文章可以直接收藏。我们将重点拆解ss和netstat的核心用法、状态含义、排查思路并提供可直接复用的命令和脚本。1. 核心能力速览在深入细节前我们先快速了解这两个工具的核心定位和适用场景。能力项ss(Socket Statistics)netstat(Network Statistics)主要功能显示详细的 Socket 连接统计信息是netstat的现代替代品。显示网络连接、路由表、接口统计等信息历史更悠久。性能与数据源直接从内核 TCP/IP 协议栈获取信息速度极快尤其在连接数巨大时优势明显。通过读取/proc/net/下的文件获取信息在连接数多时可能较慢。输出信息丰富度信息更详细支持过滤、排序能显示更多 TCP 内部状态如发送/接收队列、拥塞窗口。信息基础但格式经典易于阅读部分老系统可能只预装了它。推荐使用场景生产环境首选用于快速、精确地排查大量连接、分析性能瓶颈。兼容性检查、快速查看概览或在没有ss的极老系统中使用。是否支持过滤强大支持可按状态、端口、IP、进程等灵活过滤。支持基础过滤但语法相对简单。本文重点主要讲解对象涵盖常用命令、状态解读和实战排查。作为对比和补充介绍关键用法。简单来说新系统、要性能、做深度排查用ss老系统、看概览、求兼容用netstat。2. 适用场景与使用边界掌握连接状态排查技能几乎适用于所有与 Linux 服务器打交道的场景后端开发与运维部署服务时发现端口8080已被占用需要找出“罪魁祸首”。性能分析与调优应用响应变慢怀疑是数据库连接池耗尽或外部 API 调用产生了大量TIME_WAIT连接。安全审计与入侵检测检查服务器是否有未知的外连或监听端口排查可疑进程。网络问题诊断应用报错 “Address already in use” 或 “Connection refused”需要定位根本原因。容器与微服务环境在 Docker 或 Kubernetes 集群中排查容器间的网络连通性与端口映射问题。使用边界与注意事项需要权限查看所有连接或监听端口通常需要root权限或sudo。信息瞬时性命令输出反映的是运行瞬间的网络状态对于高频变化的连接可能需要配合watch命令进行持续监控。结合其他工具ss/netstat主要用于“发现”问题。要深入分析还需结合lsof查看文件与进程、tcpdump抓包、strace系统调用跟踪等工具。安全合规在审计他人服务器或生产环境时应遵循既定的流程和授权避免误操作。3. 环境准备与前置条件本文演示基于常见的 Linux 发行版。几乎所有的现代 Linux 系统都内置了netstat和ss。操作系统Ubuntu 20.04/22.04, CentOS 7/8, Rocky Linux, AlmaLinux 等主流发行版均可。Windows 的 WSL2 环境也完全支持。工具确认打开终端执行以下命令检查工具是否可用及版本。# 检查 ss 是否安装 which ss ss -v 21 | head -1 # 查看版本可能不显示具体版本号 # 检查 netstat 是否安装 which netstat netstat --version 21 | head -1 # 如果 netstat 未找到通常它位于 net-tools 包中可以安装 # Ubuntu/Debian: sudo apt update sudo apt install net-tools # CentOS/RHEL/Rocky: sudo yum install net-tools权限准备普通用户可查看自己进程的连接查看所有连接需要提升权限。本文示例命令大多需要sudo前缀。模拟环境可选为了有更丰富的输出用于演示你可以启动一些常见服务来创建连接。# 启动一个 Python 简易 HTTP 服务器在后台监听 8080 端口 python3 -m http.server 8080 # 使用 curl 创建几个到外部网站的 TCP 连接 curl -I https://www.example.com curl -I https://www.google.com 4.ss命令现代 Socket 统计利器ss是iproute2软件包的一部分语法强大。让我们从最常用的查询开始。4.1 基础查询查看所有连接# 显示所有类型的 socket 连接TCP, UDP, RAW, Unix domain等信息非常全 sudo ss -tunap # 参数解释 # -t : 显示 TCP 连接 # -u : 显示 UDP 连接 # -n : 以数字形式显示地址和端口不进行 DNS 解析和服务名查找速度更快 # -a : 显示所有 socket包括监听的和已建立的 # -p : 显示使用 socket 的进程信息PID 和程序名输出列解读Netid: 连接类型tcp,udp,u_str等。State: TCP 状态LISTEN,ESTAB,TIME-WAIT等。Recv-Q: 接收队列的字节数。对于 ESTABLISHED 状态表示已接收但未被应用读取的数据对于 LISTEN 状态表示当前已完成的连接队列长度。Send-Q: 发送队列的字节数。对于 ESTABLISHED 状态表示已发送但未收到对方 ACK 的数据对于 LISTEN 状态表示最大 backlog 队列长度。Local Address:Port: 本地地址和端口。Peer Address:Port: 对端地址和端口。Process: 进程的 PID 和名称。4.2 精准过滤找到你想要的信息ss的强大之处在于其过滤能力。# 1. 查看所有 TCP 监听端口 sudo ss -tlnp # -l : 仅显示监听LISTEN状态的 socket # 2. 查看指定端口如 8080被谁占用 sudo ss -tlnp sport :8080 # 或 sudo ss -tlnp | grep :8080 # 3. 查看所有已建立的 TCP 连接 sudo ss -tn state established # 4. 查看处于 TIME-WAIT 状态的连接常出现在频繁短连接场景 sudo ss -tn state time-wait # 5. 查看来自或去往特定 IP 的连接 sudo ss -tn dst 192.168.1.100 sudo ss -tn src 10.0.0.1 # 6. 查看指定进程如 PID 为 1234的所有连接 sudo ss -tnp | grep \pid1234\4.3 高级功能监控与详情# 1. 持续监控类似 top每2秒刷新一次 watch -n 2 \sudo ss -tn state established\ # 2. 显示更详细的内部 TCP 信息如拥塞窗口、rtt sudo ss -tni # 输出会包含很多以 ‘ts, sack, wscale, ecn’ 等开头的行是 TCP 连接参数。 # 3. 按连接数对状态进行排序统计 sudo ss -tn | awk ‘{print $1}’ | sort | uniq -c | sort -rn # 这个命令能快速看出哪种状态的连接最多。5.netstat命令经典网络统计工具虽然ss是未来但netstat依然广泛存在其输出格式对很多人来说更直观。5.1 基础查询经典视图# 显示所有 TCP 和 UDP 连接及监听端口并显示进程 sudo netstat -tunlp # 参数解释与 ss 类似 # -t : TCP # -u : UDP # -n : 数字格式 # -l : 仅监听 # -p : 显示进程/程序名 # 显示所有 socket包括 Unix domain socket sudo netstat -a5.2 常用过滤与统计# 1. 查看所有 TCP 监听端口 sudo netstat -tlnp # 2. 查看指定端口的占用情况 sudo netstat -tlnp | grep :8080 # 3. 统计各种 TCP 状态的数量 sudo netstat -nt | awk ‘/^tcp/ {S[$NF]} END {for(a in S) print a, S[a]}’ # 这个命令非常实用能立刻输出如 ESTABLISHED 10, TIME_WAIT 25 这样的统计。 # 4. 查看路由表 netstat -rn6. TCP 连接状态深度解读与排查工具的输出里State列是关键。理解这些状态是排查问题的核心。6.1 关键 TCP 状态解析状态含义常见场景与排查点LISTEN服务端 socket 正在监听连接请求。正常服务状态。检查预期服务是否在监听正确端口。ESTABLISHED连接已建立正在进行数据传输。正常通信状态。数量异常多可能表示连接池配置问题或业务压力大。SYN-SENT客户端已发送 SYN等待服务器确认。连接发起中。长时间处于此状态可能对端未响应或网络不通。SYN-RECEIVED服务器收到 SYN 并回复 SYN-ACK等待客户端 ACK。连接建立中。大量此状态可能是 SYN Flood 攻击的迹象。FIN-WAIT-1主动关闭方发送 FIN 后进入的状态。连接关闭中。FIN-WAIT-2主动关闭方收到对端对 FIN 的 ACK 后进入。等待对端发送 FIN。如果对端应用不关闭连接会一直挂在此状态。TIME-WAIT最常见的问题状态之一。主动关闭方在发送最后一个 ACK 后进入。等待 2MSL 时间以确保对端收到 ACK。大量出现是正常的尤其在频繁创建短连接的应用如爬虫、API 调用中。系统有最大数量限制 (net.ipv4.tcp_max_tw_buckets)。CLOSE-WAIT常见的问题状态之一。被动关闭方收到 FIN 后进入等待应用层关闭连接。大量出现通常意味着应用 Bug应用没有正确调用close()关闭 socket。需要检查应用程序代码。LAST-ACK被动关闭方发送自己的 FIN 后进入等待对方最后的 ACK。连接关闭中。CLOSED连接完全关闭。在ss/netstat输出中看不到此状态。6.2 实战排查案例案例一端口占用 (Address already in use)问题启动应用时提示 8080 端口被占用。 排查# 方法1使用 ss sudo ss -tlnp sport :8080 # 方法2使用 netstat sudo netstat -tlnp | grep :8080 # 方法3使用 lsof (另一个强大工具) sudo lsof -i :8080解决根据输出找到 PID用kill -9 PID终止进程或重启占用该端口的服务。案例二大量 TIME_WAIT 连接问题服务器连接数接近上限性能下降发现大量TIME-WAIT。 排查# 统计 TIME_WAIT 数量 sudo ss -tn state time-wait | wc -l # 查看系统配置 sysctl net.ipv4.tcp_max_tw_buckets分析这是 TCP 协议的正常行为。如果数量巨大可以考虑优化应用使用连接池避免频繁创建短连接。调整内核参数需谨慎评估影响# 启用 TIME_WAIT 连接复用快速回收 echo 1 /proc/sys/net/ipv4/tcp_tw_reuse # 或通过 sysctl 永久修改编辑 /etc/sysctl.conf # net.ipv4.tcp_tw_reuse 1案例三大量 CLOSE_WAIT 连接问题应用响应缓慢连接数只增不减发现大量CLOSE-WAIT。 排查sudo ss -tn state close-wait分析这几乎总是应用程序的 Bug。对方已关闭连接但本地应用没有调用close()来释放 socket 资源。需要定位是哪个进程看ss -tnp的输出。检查该进程的代码确保在所有执行路径上包括异常情况都正确关闭了网络连接。重启该应用可以临时释放这些僵尸连接但根本原因在代码。案例四检查异常外连问题怀疑服务器被入侵有未知外连。 排查# 查看所有已建立的出站连接 sudo ss -tn state established dst ‘!192.168.0.0/16‘ # 排除内网 # 查看所有监听端口检查是否有未知服务 sudo ss -tlnp分析对比已知服务列表检查是否有陌生的进程在监听端口或向未知外部地址建立连接。7. 性能监控与资源占用分析网络连接本身占用资源不多但连接数巨大或状态异常会影响系统。文件描述符限制每个 socket 都是一个文件描述符。系统有全局和单进程限制。# 查看系统全局限制 cat /proc/sys/fs/file-max # 查看当前已使用的文件描述符数量近似等于总连接数打开文件数 cat /proc/sys/fs/file-nr # 查看特定进程如PID 1234的限制和当前使用量 grep ‘Max open files’ /proc/1234/limits ls /proc/1234/fd | wc -l内存占用每个 TCP 连接会占用一定的内核内存读写缓冲区。连接数极高时数十万内存消耗可观。可通过slabtop命令观察skbuff等内核对象的内存使用。CPU 占用正常的连接维护消耗 CPU 很少。但在超高速率的新建/断开连接连接风暴场景下内核处理 TCP 状态机的开销会上升。8. 脚本化与自动化排查将常用检查封装成脚本方便日常巡检或故障排查。#!/bin/bash # 文件名network_check.sh # 功能快速网络连接状态巡检 echo “ 1. 检查所有监听端口 ” sudo ss -tlnp | head -20 echo -e “\n 2. TCP 连接状态统计 ” sudo ss -nt | awk ‘/^tcp/ {S[$2]} END {for(a in S) print a, S[a]}’ | sort -rn -k2 echo -e “\n 3. 检查 TIME_WAIT 数量 ” tw_count$(sudo ss -tn state time-wait | wc -l) echo “TIME_WAIT connections: $tw_count” sysctl net.ipv4.tcp_max_tw_buckets echo -e “\n 4. 检查 CLOSE_WAIT 数量应用Bug指标” cw_count$(sudo ss -tn state close-wait | wc -l) echo “CLOSE_WAIT connections: $cw_count” if [ $cw_count -gt 10 ]; then echo “警告CLOSE_WAIT 连接数较多可能存在应用未正确关闭连接的问题” sudo ss -tnp state close-wait | head -5 fi echo -e “\n 5. 检查文件描述符使用情况 ” echo “Global max: $(cat /proc/sys/fs/file-max)” used_all$(cat /proc/sys/fs/file-nr | awk ‘{print $1}’) echo “Currently used (global): $used_all”9. 常见问题与排查方法问题现象可能原因排查命令与步骤解决方案服务启动失败Address already in use端口被其他进程占用。sudo ss -tlnp sport :端口号或sudo lsof -i :端口号终止占用进程或为服务配置其他端口。客户端连接失败Connection refused目标端口无服务监听或防火墙拦截。1. 在目标服务器执行sudo ss -tlnp | grep :端口。2. 检查防火墙规则sudo iptables -L -n或sudo firewall-cmd --list-all。启动对应服务配置防火墙允许该端口。客户端连接超时网络路由问题对端服务僵死中间防火墙丢弃报文。1.ping 目标IP检查基础连通性。2.traceroute 目标IP检查路由。3. 在服务器用ss检查连接是否到达SYN-RECV状态。排查网络链路重启对端服务检查中间安全设备策略。大量TIME_WAIT连接频繁的短连接操作属于 TCP 协议正常现象。sudo ss -tn state time-wait | wc -l优化应用使用长连接或连接池考虑调整net.ipv4.tcp_tw_reuse需评估风险。大量CLOSE_WAIT连接应用程序 Bug未正确关闭 socket。sudo ss -tnp state close-wait修复应用程序代码确保 socket 被关闭。重启应用可临时解决。ss/netstat命令未找到net-tools或iproute2包未安装。which ss,which netstat安装对应软件包net-tools(含 netstat) 或iproute2(含 ss)。ss -p不显示进程名权限不足无法读取其他用户进程信息。使用sudo执行命令。以 root 权限或通过 sudo 执行。连接数缓慢增长不释放应用存在连接泄漏如未关闭数据库连接。1. 监控ss -tn state established总数变化。2. 使用lsof -p PID查看进程打开的文件描述符。检查应用连接池配置和资源释放逻辑。使用 Profiling 工具定位泄漏点。10. 最佳实践与使用建议养成习惯在部署新服务或应用出现网络问题时第一时间使用sudo ss -tlnp检查端口占用情况。明确工具链将ss作为日常首选排查工具netstat作为备用。记住ss的过滤语法state 状态和sport/dport :端口。理解状态流花时间理解 TCP 状态机。知道ESTABLISHED、TIME_WAIT、CLOSE_WAIT的含义能让你快速定位大部分连接层问题。结合上下文不要孤立地看连接状态。结合系统日志 (/var/log/messages,journalctl)、应用日志和监控图表如连接数趋势一起分析。自动化监控将关键的连接状态统计如CLOSE_WAIT数量、ESTABLISHED数量纳入监控系统如 Prometheus node_exporter设置告警阈值。谨慎调参修改net.ipv4.tcp_tw_reuse、net.ipv4.tcp_max_tw_buckets等内核参数前务必在测试环境验证并充分理解其对应用的影响。大多数情况下优化应用代码比调整内核参数更有效。善用组合命令watch -n 2 sudo ss -tn state established实时监控活跃连接。sudo ss -tnp \| awk ‘{print $6}’ \| cut -d, -f2 \| sort \| uniq -c \| sort -rn统计哪个进程建立的连接最多。掌握ss和netstat你就拥有了快速透视 Linux 服务器网络连接状况的能力。从端口冲突到连接泄漏从性能瓶颈到安全审计这套组合拳都能提供最直接的线索。建议将文中的常用命令保存为脚本或添加到你的运维笔记中下次遇到网络问题直接拿出来用。
返回列表