首页 游戏 软件 资讯 排行榜 专题
首页
业界动态
ss与netstat实战指南:一分钟快速诊断TCP连接问题

ss与netstat实战指南:一分钟快速诊断TCP连接问题

热心网友
45
转载
2026-05-16

线上服务响应突然变慢,不报错,日志也干净,CPU和内存都正常。这种“隐形”的网络问题最让人头疼。

记得有一次排查,折腾了半天,最后是一条命令直接锁定了病灶:

ss -antp | grep CLOSE_WAIT | wc -l

输出结果是4096。四千多个CLOSE_WAIT状态连接,典型的连接泄漏,文件描述符快被耗尽了。

这就是ssnetstat这类网络工具的核心价值——它们像系统的听诊器,无需加日志、无需重启服务,一条命令就能把当前所有TCP连接的状态全景呈现出来,问题往往一目了然。

这篇文章,我们就从原理到实战,把这两个工具彻底讲清楚,让你下次再遇到网络问题,心里有谱,手里有招。

一、先把 TCP 状态搞清楚

工具用起来简单,但看懂输出,得先理解TCP连接状态机。这就像看心电图,得先知道每个波形代表什么。

上图描绘了常见状态,这里补充几个关键解释:

三次握手(建立连接):

  • 客户端发送SYN → 进入SYN_SENT状态。
  • 服务端收到,回复SYN+ACK → 进入SYN_RCVD状态。
  • 客户端再回复ACK → 双方都进入ESTABLISHED状态,连接建立完成。

四次挥手(关闭连接):

  • 主动关闭方发送FIN → 进入FIN_WAIT_1状态。
  • 对方回复ACK → 主动关闭方进入FIN_WAIT_2状态(此时对方仍可发送数据)。
  • 对方数据发完后,发送FIN → 主动关闭方进入TIME_WAIT状态,被动方进入LAST_ACK状态。
  • 主动关闭方回复ACK → 等待2MSL时间后彻底关闭。

对于排查来说,不必记住所有状态,重点关注这几个就足以解决90%的问题:ESTABLISHED(已建立)、CLOSE_WAIT(等待关闭)、TIME_WAIT(时间等待)、LISTEN(监听)。

二、netstat vs ss:用哪个?

很多资料对这两个工具混用,这里明确一下:

  • netstat:老牌工具,几乎全系统通用,功能全面。但它的缺点是慢,尤其在连接数多的时候,因为它需要读取/proc/net/tcp文件并逐个解析。
  • ss (socket statistics):新工具,直接读取内核的netlink接口获取信息,速度极快,即使面对十万级连接也能秒出结果。

结论很明确:优先使用ss。只有在没有ss的环境下,再退而求其次使用netstat。两者的常用参数基本可以一一对应。

三、最常用的几条命令

1. 查看所有 TCP 连接

# ss(推荐)
ss -antp
# netstat(备用)
netstat -antp

参数说明:-a显示所有连接,-n以数字形式显示地址和端口(不解析域名,更快),-t仅显示TCP连接,-p显示关联的进程信息。

典型输出如下:

State    Recv-Q Send-Q Local Address:Port  Peer Address:Port  Process
LISTEN   0      128    0.0.0.0:8080        0.0.0.0:*          users:(("myapp",pid=1234))
ESTAB    0      0      10.0.0.1:8080       10.0.0.2:54321     users:(("myapp",pid=1234))
TIME-WAIT 0     0      10.0.0.1:8080       10.0.0.3:54322

有几个字段需要特别注意:

  • Recv-Q:接收缓冲区中积压的字节数。在LISTEN状态下,这个值表示等待被accept()的连接数。如果持续不为0,说明应用处理新连接的速度跟不上。
  • Send-Q:发送缓冲区中积压的字节数。如果持续不为0,通常意味着对端接收数据较慢。

2. 统计各状态连接数(最常用)

ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn

输出类似这样:

4096 CLOSE-WAIT
  256 ESTABLISHED
   12 TIME-WAIT
    1 LISTEN

哪个状态异常,一眼就能看出来。

3. 查看特定端口的连接

# 查看本地 8080 端口的所有连接
ss -antp sport = :8080
# 查看连接到某个远端 IP 的所有连接
ss -antp dst 10.0.0.2

4. 筛选特定状态的连接

# 只看已建立的连接
ss -antp state established
# 只看 CLOSE_WAIT(排查连接泄漏必用)
ss -antp state close-wait
# 只看 TIME_WAIT
ss -antp state time-wait

5. 统计模式:快速查看连接摘要

# 查看连接统计摘要
ss -s

输出:

Total: 1024
TCP:   512 (estab 256, closed 200, orphaned 12, timewait 44)

四、图解:三种最常见的异常场景

这是线上最高频的三种TCP问题,看图就能快速理解其成因和影响。

五、三个真实排查场景,手把手过一遍

1. 场景一:CLOSE_WAIT堆积——连接泄漏

症状:服务运行一段时间后变慢,日志无报错,重启后恢复,但不久后问题重现。

首先用统计命令看状态分布:

ss -ant | awk 'NR>1{print $1}' | sort | uniq -c | sort -rn

输出显示大量CLOSE_WAIT

3847 CLOSE-WAIT
  128 ESTABLISHED
    1 LISTEN

接着定位具体进程:

ss -antp state close-wait | head -20

找到对应的端口和进程名,去检查代码,很可能会发现:在某个异常处理路径中,连接使用后没有在finally块中正确关闭。

本质CLOSE_WAIT表示对方(主动关闭方)已经发送了FIN包,告知“我说完了”,但本地的应用程序没有调用close()系统调用来响应。于是这个连接就一直挂在这里,占用着一个文件描述符。当泄漏的连接数达到ulimit -n设置的上限时,新的连接就无法建立了。

解决:确保连接资源被正确释放,使用try-with-resources(Ja va)或确保在finally块中关闭连接,不要依赖垃圾回收。

2. 场景二:TIME_WAIT过多——本地端口耗尽

症状:高并发压测一段时间后,新连接建立失败,报错“Cannot assign requested address”。

使用统计摘要命令:

ss -s

输出显示巨量的TIME_WAIT

Total: 65280
TCP:   62000 (estab 200, closed 61500, timewait 61200)

六万多个TIME_WAIT!系统默认的临时端口范围通常是32768~60999,只有两万多个可用端口,显然早已耗尽。

本质TIME_WAIT是TCP四次挥手中,主动关闭连接的一方会进入的正常状态。它会等待2倍的最大报文段生存时间(2MSL,通常为60秒),目的是让网络中可能残留的旧连接数据包彻底消散,防止干扰新连接。

在短连接高并发的场景下(例如使用HTTP/1.0且未启用Keep-Alive),会快速产生大量TIME_WAIT连接。

应对方案

  • 开启长连接:使用HTTP Keep-Alive,这是最根本的解决方案。
  • 启用tcp_tw_reuse:允许新的连接复用处于TIME_WAIT状态的端口(需谨慎,确保安全)。
    sysctl -w net.ipv4.tcp_tw_reuse=1
  • 扩大本地端口范围
    sysctl -w net.ipv4.ip_local_port_range="1024 65535"

3. 场景三:Recv-Q 不为零——accept 队列积压

症状:服务端CPU不高,但客户端频繁出现连接超时。

查看监听端口的队列情况:

ss -antp | grep LISTEN

输出显示Recv-Q已经达到了backlog的上限(这里是128):

State   Recv-Q  Send-Q  Local Address:Port
LISTEN  128     128     0.0.0.0:8080

LISTEN状态下,Recv-Q表示已完成三次握手、等待应用调用accept()取走的连接数。当这个值达到backlog上限时,内核会直接丢弃新的连接请求,客户端看到的就是连接超时。

这通常是因为应用处理连接的线程池太小,或者accept()之后的业务处理太慢,导致队列积压。

可以先调大backlog应急:

sysctl -w net.core.somaxconn=65535

但根本的解决方法是:扩大处理线程或协程池,或者对处理逻辑进行异步化改造,提升消费能力。

六、常用命令速查

# 查看所有 TCP 连接(推荐加 -n,速度快)
ss -antp

# 统计各状态连接数量
ss -ant | awk 'NR>1{print $1}' | sort | uniq -c | sort -rn

# 只看 CLOSE_WAIT(排查连接泄漏)
ss -antp state close-wait

# 只看 TIME_WAIT(排查端口耗尽)
ss -antp state time-wait

# 只看 ESTABLISHED(当前活跃连接)
ss -antp state established

# 查看某个端口的连接情况
ss -antp sport = :8080

# 查看连接到某个目标 IP 的连接
ss -antp dst 10.0.0.2

# 实时监控连接数变化(每秒刷新)
watch -n 1 'ss -s'

# 查看 LISTEN 状态的 Recv-Q(是否积压)
ss -antp | grep LISTEN

# 综合统计(类似 netstat -s)
ss -s

七、ss 和 netstat 常用参数对照

结论依然是:ss更快、更灵活,其state过滤功能是独有的,强烈建议切换到ss

八、和 strace 配合使用

有时候仅看连接状态还不够。例如,发现大量CLOSE_WAIT,但不确定具体是哪段代码没有关闭连接。这时可以配合strace

# 先用 ss 找到问题进程的 PID
ss -antp state close-wait | grep myapp

# 再用 strace 追踪这个进程的系统调用,观察 close(fd) 是否被调用
strace -p  -e trace=close,shutdown

ss展示的是连接状态的“结果”,strace展示的是系统调用的“过程”。两者配合,定位问题效率倍增。

九、写在最后

遇到网络问题,先别急着改配置、翻代码。记住这个“万能起手式”:

ss -ant | awk 'NR>1{print $1}' | sort | uniq -c | sort -rn

先跑一下这条命令,看看各个TCP状态的分布情况。80%的问题,到这里就已经有了明确的排查方向:

  • CLOSE_WAIT多 → 大概率是代码里连接没关,重点检查close()调用。
  • TIME_WAIT多 → 短连接太频繁,考虑启用长连接或调整内核参数。
  • LISTEN 状态的 Recv-Q > 0 → accept处理跟不上,需要扩容线程或调整backlog。

工具终究是手段,对TCP状态机原理的理解才是根本。知道每个状态代表什么,工具的输出在你眼里就不再是冰冷的字符串,而是一幅生动的网络连接拓扑图。

来源:https://www.51cto.com/article/842420.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

对Linux服务器四种级别入侵讲解
网络安全
对Linux服务器四种级别入侵讲解

随着Linux企业应用的扩展,有大量的网络服务器使用Linux操作系统。Linux服务器的安全性能受到越来越多的关注,这里根据Linux服务器受到攻击的深度以级别形式列出,并提出不同的解决方案。 简单来说,对Linux服务器的攻击,就是一种未经授权、旨在妨碍、损害甚至完全破坏其安全的行为。攻击的后果

热心网友
04.28
网络安全及网络安全评估的脆弱性分析
网络安全
网络安全及网络安全评估的脆弱性分析

一、网络安全 (一)网络安全的定义 提到网络安全,其实可以把它理解为一个多维度的“健康状态”。它关乎计算机网络系统中的硬件、数据、程序,确保它们不会因为无意或恶意的原因遭到破坏、篡改或泄露。换句话说,就是既要防止非授权访问,又要保障系统服务能可靠、连续地运行。 有意思的是,网络安全的具体内涵,往往取

热心网友
04.28
网络安全需要掌握哪些技能?网络安全怎么学?
网络安全
网络安全需要掌握哪些技能?网络安全怎么学?

网络安全工程师:核心技能与每日实战 数字化浪潮席卷之下,网络空间的安全防线变得前所未有的重要。无论对政府、企业还是个人用户而言,一次系统漏洞或数据泄露都可能造成难以估量的损失。正因如此,作为数字世界的“守门人”,网络安全工程师的角色正变得至关重要。今天,我们就来深入聊聊,要胜任这份工作,究竟需要打磨

热心网友
04.28
Web前端开发是做什么的?有什么用?
前端开发
Web前端开发是做什么的?有什么用?

Web前端开发是做什么的?有什么用? 一提到Web前端开发工程师,不少人可能觉得这是个特别新的行当。确实,别说在国内,即便放眼全球,这个职位真正受到重视也不过是近十年的事儿。它的诞生和发展,本身就带着浓厚的互联网时代印记。 说起来,前端开发的渊源可以追溯到更早的“网页制作”时代。那还是Web 1 0

热心网友
04.26
在Docker的容器之间设置网络设置网络通信的方法
系统平台
在Docker的容器之间设置网络设置网络通信的方法

你也许已经知道了,Docker 容器技术是现有的成熟虚拟化技术的一个替代方案 如今,Docker容器技术早已不是新鲜概念,它正逐步成为传统虚拟化方案的一个高效替代品。越来越多的企业将其应用于快速环境部署、简化基础设施配置以及实现多客户环境隔离等场景。当你真的打算在生产环境中用Docker容器来部署应

热心网友
04.22

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

iQOO 15T新机预约启动 延续Ultra系列旗舰设计风格
业界动态
iQOO 15T新机预约启动 延续Ultra系列旗舰设计风格

iQOO手机官方今日正式宣布,iQOO 15T已开启全渠道预约。随着预约启动,官方预热海报也首次揭示了新机的侧边轮廓设计。 关于这款新机的更多细节,此前已有数码博主提前剧透。据称,iQOO 15T将延续自家Ultra系列的设计语言,采用标志性的透明风格方形摄像头模组。更引人注目的是其屏幕配置——据爆

热心网友
05.16
美团外卖五折优惠直送寝室无需下楼
业界动态
美团外卖五折优惠直送寝室无需下楼

期末复习在图书馆熬到深夜,突然下起暴雨,裹紧羽绒服还得冒雨下楼拿外卖;军训结束累得只想瘫倒,宿管阿姨却把骑手拦在宿舍区外;想和室友凑单改善伙食,又被复杂的满减、助力规则搞得晕头转向……这大概是许多大学新生的共同经历,差点以为“冲刺取餐”成了宿舍生存的必备技能。其实,只要掌握正确方法,完全能省去这些奔

热心网友
05.16
三星家电退出中国市场 电视显示器等产品停售
业界动态
三星家电退出中国市场 电视显示器等产品停售

一则来自三星(中国)投资有限公司的业务调整通知,在今日引发了广泛关注。通知的核心内容相当明确:为应对急剧变化的市场环境,三星电子决定在中国大陆市场停止销售包括电视、显示器在内的所有家电产品。 这意味着,一个曾经在中国家电市场占据重要地位的品牌,其消费端的产品销售画上了句号。当然,市场更关心的是,存量

热心网友
05.16
一加16全能性能旗舰曝光 搭载骁龙8 Elite Gen6 Pro芯片
业界动态
一加16全能性能旗舰曝光 搭载骁龙8 Elite Gen6 Pro芯片

关于一加下一代旗舰手机一加 16 的最新爆料信息,近期引发了数码圈的广泛关注。知名数码博主 @数码闲聊站 最新透露了一款代号为 SM8975(即骁龙 8 Elite Gen6 Pro 平台)的子品牌新机细节,结合其暗示的表情符号,这款新机极有可能就是备受期待的一加 16。 根据最新的爆料信息,一加

热心网友
05.16
三星家电全面退出中国市场销售
业界动态
三星家电全面退出中国市场销售

三星电子的一则公告,在市场上激起了不小的波澜。根据其官方发布的消息,为应对当前急剧变化的市场环境,公司经过慎重评估,决定在中国大陆市场停止销售包括电视、显示器在内的所有家电产品。 图为三星电子发布的公告截图 这意味着,消费者未来将无法在官方渠道购买到三星品牌的电视、显示器等家用电器。不过,对于已经购

热心网友
05.16