netstat是绝大多数Linux与Windows系统自带的网络状态查看命令,全称为network statistics。它的核心能力是读取系统内核维护的网络栈信息,把当前主机的网络连接、路由表、接口统计、端口监听等情况以文本形式展示出来。对于开发与运维人员来说,不需要安装额外软件就能知道某台机器上哪些端口被占用、哪些服务建立了外部通信,是排查网络故障的第一步。

一、netstat能做什么
netstat最基本的作用是列出系统中所有的网络端点。端点分为两类:一类是处于监听状态的端口,也就是服务进程绑定并等待连接的地址;另一类是已经建立的连接,包含本地IP端口与对端IP端口。通过这些信息,我们可以确认Web服务是否真的在80端口监听,或者数据库是否只绑定了回环地址导致外部无法访问。
除了连接与监听,netstat还能显示路由表(使用-r参数)和网络接口统计(使用-i参数)。路由表告诉我们数据包发往某个网段时会走哪个网关;接口统计则能看出网卡是否有丢包或错误计数。虽然现代环境常用ip命令替代部分功能,但netstat在快速浏览全局网络关系时依然直观高效。
二、常用参数与含义
实际使用中,以下几个参数组合最常见:-t表示TCP协议,-u表示UDP协议,-l表示仅显示监听端口,-n表示以数字形式显示地址和端口而不做域名反查,-p表示显示所属进程信息。把这些都拼起来就是netstat -tulnp,一条命令看清所有监听中的服务及对应程序。
如果不加-n,netstat会尝试把IP反解成主机名、把端口转成服务名,这在DNS异常时会导致命令卡顿数秒。因此在脚本或排障时建议始终带上-n。另外-a代表所有连接,包含已建立和非监听状态,适合看全量连接数是否过多。
# 查看所有监听中的TCP/UDP端口及进程 netstat -tulnp # 查看某特定端口是否被占用,例如8080 netstat -tulnp | grep 8080 # 查看当前所有TCP连接(含外部已建立) netstat -tn
三、用netstat排查端口被占
启动一个Java或Node服务时,若报出“Address already in use”,说明目标端口已被其他进程绑定。此时运行netstat -tulnp | grep 端口号,输出行的最后一列会显示进程名与PID。拿到PID后,可以用kill -9 PID释放端口,或者修改自己服务的配置文件换端口。
有时服务明明起来了,但外部访问不通。用netstat一看,发现监听地址是127.0.0.1:8080而非0.0.0.0:8080,这就意味着只接受本机请求。这种绑定差异在Spring Boot或Nginx配置错误时很常见,netstat能立刻暴露问题,比盲目改防火墙更精准。
# 假设8080被占用,查找占用者 netstat -tulnp | grep 8080 # 输出示例:tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1234/java # 结束该进程 kill -9 1234
四、观察异常连接
当服务器出现流量异常或CPU偏高,可以用netstat -tn看已建立的TCP连接。如果某个陌生IP反复出现且连接数极多,可能是爬虫或攻击。配合wc -l统计行数,能快速评估连接规模。
需要注意的是,netstat统计的是瞬时快照,高并发下连接状态变化很快。若要做持续监控,应结合watch -n 1 netstat -tn或改用ss命令。但理解netstat的输出字段(如ESTABLISHED、TIME_WAIT)仍是网络排障的基本功。
| 参数 | 作用 |
|---|---|
| -t | 显示TCP相关连接 |
| -u | 显示UDP相关连接 |
| -l | 仅列出监听状态的端口 |
| -n | 用数字显示地址端口,不反查名称 |
| -p | 显示进程名与PID |
五、netstat与ss的区别
在较新的Linux发行版中,iproute2套件提供了ss命令,它直接从内核获取信息,速度比netstat更快,尤其在连接数上万时差异明显。不过netstat输出格式对人类更友好,且几乎所有老系统都预装。初学者先掌握netstat,再迁移到ss不会有什么成本。
无论使用哪个工具,核心思路不变:先确认监听、再确认连接、最后关联进程。只要形成这个排查链条,大部分网络不通、端口冲突的问题都能在几分钟内定位。netstat作为经典命令,依然值得放进每个人的常用手册里。