为什么要关心端口号?
- 端口是传输层的"门牌号" ,应用进程通过它来收发数据。
- 当电脑运行多个应用时,端口帮助操作系统区分"这份数据应该交给哪个应用"。
- 所以,如果你知道某个应用的端口号,就能追踪它的网络行为;反之,如果你知道某个端口,就能查到对应的应用。
查看端口号(从端口 → 应用)
📍 常见操作系统方法:
1. Windows
-
命令行方式
netstat -ano
-
-a
显示所有连接和监听端口-n
数字形式显示地址和端口-o
显示 PID(进程号)
结果类似:
yaml
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 1234
表示 进程 PID=1234 占用了 80 端口。
- 进一步找到应用名
yaml
tasklist | findstr 1234
就能查出是哪个应用占用了端口。
2. Linux / macOS
-
netstat 命令
netstat -tunlp
-
-t
TCP-u
UDP-n
数字显示-l
监听中的端口-p
显示进程 PID 和程序名
-
ss 命令(更现代)
ss -tunlp
输出会告诉你某个端口对应的进程。
已知应用查对应端口(从应用 → 端口)
1. 在 Windows
- 方法一:
netstat
+ PID
arduino
netstat -ano | findstr "LISTENING"
-
-a
显示所有连接和监听端口-n
用数字显示地址和端口号-o
显示对应的进程 PID- 然后通过 任务管理器 或
xml
tasklist | findstr <PID>
就能知道哪个应用开了哪些端口。
- 方法二:PowerShell 更直观
vbnet
Get-Process -Id (Get-NetTCPConnection | Where-Object { $_.State -eq "Listen" }).OwningProcess
直接列出监听端口的进程。
2. 在 Linux / macOS
- 方法一:
lsof
css
lsof -i -P -n | grep LISTEN
-
-i
网络相关-P
显示端口号而不是服务名-n
不解析域名(更快)- 输出结果会显示:应用 → 协议 → 端口。
-
方法二:
netstat
netstat -tulnp
-
-t
TCP-u
UDP-l
listening-n
数字显示-p
显示进程名/ID。
-
方法三:
ss
(更现代,替代 netstat)ss -tulnp
3. 直观比喻
- 房子(机器) :计算机
- 房间(应用) :进程
- 门(端口) :对外开放的入口
- 想知道某个房间开了哪些门,就去查这间房间对应的"门牌号"。
🛠 举例
比如你运行了一个 本地 Node.js 服务,想查它监听的端口:
perl
ps -ef | grep node
# 假设得到 PID=12345
lsof -i -P -n | grep 12345
结果可能显示:
sql
node 12345 user TCP 0.0.0.0:3000 (LISTEN)
说明这个 Node 应用监听了 3000 端口。
常见应用与端口的映射
协议/应用 | 默认端口 |
---|---|
HTTP | 80 |
HTTPS | 443 |
FTP | 21 |
SSH | 22 |
MySQL | 3306 |
Redis | 6379 |
PostgreSQL | 5432 |
WebSocket | 一般跟 HTTP/HTTPS 一致(80/443) |
本地开发(Node.js、Vue、React 等) | 常见 3000, 5173, 8080 等 |
结合 TCP/IP 模型看待
- 应用层:具体应用(浏览器、数据库、游戏客户端)
- 传输层:应用占用某个端口(80, 443, 3306...),TCP/UDP 负责传输
- 网络层:IP 地址负责找到主机
- 链路层:MAC 地址负责找到网卡
所以:应用 = 进程 ↔ 端口号 ↔ 网络连接 。
端口号就是把 操作系统中的进程 和 网络层的通信 绑在一起的关键。