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 参数组合
这是最常见的组合,每个字母都有特定含义:
-t-u-n: 以数字形式显示地址和端口(不做 DNS 解析,快 10 倍以上)-l-p: 显示进程 ID 和程序名(需要 root 权限)
输出示例:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginxtcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 5678/mysqldtcp6 0 0 :::443 :::* LISTEN 1234/nginx
2. -an 参数组合
显示所有连接(包括已建立的):
netstat -an | grep ESTABLISHED
输出字段详解:
Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 192.168.1.100:22 203.0.113.5:52341 ESTABLISHED
- Recv-Q: 接收队列中等待应用读取的字节数(应该接近 0)
- Send-Q: 发送队列中未收到 ACK 的字节数(高值可能是网络拥塞)
- Local Address
- Foreign Address
- State
3. TCP 状态详解
netstat 最强大的功能之一是查看 TCP 状态:
netstat -ant | awk '{print 4 ~ /:80805}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10# 输出示例 125 192.168.1.100 45 10.0.0.5 12 203.0.113.10
可以快速发现异常 IP(可能是 DDoS 攻击)。
性能优化:netstat vs ss
netstat 读取 /proc 文件时会遍历所有 socket,在高并发服务器上性能较差:
# 性能对比(10万连接)time netstat -ant | wc -l # 约 2-3 秒time ss -ant | wc -l # 约 0.1 秒
ss 命令直接读取内核 netlink socket,速度快 20 倍以上。但 netstat 在低并发场景下足够用,且输出更易读。
高级技巧:持续监控
1. 实时监控连接变化
# 每秒刷新一次watch -n 1 'netstat -ant | grep ESTABLISHED | wc -l'
2. 监控特定端口
# 监控 80 端口的连接变化watch -n 1 'netstat -ant | grep ":80 "'
3. 导出网络统计到 CSV
netstat -i | awk 'NR>2 {print $1","$4","$5","$6","$7}' > network_stats.csv
Web 实现:浏览器端的"netstat"
浏览器无法直接访问系统网络栈,但可以通过 WebRTC 获取本地 IP:
async function getLocalIP(): Promise<string[]> { return new Promise((resolve) => { const ips: string[] = [] const pc = new RTCPeerConnection({ iceServers: [] }) pc.createDataChannel('') pc.createOffer().then(offer => pc.setLocalDescription(offer)) pc.onicecandidate = (event) => { if (!event?.candidate?.candidate) return const match = 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) })}// 使用const localIPs = await getLocalIP()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# 需要 sudosudo netstat -tunlp
3. 容器环境中的网络命名空间
Docker 容器有独立的网络命名空间,宿主机的 netstat 看不到容器内的连接:
# 进入容器的网络命名空间docker exec <container_id> netstat -tunlp
netstat 在线工具
如果你想快速查看网络连接信息,可以试试 Linux netstat 命令查询,提供了命令详解和常用参数说明。
总结
netstat 是网络诊断的基础工具,掌握它可以快速定位大部分网络问题。核心要点:
下次遇到网络连接问题时,不要只会 ping 和 telnet,试试 netstat,你会看到更多信息。
相关工具:端口检测器 | IP 地址查询