面试被问「怎么确认服务在监听」,脱口而出 netstat -an。面完回头想,其实那几列 State 值我一直没真正搞明白,比如 LISTENING 和 ESTABLISHED 什么时候切换。
这两个参数合起来干了什么
-a 显示所有连接和监听端口,-n 不做域名解析,直接显示 IP 和端口号。合起来 netstat -an 又快又不卡,因为省掉了反查 DNS 的等待。不加 -n 时机器多,命令能卡十几秒。
几列的含义
- Proto:TCP 还是 UDP,UDP 没有连接状态那几列。
- Local Address:本机地址加端口,0.0.0.0:80 表示监听所有网卡。
- Foreign Address:对端地址,LISTENING 状态这里是 0.0.0.0:*。
- State:连接状态,LISTENING、ESTABLISHED、TIME_WAIT 最常见。
TIME_WAIT 一堆是正常的
主动关闭的一方会进入 TIME_WAIT,持续 2MSL 大约 60 秒。压测时看到几千个别慌,真正要担心的是端口耗尽。CLOSE_WAIT 居高不下才是代码没关连接,去查连接池和 finally 里的 close。
一个过滤小技巧
Windows 下 netstat -ano 能带出 PID,配合 tasklist 找进程:netstat -ano | findstr :8080 看谁占了端口。Linux 换成 netstat -anp | grep 8080,看不到进程名就加 sudo。
新系统更推荐 ss 和 lsof,netstat 在几万连接时会明显变慢。但老服务器和网上老教程里都是它,读懂输出能少走很多弯路。