理解网络中的“监听端口”:从 netstat 输出说起
在学习后端、Redis、MySQL、SkyWalking、Spring Boot 这些东西的时候,经常会看到一个词:
某某程序正在监听某个端口。
比如我们在 Windows PowerShell 里执行:
netstat-ano|findstr"11800"可能会看到类似结果:
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 常见端口是:
11800:Agent 上报链路追踪数据的 gRPC 端口 12800:HTTP 查询接口,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 上接收了这个连接。这两行其实是一组连接的两端。
七、什么是 ESTABLISHED?
ESTABLISHED表示:
连接已经建立成功,双方正在通信,或者连接处于可通信状态。
比如:
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|findstr"55728"或者:
Get-Process-Id 55728如果你想知道是谁占用了某个端口,就可以先用:
netstat-ano|findstr"端口号"然后再用:
tasklist|findstr"PID"这样就能定位到具体程序。
十、完整理解这段输出
假设我们看到:
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说明:
同一个 PID=55728 的程序,也在监听 12800 端口。 PID=22796 的程序正在连接它的 12800 端口。十一、一句话总结
监听端口 = 程序提前占住一个端口,等待别人通过这个端口来连接它。
可以这样记:
IP 地址:找到哪台电脑 端口号:找到电脑上的哪个程序 监听端口:程序开门营业,等别人连接 ESTABLISHED:连接已经建立 TIME_WAIT:连接刚关闭,系统暂时保留 PID:这个端口属于哪个进程再简单一点:
程序监听端口,就像开了一个门。 端口号就是门牌号。 别人想找这个程序,就访问 IP:端口。例如:
127.0.0.1:11800意思就是:
在我自己电脑上,找正在监听 11800 端口的那个程序。理解了“监听端口”这个概念之后,再看 Spring Boot、Redis、MySQL、SkyWalking、Kibana 这些服务启动时的端口信息,就会清楚很多。
