1. 端口基础概念:从入门到实战
做运维这些年,我见过太多同事一遇到端口问题就懵了。其实端口这东西,说白了就是计算机和外界通信的「门牌号」。今天咱们就把这个基础打扎实。
1.1 什么是端口?
想象一下,你的服务器是一栋大楼。IP地址就是大楼的地址,而端口就是楼里的一个个房间号。数据包来了,得知道去哪个房间找对应的服务。
我刚开始接触网络时,总觉得端口是个很玄乎的东西。后来在一次排查Web服务故障时,才真正理解了它的作用——没有端口,数据包就不知道该交给哪个进程处理。
核心定义:端口是操作系统用来区分不同网络服务的逻辑标识。它是一个16位的数字,范围从0到65535。
1.2 端口号范围(0-65535)
端口号一共65536个,分成了三段。你想想看,这就像把电话号码分成了不同的号段,各有各的用途。
| 范围 | 分类 | 数量 | 典型用途 |
|---|---|---|---|
| 0 - 1023 | 知名端口(Well-Known Ports) | 1024个 | 系统服务、标准协议 |
| 1024 - 49151 | 注册端口(Registered Ports) | 48128个 | 用户应用程序 |
| 49152 - 65535 | 动态/私有端口(Dynamic/Private Ports) | 16384个 | 临时连接、客户端端口 |
实战小技巧:排查端口占用时,我习惯先用 netstat -tlnp 看监听端口。如果发现端口被占,第一反应就是看它在哪个范围——知名端口被占,多半是系统服务冲突;动态端口被占,往往是某个进程没正常退出。
1.3 知名端口(0-1023)
这部分端口是IANA(互联网号码分配局)分配给标准服务的。说白了,就是行业约定——大家说好了,80给HTTP,443给HTTPS,22给SSH。
我记得有一次线上事故,就是因为有人在服务器上启动了自定义服务,占用了22端口。结果SSH连不上了,只能去机房物理操作。嗯,从那以后我就在监控里加了一条规则:知名端口被非标准进程占用,立刻告警。
常见的知名端口有这些:
- 21 — FTP(文件传输协议)
- 22 — SSH(安全外壳协议)
- 23 — Telnet(远程登录)
- 25 — SMTP(简单邮件传输协议)
- 53 — DNS(域名系统)
- 80 — HTTP(超文本传输协议)
- 443 — HTTPS(安全超文本传输协议)
- 3306 — MySQL数据库
- 6379 — Redis缓存
- 8080 — HTTP备用端口(常用于Tomcat等)
避坑指南:我曾经遇到过一个问题——开发在测试环境把MySQL端口改成了3307,结果上线时忘记改回来,导致生产环境数据库连不上。所以我的建议是:生产环境尽量使用标准端口,非必要不改。如果非要改,一定要在配置管理里写清楚。
1.4 动态端口(1024-65535)
这部分端口是给客户端用的。你想想看,当你打开浏览器访问百度时,你的电脑会随机选一个动态端口(比如54321)去连接百度的80端口。这样服务器回数据时,就知道该发给哪个进程了。
动态端口的特点是:用完就释放。但有时候程序没写好,端口释放不及时,就会出现端口耗尽的问题。我在处理一次高并发场景时,就遇到过客户端端口被占满的情况——服务器上全是 TIME_WAIT 状态的连接,新请求进不来。
优化建议:Linux系统默认动态端口范围是32768-60999。如果业务并发高,可以适当扩大这个范围:
# 查看当前动态端口范围
cat /proc/sys/net/ipv4/ip_local_port_range
# 临时修改(重启后失效)
echo "10240 65535" > /proc/sys/net/ipv4/ip_local_port_range
# 永久修改
echo "net.ipv4.ip_local_port_range = 10240 65535" >> /etc/sysctl.conf
sysctl -p
1.5 TCP与UDP端口区别
很多新手搞不清TCP和UDP端口有什么区别。我打个比方:
- TCP端口 — 像打电话。先拨号(三次握手),确认对方在,然后说话,说完挂断。可靠,但慢。
- UDP端口 — 像对讲机。直接喊,不管对方听没听到。快,但不可靠。
在实际排查中,同一个端口号可以同时被TCP和UDP使用。比如DNS服务,53端口既监听TCP也监听UDP。但大多数服务只用一种协议。
| 特性 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠,有重传机制 | 不可靠,不保证送达 |
| 速度 | 相对较慢 | 快 |
| 典型应用 | HTTP、SSH、FTP、SMTP | DNS、DHCP、视频流、游戏 |
| 端口占用排查 | 用 ss -tlnp |
用 ss -ulnp |
排查要点:用 ss 或 netstat 查端口时,记得加协议参数。我见过有人查TCP端口占用,结果UDP端口被占了他没发现,折腾了半天。
1.6 本章知识体系
下面这张图把端口的基础概念串起来了,方便你记忆:
1.7 小结
端口这东西,说简单也简单,说复杂也复杂。但只要你理解了它的本质——一个16位的数字,用来区分不同的网络服务——后面学什么端口转发、端口映射、端口安全,都会轻松很多。
我个人建议,学完这章后,你可以在自己的服务器上跑一遍 ss -tlnp 和 ss -ulnp,看看当前系统都开了哪些端口。对照着知名端口列表,你就能知道哪些是标准服务,哪些是自定义服务。嗯,动手试试,比看十遍书都管用。