常见端口号与协议对应关系
你有没有想过:当你在浏览器输入 www.example.com:8080 时,这个 :8080 到底是什么?
端口号是计算机网络中最容易被忽视,却无处不在的存在。它就像一栋大楼的房间号——IP 地址告诉你到了哪栋楼,端口号告诉你进哪个房间。
端口号的本质
端口号是一个 16 位的数字,范围是 0 到 65535(2^16 - 1)。
为什么是 65535?这要追溯到 TCP/IP 协议的设计——TCP 和 UDP 的头部都有一个 16 位的字段来存储端口号。
0 - 1023 :系统端口(well-known ports),需要管理员权限才能绑定
1024 - 49151 :注册端口(registered ports),分配给特定服务
49152 - 65535 :动态端口(dynamic ports),客户端随机使用简单说:
- 0 是保留的,不使用
- 1-1023 是「官方认证」的房间,比如 80 是 HTTP,443 是 HTTPS,没有特殊身份休想抢
- 1024-49151 是「付费租用」的房间,比如 3306 是 MySQL,6379 是 Redis
- 49152-65535 是「临时工位」,客户端发起连接时系统随机分配,用完就释放
经典端口号一览
HTTP/HTTPS:Web 的大门
端口 80 :HTTP 明文传输
端口 443 :HTTPS 加密传输
端口 8443:有时用作 HTTPS 的非标准端口(比如 Tomcat 默认)你访问 http://www.example.com 时,浏览器默认找 80 端口;访问 https://www.example.com 时,默认找 443 端口。
数据库:数据的仓库
端口 3306 :MySQL
端口 5432 :PostgreSQL
端口 1433 :SQL Server
端口 27017 :MongoDB
端口 6379 :Redis
端口 9042 :Cassandra为什么 Redis 用 6379?这要追溯到电信系统。6379 是手机号段的一个号码,Redis 作者 Antirez 的一个女性朋友在意大利电信工作,这个号码就是她挑的。
中间件与消息队列
端口 2181 :Zookeeper
端口 9092 :Kafka(PLAINTEXT)
端口 9093 :Kafka(SSL)
端口 5672 :RabbitMQ(AMQP)
端口 15672 :RabbitMQ(Management UI)
端口 8080 :常用作 Tomcat、Resin 等应用服务器的非特权端口
端口 8081 :常用作备用 HTTP 端口远程访问与运维
端口 22 :SSH(Secure Shell)
端口 23 :Telnet(明文传输,已废弃)
端口 3389:Windows 远程桌面(RDP)
端口 5900:VNC
端口 873 :RsyncSSH 替代 Telnet 是因为安全。Telnet 传输的用户名和密码是明文的,别人截获网络包就能看到;SSH 全部加密。
邮件服务
端口 25 :SMTP(邮件发送),邮件服务器之间通信
端口 465 :SMTPS(SMTP over SSL)
端口 587 :SMTP(提交端口),客户端到邮件服务器
端口 110 :POP3(邮件接收,明文)
端口 995 :POP3S(POP3 over SSL)
端口 143 :IMAP(邮件接收,明文)
端口 993 :IMAPS(IMAP over SSL)文件传输
端口 20 :FTP 数据传输(主动模式)
端口 21 :FTP 控制命令
端口 69 :TFTP(简单文件传输,无认证)
端口 2049:NFS(Network File System)
端口 445 :SMB(Windows 文件共享)容器与集群
端口 2375:Docker API(明文)
端口 2376:Docker API(TLS)
端口 6443:Kubernetes API Server
端口 10250:Kubelet API
端口 2379:Etcd 客户端通信
端口 2380:Etcd 节点间通信注册端口:常见的「租户」
端口 1080:SOCKS 代理
端口 1110:NFS 相关的 RPC 服务
端口 2049:NFS 服务
端口 3306:MySQL
端口 5000:Flask 开发服务器
端口 5432:PostgreSQL
端口 5672:RabbitMQ
端口 6379:Redis
端口 8080:通用 HTTP 替代端口
端口 9000:PHP-FPM、SonarQube、Pinpoint
端口 9090:Prometheus、Swagger UI
端口 9200:Elasticsearch
端口 9300:Elasticsearch 节点通信
端口 27017:MongoDB查看端口占用
Linux/Mac 查看端口占用:
bash
# 查看所有监听端口
netstat -tuln
# 查看特定端口
lsof -i :8080
ss -tuln | grep :80
# 查看端口被哪个进程占用
lsof -i :3306Windows 查看端口占用:
powershell
# 查看所有端口
netstat -ano
# 查看特定端口
netstat -ano | findstr :8080
# 根据 PID 查找进程
tasklist | findstr <PID>端口扫描与安全
面试中常问的一个问题:端口扫描是什么原理?
端口扫描本质上就是「敲门」——向目标 IP 的各个端口发送连接请求,根据响应判断端口状态。
开放端口 :收到 SYN+ACK 响应
关闭端口 :收到 RST 响应
过滤/防火墙 :无响应或收到 ICMP 不可达常见的端口扫描工具:
nmap:网络探索和安全审计的瑞士军刀masscan:高速端口扫描器netcat:网络瑞士军刀,可以手动「敲门」
bash
# 使用 nmap 扫描常见端口
nmap -sV 192.168.1.1
# 扫描特定端口范围
nmap -p 1-1000 192.168.1.1
# 快速扫描常用端口
nmap --top-ports 20 192.168.1.1一个有趣的细节:TIME_WAIT
服务器突然崩了无法重启,报错「Address already in use」——这是端口占用问题。
根本原因是 TCP 四次挥手中的 TIME_WAIT 状态。连接关闭后,操作系统会保留端口 2MSL(通常是 60 秒),防止旧连接的延迟数据包被新连接接收。
解决方案:
bash
# Linux 允许端口快速复用
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
# 或调整 TIME_WAIT 超时时间
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout生产环境建议:
- 服务端使用 SO_REUSEADDR 选项
- 客户端尽量使用连接池复用连接
- 合理设置 keepalive 参数
面试追问方向
- 为什么端口号最大是 65535?
- HTTP 默认端口是 80,HTTPS 默认端口是 443,这些是怎么约定的?
0.0.0.0:8080和127.0.0.1:8080有什么区别?- 服务器上出现大量 TIME_WAIT 是什么原因?怎么解决?
- 端口 0 为什么不用?
