netstat —— 网络连接/端口/路由统计(传统工具,ss 的替代对象)
这个工具是做什么的
老牌网络排查工具:看监听端口、连接状态(ESTABLISHED/TIME_WAIT 等)、路由表、接口统计、ARP。由于走 /proc/net/tcp 解析,大连接数下明显慢,社区已普遍转向 ss;但 netstat 的 -rn(路由)、-i(接口统计)在部分场景仍有存在价值,且很多脚本仍在用,必须能读懂。
可以回答什么问题
| 问题 | 怎么用 |
|---|---|
| 哪些端口在监听?被哪个进程占用? | netstat -tlnp |
| 有多少连接、各状态分布? | netstat -tan(TCP 全状态);配合 awk 统计状态数 |
| 哪个进程占用了端口? | netstat -tlnp 的 PID/Program name 列 |
| 路由表怎么走? | netstat -rn |
| 网卡收发统计/丢包? | netstat -i / netstat -s(协议统计) |
数据来源
- 来源文件:连接状态/端口取自
/proc/net/tcp、/proc/net/tcp6、/proc/net/udp;路由取自/proc/net/route;接口统计取自/proc/net/dev;进程映射通过 inode 反查/proc/*/fd。 - 采集方式:解析内核导出的连接表快照,按需聚合。
- 由此决定的特性:大连接数下非常慢(纯用户态字符串解析,连接上万后
netstat -t可能耗时数秒)——这正是ss用 netlink 直读内核 socket 表、秒级出结果的原因;高频/大规模场景请用ss。
一、常用命令
bash
netstat -tlnp # 监听端口 + 进程(-t TCP -l 监听 -n 数字 -p 进程)
netstat -tan # 全部 TCP 连接(含状态列)
netstat -tunap # TCP+UDP 全部连接 + 进程
netstat -rn # 路由表(= route -n)
netstat -i # 网卡收发统计(rx/tx 包、错误、丢弃)
netstat -s # 协议级统计(TCP 重传/丢包等,能看 TCP 层问题)
netstat -t 1 # 每秒刷新(类似 ss -t 1)二、输出与状态
bash
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 1.2.3.4:443 5.6.7.8:54321 ESTABLISHED 5678/echo-server
tcp 123456 0 1.2.3.4:443 9.9.9.9:12345 ESTABLISHED 5678/echo-server| 列/状态 | 含义 | 判读 |
|---|---|---|
Recv-Q | 接收队列字节数 | 持续大 = 应用没读(背压) |
Send-Q | 发送队列字节数 | 持续大 = 对端不读/网络拥塞 |
LISTEN | 监听中 | 端口是否开放 |
ESTABLISHED | 已建立连接 | 正常状态 |
TIME_WAIT | 主动关闭方等待 2MSL | 短连接风暴时海量堆积 |
SYN_SENT | 发起连接等待应答 | 大量 = 连接建不起来(对端/网络问题) |
FIN_WAIT2 | 等对端关闭 | 对端不关则堆积 |
⚠️ 优先用 ss:连接数多时
netstat慢到不可用,ss -tan秒级返回同款信息。netstat 保留的价值主要是-rn/-i/-s。
一句话总结:netstat 是看端口/连接/路由的老牌工具,但大连接下性能差,已被 ss 替代——记熟
-tlnp/-tan会读状态,新场景直接用ss。