认识端口

认识端口
Tmerowr解决端口冲突是服务器部署中非常常见的一环,
“端口可以随意设置吗?还是有一个范围?”🧐🧐🧐
这是一个非常好的问题,涉及到网络基础知识的核心。
答案是:
不完全是随意设置,但有非常大的选择空间,并且遵循一定的规则和范围。
🌍端口号的范围 (0 - 65535)
计算机的端口号是一个16位的数字,所以理论范围是从 0
到 65535
。但是,这个巨大的范围被划分成了三个主要区域,每个区域都有其约定俗成的用途。👩🎓
知名端口 (Well-Known Ports): 0 ~ 1023
这个范围的端口是“大人物专区”,被严格地保留给最基础、最核心的网络服务。普通应用程序 绝对不应该 使用这个范围的端口。🏂🏂
特点:
- 全球统一,有标准定义(由 IANA 组织管理)。
- 在类Unix系统(如Linux)上,绑定这些端口通常需要
root
超级管理员权限。
常见例子:22
: SSH (您远程连接服务器用的就是它)80
: HTTP (标准网页服务)443
: HTTPS (加密的网页服务)21
: FTP (文件传输)3306
: MySQL 数据库5432
: PostgreSQL 数据库 ( docker-compose.yml
里的数据库容器内部就用了这个)
结论:这个范围的端口,我们只用,不占。
注册端口 (Registered Ports): 1024 ~ 49151
这个范围是给各种应用程序和软件“注册”使用的。很多知名的软件会在这里选择一个端口作为默认端口。
特点:
- 虽然有“注册”,但并非强制。这意味着您可以在这个范围内为您的应用选择端口,但有可能会和服务器上已安装的其他软件冲突。
- 我们之前尝试的
8080
和18088
都属于这个范围。它们被占用,说明您的服务器上已经有其他程序(可能是其他网站、API服务、管理面板等)占用了它们。
常见例子:8080
, 8888
: 常用的Web服务备用端口。3389
: Windows 远程桌面。6379
: Redis 数据库。9000
: Portainer (一个常见的Docker管理面板)。
结论:这个范围是我们的“主战场”。可以选择,但需要先确认是否被占用。我们选择
28088
成功,就是因为这个端口足够“奇葩”,在这个范围里几乎没有软件会默认使用它。
动态/私有端口 (Dynamic/Private Ports): 49152 ~ 65535
这个范围是“自由市场”,被特意保留下来,不进行任何官方注册。❤️
操作系统会从这个范围里随机分配端口给建立向外连接的程序(例如您的浏览器访问百度时,操作系统会临时给浏览器分配一个这个范围的端口)。
特点:
- 非常安全,冲突的概率极低。
- 专门用于自定义、私有或临时的服务。
使用场景:
如果您想最大程度地避免端口冲突,直接从这个范围里随便挑一个,比如 51234
,几乎可以保证是可用的。😀
总结与最佳实践
可以设置的范围:理论上您可以自由设置的范围是 1024 ~ 65535。
如何选择:
图省事:选一个你喜欢的、容易记的四位或五位数字,比如 8000
到 9999
之间(避开 8080
, 8888
等)。
怕冲突:像我们这次一样,选择一个大于10000且不常见的五位数,比如 1xxxx
, 2xxxx
等。28088
就是一个很好的例子。
追求极致安全:直接从动态端口范围 49152
~ 65535
中挑选。
📌如何验证:
在决定使用一个端口前,可以用我们之前用过的命令来检查它是否已被占用:
1 | sudo lsof -i :您想用的端口号 |
如果命令没有任何输出,恭喜您,这个端口是空闲的!🥳🥳🥳
🔢 端口分类
类型 | 范围 | 说明 |
---|---|---|
系统端口(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应用的时候,确实经常遇到端口被占用的报错,这下算是搞明白端口设置的整体逻辑了🎉🎉🎉