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