理解网络中的“监听端口”:从 netstat 输出说起
在学习后端、Redis、MySQL、SkyWalking、Spring Boot 这些东西的时候经常会看到一个词某某程序正在监听某个端口。比如我们在 Windows PowerShell 里执行netstat-ano|findstr11800可能会看到类似结果TCP 0.0.0.0:11800 0.0.0.0:0 LISTENING 55728 TCP 127.0.0.1:10021 127.0.0.1:11800 ESTABLISHED 39776 TCP 127.0.0.1:11800 127.0.0.1:10021 ESTABLISHED 55728 TCP 127.0.0.1:10296 127.0.0.1:11800 TIME_WAIT 0 TCP [::]:11800 [::]:0 LISTENING 55728这篇文章就用最通俗的方式讲清楚什么叫监听端口为什么程序要监听端口LISTENING、ESTABLISHED、TIME_WAIT分别是什么意思0.0.0.0、127.0.0.1、PID 又是什么意思一、什么叫端口我们先从 IP 和端口说起。一台电脑在网络中通常会有一个地址这个地址就是 IP。例如192.168.1.10但是一台电脑上可能同时运行很多网络程序比如MySQL 3306 Redis 6379 Spring Boot 8080 Elasticsearch 9200 Kibana 5601 SkyWalking 11800 / 12800问题来了别人访问你这台电脑的时候操作系统怎么知道这个请求应该交给哪个程序答案就是端口号。可以这样理解IP 地址找到哪台电脑 端口号找到这台电脑上的哪个程序比如127.0.0.1:8080意思就是访问本机的 8080 端口如果 8080 端口上运行的是 Spring Boot那么这个请求就会交给 Spring Boot 处理。二、什么叫“监听端口”监听某个端口可以理解成一个程序提前占住了某个端口并且等待别人来连接它。举个生活中的例子。假设你的电脑是一栋大楼电脑 IP 大楼地址 端口号 房间号 程序 房间里的工作人员如果 Spring Boot 监听了 8080 端口就相当于Spring Boot 在 8080 这个房间开门营业等别人来访问。如果 MySQL 监听了 3306 端口就相当于MySQL 在 3306 这个房间开门营业等客户端连接数据库。所以监听端口不是在听声音而是程序告诉操作系统这个端口归我了有连接进来就交给我处理。三、以 Spring Boot 为例理解监听我们启动一个 Spring Boot 项目的时候经常会看到控制台输出Tomcat started on port 8080这句话的意思就是Spring Boot 内置的 Tomcat 已经监听了 8080 端口。然后我们在浏览器访问http://localhost:8080浏览器会向本机的 8080 端口发起连接。如果 Spring Boot 正在监听 8080浏览器就能成功访问。如果没有任何程序监听 8080浏览器就会访问失败常见错误是Connection refused也就是连接被拒绝因为这个端口没人开门。四、结合 netstat 输出分析再看这行TCP 0.0.0.0:11800 0.0.0.0:0 LISTENING 55728这一行可以拆开理解TCP 使用的是 TCP 协议 0.0.0.0:11800 本机正在监听 11800 端口 0.0.0.0:0 当前还没有具体的远程连接 LISTENING 正在监听 55728 监听这个端口的进程 PID翻译成人话就是PID 为 55728 的程序正在监听 11800 端口等待别人连接。如果你的环境里正在启动 SkyWalking那么这个端口很可能是 SkyWalking OAP 的端口。SkyWalking 常见端口是11800Agent 上报链路追踪数据的 gRPC 端口 12800HTTP 查询接口SkyWalking UI 会访问它五、0.0.0.0 是什么意思你可能会看到0.0.0.0:11800这个不是一个普通的具体 IP而是表示监听本机所有 IPv4 网卡地址。也就是说这个程序不是只监听本机地址而是监听所有网络入口。假设你的电脑有这些地址127.0.0.1 192.168.1.10 10.10.20.30如果程序监听的是0.0.0.0:11800那么理论上别人可以通过下面这些方式访问它127.0.0.1:11800 192.168.1.10:11800 10.10.20.30:11800当然能不能真正访问还要看防火墙、安全组、网络环境等因素。六、127.0.0.1 是什么意思再看这两行TCP 127.0.0.1:10021 127.0.0.1:11800 ESTABLISHED 39776 TCP 127.0.0.1:11800 127.0.0.1:10021 ESTABLISHED 55728这里的127.0.0.1表示本机回环地址也叫 localhost。简单说就是自己访问自己比如浏览器访问http://127.0.0.1:8080就表示浏览器在访问自己电脑上的 8080 端口。所以这两行的意思是PID 39776 这个进程通过本机临时端口 10021连接到了 11800。 PID 55728 这个进程在 11800 上接收了这个连接。这两行其实是一组连接的两端。七、什么是 ESTABLISHEDESTABLISHED表示连接已经建立成功双方正在通信或者连接处于可通信状态。比如TCP 127.0.0.1:10021 127.0.0.1:11800 ESTABLISHED 39776可以理解为客户端已经成功连上了服务端。在网络通信里一般有两种角色服务端监听端口等待别人连接 客户端主动连接服务端例如Spring Boot监听 8080是服务端 浏览器访问 8080是客户端再比如SkyWalking OAP监听 11800是服务端 Java Agent连接 11800是客户端八、什么是 TIME_WAIT你还可能看到TCP 127.0.0.1:10296 127.0.0.1:11800 TIME_WAIT 0TIME_WAIT表示这个连接已经关闭了但是操作系统还暂时保留一段时间。为什么连接都关闭了还要保留可以简单理解为防止网络中残留的旧数据包影响后面的新连接。这是 TCP 协议的正常机制不是报错。所以看到少量TIME_WAIT不用紧张。它只是说明之前有客户端连接过 11800现在连接已经结束。九、PID 是什么在 netstat 输出最后一列可以看到数字55728 39776 22796这些数字叫 PID也就是进程 ID。每个正在运行的程序在操作系统里都会有一个 PID。比如PID 55728可能是 SkyWalking OAP PID 39776可能是 Java Agent、浏览器、UI 或其他客户端程序我们可以通过下面的命令查看 PID 对应的进程tasklist|findstr55728或者Get-Process-Id 55728如果你想知道是谁占用了某个端口就可以先用netstat-ano|findstr端口号然后再用tasklist|findstrPID这样就能定位到具体程序。十、完整理解这段输出假设我们看到TCP 0.0.0.0:11800 0.0.0.0:0 LISTENING 55728 TCP 127.0.0.1:10021 127.0.0.1:11800 ESTABLISHED 39776 TCP 127.0.0.1:11800 127.0.0.1:10021 ESTABLISHED 55728 TCP 127.0.0.1:10296 127.0.0.1:11800 TIME_WAIT 0 TCP [::]:11800 [::]:0 LISTENING 55728可以翻译成PID 为 55728 的程序正在监听 11800 端口。 有一个本机程序 PID 39776 正在连接它。 双方连接已经建立成功。 之前还有一些连接访问过 11800现在已经关闭处于 TIME_WAIT 状态。如果还有TCP 0.0.0.0:12800 0.0.0.0:0 LISTENING 55728 TCP 127.0.0.1:12800 127.0.0.1:15155 ESTABLISHED 55728 TCP 127.0.0.1:15155 127.0.0.1:12800 ESTABLISHED 22796说明同一个 PID55728 的程序也在监听 12800 端口。 PID22796 的程序正在连接它的 12800 端口。十一、一句话总结监听端口 程序提前占住一个端口等待别人通过这个端口来连接它。可以这样记IP 地址找到哪台电脑 端口号找到电脑上的哪个程序 监听端口程序开门营业等别人连接 ESTABLISHED连接已经建立 TIME_WAIT连接刚关闭系统暂时保留 PID这个端口属于哪个进程再简单一点程序监听端口就像开了一个门。 端口号就是门牌号。 别人想找这个程序就访问 IP:端口。例如127.0.0.1:11800意思就是在我自己电脑上找正在监听 11800 端口的那个程序。理解了“监听端口”这个概念之后再看 Spring Boot、Redis、MySQL、SkyWalking、Kibana 这些服务启动时的端口信息就会清楚很多。