
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/devnetstat 命令其实就是这些文件的格式化输出工具。了解了这一点很多输出字段就很好理解了。常用参数深度解析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/nginx2.-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 ESTABLISHEDRecv-Q: 接收队列中等待应用读取的字节数应该接近 0Send-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被动关闭方等待应用关闭大量堆积表示程序 bugSYN_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案例 2TIME_WAIT 过多导致端口耗尽# 统计 TIME_WAIT 数量netstat-ant|grepTIME_WAIT|wc-l# 如果超过几千需要调整内核参数echonet.ipv4.tcp_tw_reuse 1/etc/sysctl.confechonet.ipv4.tcp_max_tw_buckets 5000/etc/sysctl.confsysctl-p案例 3CLOSE_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 ssnetstat读取/proc文件时会遍历所有 socket在高并发服务器上性能较差# 性能对比10万连接timenetstat-ant|wc-l# 约 2-3 秒timess-ant|wc-l# 约 0.1 秒ss命令直接读取内核 netlink socket速度快 20 倍以上。但netstat在低并发场景下足够用且输出更易读。高级技巧持续监控1. 实时监控连接变化# 每秒刷新一次watch-n1netstat -ant | grep ESTABLISHED | wc -l2. 监控特定端口# 监控 80 端口的连接变化watch-n1netstat -ant | grep :80 3. 导出网络统计到 CSVnetstat-i|awkNR2 {print $1,$4,$5,$6,$7}network_stats.csvWeb 实现浏览器端的netstat浏览器无法直接访问系统网络栈但可以通过 WebRTC 获取本地 IPasyncfunctiongetLocalIP():Promisestring[]{returnnewPromise((resolve){constips:string[][]constpcnewRTCPeerConnection({iceServers:[]})pc.createDataChannel()pc.createOffer().then(offerpc.setLocalDescription(offer))pc.onicecandidate(event){if(!event?.candidate?.candidate)returnconstmatchevent.candidate.candidate.match(/(\d\.\d\.\d\.\d)/)if(match!ips.includes(match[1])){ips.push(match[1])}if(pc.connectionStateclosed){resolve(ips)}}setTimeout((){pc.close()resolve(ips)},1000)})}// 使用constlocalIPsawaitgetLocalIP()console.log(Local IPs:,localIPs)// [192.168.1.100, 10.0.0.5]虽然功能有限但展示了如何在前端获取网络信息。常见陷阱1. DNS 解析拖慢速度# 慢会做 DNS 反向解析netstat-a# 快数字形式显示netstat-an2.-p参数需要 root 权限# 普通用户运行PID/Program name 显示为空netstat-tunlp# 需要 sudosudonetstat-tunlp3. 容器环境中的网络命名空间Docker 容器有独立的网络命名空间宿主机的netstat看不到容器内的连接# 进入容器的网络命名空间dockerexeccontainer_idnetstat-tunlpnetstat 在线工具如果你想快速查看网络连接信息可以试试 Linux netstat 命令查询提供了命令详解和常用参数说明。总结netstat是网络诊断的基础工具掌握它可以快速定位大部分网络问题。核心要点理解/proc文件系统是数据源掌握-tunlp和-an参数组合熟悉 TCP 状态及其含义高并发场景用ss替代结合watch和管道实现持续监控下次遇到网络连接问题时不要只会ping和telnet试试netstat你会看到更多信息。相关工具端口检测器 | IP 地址查询