1. 端口基础概念:TCP/UDP端口号范围、知名端口与动态端口、端口与进程的关系
各位同学好,我是老赵。今天咱们开始第一讲——端口基础概念。说实话,我带团队十几年,处理过的端口冲突问题少说也有上百起。很多新手一上来就抓包、看日志,折腾半天发现连端口号范围都没搞清。嗯,这章咱们就把地基打牢。
1.1 端口到底是什么?
端口,说白了就是操作系统给网络进程分配的一个数字标签。你想想看,一台服务器上跑着Web服务、数据库、SSH,数据包来了,内核怎么知道该交给谁?
端口就是那个门牌号。IP地址找到主机,端口号找到进程。两者缺一不可。
核心公式:
套接字(Socket)= IP地址 + 端口号
一个完整的网络连接由五元组唯一标识:源IP、源端口、目标IP、目标端口、传输层协议(TCP/UDP)
1.2 TCP/UDP端口号范围
端口号是一个16位的无符号整数,范围从0到65535。我习惯把它分成三段来看:
| 分类 | 范围 | 数量 | 说明 |
|---|---|---|---|
| 知名端口 | 0 - 1023 | 1024个 | 系统保留,需要root/管理员权限才能绑定 |
| 注册端口 | 1024 - 49151 | 48128个 | IANA登记,但普通用户可用 |
| 动态/私有端口 | 49152 - 65535 | 16384个 | 客户端临时使用,系统自动分配 |
这里有个坑,我当年刚入行时踩过——0号端口是保留端口,不能用于实际通信。你如果写代码绑0,系统会给你随机分配一个可用端口。
⚠ 避坑指南:
我曾经在线上环境见过有人把应用端口配成1023,结果重启后服务起不来。为什么?因为1023属于知名端口范围,非root用户没权限绑定。后来查了半天才发现是端口权限问题。
1.3 知名端口:那些你天天见的数字
知名端口,就是IANA(互联网数字分配机构)钦定的那些服务端口。我建议你至少记住下面这几个,面试和排障都用得上:
- 21 — FTP控制端口
- 22 — SSH,远程管理的命根子
- 23 — Telnet,明文传输,现在基本不用了
- 25 — SMTP,发邮件用的
- 53 — DNS,域名解析,UDP和TCP都用
- 80 — HTTP,Web服务的默认端口
- 443 — HTTPS,加密的Web服务
- 3306 — MySQL数据库
- 6379 — Redis缓存
- 8080 — HTTP备用端口,Tomcat等常用
你可能会问:为什么FTP用21,SSH用22?其实早期这些端口分配挺随意的,后来用的人多了就成了事实标准。我个人习惯在/etc/services文件里查这些映射关系,Linux和macOS都自带这个文件。
1.4 动态端口:客户端是怎么拿到临时门牌的?
动态端口,也叫临时端口。当你用浏览器访问百度时,你的机器需要选一个源端口。这个端口就是系统从动态端口范围里随机挑的。
在Linux上,你可以用这个命令查看动态端口范围:
cat /proc/sys/net/ipv4/ip_local_port_range
# 输出示例:32768 60999
Windows上查看方式:
netsh int ipv4 show dynamicport tcp
我记得有一次帮客户排查连接超时问题,发现他们的应用服务器动态端口范围被改成了1024-5000,结果并发一高端口就不够用了。嗯,这就是典型的配置不当。
💡 经验之谈:
高并发场景下,建议把动态端口范围上限调到65535。Linux上直接改/proc/sys/net/ipv4/ip_local_port_range就行,但要持久化的话得写到/etc/sysctl.conf里。
1.5 端口与进程的关系:谁在监听?
端口本身只是一个数字,真正干活的是进程。一个进程可以监听多个端口,但一个端口在同一时刻只能被一个进程监听(除非用了SO_REUSEADDR等特殊选项)。
排查问题时,我最常用的命令就是:
# Linux 查看端口占用
netstat -tlnp
# 或者用 ss,更快
ss -tlnp
# Windows 查看端口占用
netstat -ano | findstr :8080
输出里你会看到类似这样的信息:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
这表示PID为1234的nginx进程正在监听0.0.0.0:80,也就是所有网卡的80端口。
这里有个细节——0.0.0.0:80和127.0.0.1:80是完全不同的。前者对外暴露,后者只允许本机访问。我见过有人把数据库配成0.0.0.0,结果被外部扫描到了,这是个安全隐患。
1.6 知识体系总览
下面这张图把端口的核心概念串起来了,你可以对照着理清思路:
1.7 实战小技巧:快速定位端口冲突
最后分享一个我常用的三板斧,遇到端口问题先走这三步:
- 查占用 —
ss -tlnp | grep :端口号,看哪个进程占着 - 查进程 —
ps aux | grep PID,确认是不是预期进程 - 查配置 — 看应用的配置文件,端口是不是写错了
有一次线上告警说服务连不上,我按这个流程走了一遍,发现是运维部署新版本时把端口配成了8081,但防火墙只开了8080。嗯,这种低级错误其实挺常见的。
好了,端口基础概念就讲到这里。记住:端口是数字,但背后是进程。搞懂了这个关系,后面讲端口冲突排查就轻松多了。