当前位置: 首页 > news >正文

Linux netstat 命令深度解析:从网络连接到端口监控的完整实现

netstat 的核心价值

netstat的本质是读取内核网络栈信息。在 Linux 系统中,所有网络连接信息都存储在/proc文件系统:

# TCP 连接信息/proc/net/tcp /proc/net/tcp6# UDP 连接信息/proc/net/udp /proc/net/udp6# Unix 域套接字/proc/net/unix# 路由表/proc/net/route# 网络接口统计/proc/net/dev

netstat 命令其实就是这些文件的格式化输出工具。了解了这一点,很多输出字段就很好理解了。

常用参数深度解析

1.-tunlp参数组合

这是最常见的组合,每个字母都有特定含义:

netstat-tunlp
  • -t: 显示 TCP 连接
  • -u: 显示 UDP 连接
  • -n: 以数字形式显示地址和端口(不做 DNS 解析,快 10 倍以上)
  • -l: 只显示监听状态的套接字
  • -p: 显示进程 ID 和程序名(需要 root 权限)

输出示例:

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 5678/mysqld tcp6 0 0 :::443 :::* LISTEN 1234/nginx

2.-an参数组合

显示所有连接(包括已建立的):

netstat-an|grepESTABLISHED

输出字段详解:

Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 192.168.1.100:22 203.0.113.5:52341 ESTABLISHED
  • Recv-Q: 接收队列中等待应用读取的字节数(应该接近 0)
  • Send-Q: 发送队列中未收到 ACK 的字节数(高值可能是网络拥塞)
  • Local Address: 本地 IP:端口
  • Foreign Address: 远程 IP:端口
  • State: TCP 连接状态

3. TCP 状态详解

netstat最强大的功能之一是查看 TCP 状态:

netstat-ant|awk'{print $6}'|sort|uniq-c

输出示例:

12 CLOSE_WAIT 3 ESTABLISHED 45 TIME_WAIT 2 LISTEN

关键状态含义:

状态含义排查意义
LISTEN服务端等待连接正常监听状态
ESTABLISHED连接已建立活跃连接
TIME_WAIT主动关闭方等待 2MSL大量堆积可能导致端口耗尽
CLOSE_WAIT被动关闭方等待应用关闭大量堆积表示程序 bug
SYN_SENT主动发起连接大量值可能是 SYN Flood 攻击
FIN_WAIT1/2关闭握手进行中状态卡住可能是网络问题

实战案例:排查连接问题

案例 1:端口占用排查

# 查看端口 8080 的占用情况netstat-tunlp|grep:8080# 或者更精确的查找netstat-tunlp|awk'$4 ~ /:8080$/'

输出:

tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 12345/java

案例 2:TIME_WAIT 过多导致端口耗尽

# 统计 TIME_WAIT 数量netstat-ant|grepTIME_WAIT|wc-l# 如果超过几千,需要调整内核参数echo"net.ipv4.tcp_tw_reuse = 1">>/etc/sysctl.confecho"net.ipv4.tcp_max_tw_buckets = 5000">>/etc/sysctl.confsysctl-p

案例 3:CLOSE_WAIT 堆积问题

CLOSE_WAIT 堆积意味着对方关闭了连接,但本地程序没有调用close()

# 查看哪些程序产生了 CLOSE_WAITnetstat-antp|grepCLOSE_WAIT

这通常是程序 bug,需要检查代码中是否正确关闭了 socket。

案例 4:统计并发连接数

# 统计每个 IP 的连接数netstat-ant|grepESTABLISHED|awk'{print $5}'|cut-d:-f1|sort|uniq-c|sort-nr|head-10# 输出示例125192.168.1.1004510.0.0.512203.0.113.10

可以快速发现异常 IP(可能是 DDoS 攻击)。

性能优化:netstat vs ss

netstat读取/proc文件时会遍历所有 socket,在高并发服务器上性能较差:

# 性能对比(10万连接)timenetstat-ant|wc-l# 约 2-3 秒timess-ant|wc-l# 约 0.1 秒

ss命令直接读取内核 netlink socket,速度快 20 倍以上。但netstat在低并发场景下足够用,且输出更易读。

高级技巧:持续监控

1. 实时监控连接变化

# 每秒刷新一次watch-n1'netstat -ant | grep ESTABLISHED | wc -l'

2. 监控特定端口

# 监控 80 端口的连接变化watch-n1'netstat -ant | grep ":80 "'

3. 导出网络统计到 CSV

netstat-i|awk'NR>2 {print $1","$4","$5","$6","$7}'>network_stats.csv

Web 实现:浏览器端的"netstat"

浏览器无法直接访问系统网络栈,但可以通过 WebRTC 获取本地 IP:

asyncfunctiongetLocalIP():Promise<string[]>{returnnewPromise((resolve)=>{constips:string[]=[]constpc=newRTCPeerConnection({iceServers:[]})pc.createDataChannel('')pc.createOffer().then(offer=>pc.setLocalDescription(offer))pc.onicecandidate=(event)=>{if(!event?.candidate?.candidate)returnconstmatch=event.candidate.candidate.match(/(\d+\.\d+\.\d+\.\d+)/)if(match&&!ips.includes(match[1])){ips.push(match[1])}if(pc.connectionState==='closed'){resolve(ips)}}setTimeout(()=>{pc.close()resolve(ips)},1000)})}// 使用constlocalIPs=awaitgetLocalIP()console.log('Local IPs:',localIPs)// ['192.168.1.100', '10.0.0.5']

虽然功能有限,但展示了如何在前端获取网络信息。

常见陷阱

1. DNS 解析拖慢速度

# 慢:会做 DNS 反向解析netstat-a# 快:数字形式显示netstat-an

2.-p参数需要 root 权限

# 普通用户运行,PID/Program name 显示为空netstat-tunlp# 需要 sudosudonetstat-tunlp

3. 容器环境中的网络命名空间

Docker 容器有独立的网络命名空间,宿主机的netstat看不到容器内的连接:

# 进入容器的网络命名空间dockerexec<container_id>netstat-tunlp

netstat 在线工具

如果你想快速查看网络连接信息,可以试试 Linux netstat 命令查询,提供了命令详解和常用参数说明。

总结

netstat是网络诊断的基础工具,掌握它可以快速定位大部分网络问题。核心要点:

  1. 理解/proc文件系统是数据源
  2. 掌握-tunlp-an参数组合
  3. 熟悉 TCP 状态及其含义
  4. 高并发场景用ss替代
  5. 结合watch和管道实现持续监控

下次遇到网络连接问题时,不要只会pingtelnet,试试netstat,你会看到更多信息。


相关工具:端口检测器 | IP 地址查询

http://www.jsqmd.com/news/839486/

相关文章:

  • Linux桌面自动化终极指南:10个xdotool高效技巧快速上手
  • 不只是安装:用geemap和本地Jupyter Notebook玩转GEE数据可视化与快速分析
  • AionUi:专为AI应用设计的现代化前端组件库实战指南
  • 【零基础部署】Docker + AnythingLLM 搭建私有知识库保姆级教程
  • 粒子系统与Canvas 2D实现动态喷漆轨迹生成
  • I2C总线设计实战:从物理层到协议层,解决多设备挂载与信号完整性问题
  • 构建Telegram与私有AI模型桥接器:从原理到工程实践
  • 倒置荧光显微镜生产厂家有哪些 - 实了个验
  • 终极AMD Ryzen硬件调试指南:5分钟掌握SMU Debug Tool实战技巧
  • 用C++和Eigen库手把手实现UR3机械臂逆解(附完整代码与避坑指南)
  • 图片换背景在线制作怎么操作?一文解析2026年最好用的免费工具
  • 2026 年 5 月最新天津离婚律所测评,坚守抚养权底线 - 速递信息
  • d2s-editor:暗黑破坏神2存档编辑器的现代化Web解决方案
  • 深入解析Noah-MP陆面模型:从科学原理到实战部署
  • 基于Next.js与AI辅助开发:构建现代化个人作品集实战指南
  • Ever® Demand™生产环境部署:Docker、PM2与AWS最佳实践
  • PTAOOP前三次作业分析与总结
  • 基于n8n的LinkedIn自动化求职工作流:从原理到实战部署
  • IDEA 2024.1 新特性实战:如何让Java开发效率翻倍?
  • Linux环境变量与env命令:从核心原理到高级实战应用
  • ASO技能库构建指南:从基础原理到实战应用
  • 如何利用MATLAB人形机器人库解决双足平衡控制难题
  • 【ChatGPT SWOT分析黄金模板】:20年AI战略顾问亲授——5步生成高信效度SWOT报告(附可落地Prompt库)
  • 【算法】小白也能懂 · 第 10 节:二叉树基础与遍历
  • 告别单调终端:250+ Xshell配色方案让你的命令行焕然一新
  • DESIGN.md,让AI设计不跑偏
  • Windows HEIC缩略图插件:解决iPhone照片预览难题的智能方案
  • 半导体IPO热潮:低营收高专利企业如何重塑资本估值与技术壁垒
  • Sendwithus模板与现代邮件客户端兼容性测试:终极解决方案
  • Dism++:Windows系统维护的终极指南,从新手到专家一站式掌握