认识端口

解决端口冲突是服务器部署中非常常见的一环,

“端口可以随意设置吗?还是有一个范围?”🧐🧐🧐
这是一个非常好的问题,涉及到网络基础知识的核心。
答案是:
不完全是随意设置,但有非常大的选择空间,并且遵循一定的规则和范围。

🌍端口号的范围 (0 - 65535)

计算机的端口号是一个16位的数字,所以理论范围是从 065535。但是,这个巨大的范围被划分成了三个主要区域,每个区域都有其约定俗成的用途。👩‍🎓

分割线-1.webp

知名端口 (Well-Known Ports): 0 ~ 1023

这个范围的端口是“大人物专区”,被严格地保留给最基础、最核心的网络服务。普通应用程序 绝对不应该 使用这个范围的端口。🏂🏂

特点

  • 全球统一,有标准定义(由 IANA 组织管理)。
  • 在类Unix系统(如Linux)上,绑定这些端口通常需要 root 超级管理员权限。

常见例子:
22: SSH (您远程连接服务器用的就是它)
80: HTTP (标准网页服务)
443: HTTPS (加密的网页服务)
21: FTP (文件传输)
3306: MySQL 数据库
5432: PostgreSQL 数据库 ( docker-compose.yml 里的数据库容器内部就用了这个)

结论:这个范围的端口,我们只用,不占。

分割线-1.webp

注册端口 (Registered Ports): 1024 ~ 49151

这个范围是给各种应用程序和软件“注册”使用的。很多知名的软件会在这里选择一个端口作为默认端口。

特点:

  • 虽然有“注册”,但并非强制。这意味着您可以在这个范围内为您的应用选择端口,但有可能会和服务器上已安装的其他软件冲突。
  • 我们之前尝试的 808018088 都属于这个范围。它们被占用,说明您的服务器上已经有其他程序(可能是其他网站、API服务、管理面板等)占用了它们。

常见例子
8080, 8888: 常用的Web服务备用端口。
3389: Windows 远程桌面。
6379: Redis 数据库。
9000: Portainer (一个常见的Docker管理面板)。

结论:这个范围是我们的“主战场”。可以选择,但需要先确认是否被占用。我们选择 28088 成功,就是因为这个端口足够“奇葩”,在这个范围里几乎没有软件会默认使用它。

分割线-1.webp

动态/私有端口 (Dynamic/Private Ports): 49152 ~ 65535

这个范围是“自由市场”,被特意保留下来,不进行任何官方注册。❤️
操作系统会从这个范围里随机分配端口给建立向外连接的程序(例如您的浏览器访问百度时,操作系统会临时给浏览器分配一个这个范围的端口)。

特点

  • 非常安全,冲突的概率极低。
  • 专门用于自定义、私有或临时的服务。

使用场景
如果您想最大程度地避免端口冲突,直接从这个范围里随便挑一个,比如 51234,几乎可以保证是可用的。😀

总结与最佳实践

可以设置的范围:理论上您可以自由设置的范围是 1024 ~ 65535

如何选择
图省事:选一个你喜欢的、容易记的四位或五位数字,比如 80009999 之间(避开 8080, 8888 等)。
怕冲突:像我们这次一样,选择一个大于10000且不常见的五位数,比如 1xxxx, 2xxxx 等。28088 就是一个很好的例子。
追求极致安全:直接从动态端口范围 49152 ~ 65535 中挑选。

📌如何验证

在决定使用一个端口前,可以用我们之前用过的命令来检查它是否已被占用:

1
2
3
sudo lsof -i :您想用的端口号
# 或者
sudo netstat -tulpn | grep :您想用的端口号

如果命令没有任何输出,恭喜您,这个端口是空闲的!🥳🥳🥳

🔢 端口分类

类型 范围 说明
系统端口(Well-known Ports) 0 - 1023 通常被操作系统服务使用,比如 HTTP(80)、HTTPS(443)、SSH(22)
注册端口(Registered Ports) 1024 - 49151 开发者、软件或第三方服务注册使用的
动态/私有端口(Ephemeral Ports) 49152 - 65535 操作系统动态分配给临时连接(例如浏览器请求网页)

🧩 常见端口用途

端口号 协议 服务名 用途说明
20 TCP FTP 数据 文件传输协议的数据通道
21 TCP FTP 控制 文件传输控制通道
22 TCP SSH 安全的远程登录(常用)
25 TCP SMTP 电子邮件发送
53 UDP DNS 域名解析
80 TCP HTTP 普通网页访问
443 TCP HTTPS 加密的网页访问
3000 TCP 自定义 常用于本地开发服务器
4000 TCP Hexo 开发服务器 hexo server 默认端口
8080 TCP HTTP-Alt 常用于备用 HTTP 服务
8000 TCP 自定义 Python、Hexo、Django 等本地开发也常用

在部署Docker应用的时候,确实经常遇到端口被占用的报错,这下算是搞明白端口设置的整体逻辑了🎉🎉🎉