随机端口生成器
在任意范围内生成随机 TCP 或 UDP 端口号,自动跳过知名服务和常被占用的端口,避免本地服务冲突。
一个你机器上别人多半不会来抢的端口号。 选择需要多少个端口以及抽取的范围。默认会跳过知名服务所占用的端口,因此得到的号码不太可能与已在运行的程序冲突。
在任意范围内生成随机 TCP 或 UDP 端口号,自动跳过知名服务和常被占用的端口,避免本地服务冲突。
一个你机器上别人多半不会来抢的端口号。 选择需要多少个端口以及抽取的范围。默认会跳过知名服务所占用的端口,因此得到的号码不太可能与已在运行的程序冲突。
TCP 或 UDP 端口是一个 16 位数字,可用范围为 0 到 65535。IANA 把这个空间分成三段。0 到 1023 是系统端口或知名端口,保留给 HTTP 的 80、SSH 的 22 等标准服务;在类 Unix 系统上绑定其中之一通常需要 root 权限或显式的 capability。1024 到 49151 是注册端口,按申请分配给特定应用,PostgreSQL 的 5432 和 MySQL 的 3306 就在这一段。49152 到 65535 是动态端口或临时端口范围,保留给客户端的临时分配。
对本地开发服务而言,最合适的位置是 1024 以上的注册端口段,既避开特权段也避开临时端口段。这正是本生成器把下界默认设为 1024 的原因。保持在 49152 以下比听上去更重要:每当程序发起对外连接时,操作系统都会从临时端口范围中取号,因此停放在那里的服务重启后可能发现端口已被占用。
仅靠随机并不能避免冲突。一次随机抽取完全可能落在 3306、5432、6379 或 8080 上,而在一台正常工作的开发机上,这些恰恰是最可能已被占用的号码。这里使用的跳过列表覆盖了经典 Unix 服务、常见数据库与消息中间件,以及流行框架的默认端口,例如 Node 工具链的 3000 和本地 HTTP 服务器的 8000、8080。
跳过它们的代价几乎为零——候选池里仍有数万个号码——却能消除「端口已被占用」这类报错最常见的来源。如果你确实想要其中某个号码,关闭该选项即可恢复完整范围。
请注意这只是概率上的辅助,而不是预留。本工具无法检查你的机器,也就无从得知是否有程序正在监听。要确认端口确实空闲,请在本地检查:macOS 或 Linux 用 lsof -i :端口,较新的 Linux 用 ss -ltnp,Windows 用 netstat -ano | findstr :端口。
容器和 CI 环境会改变这套算法。容器内部的端口空间通常是私有的,因此两个容器可以同时监听 8080 而互不冲突;冲突风险转移到宿主机一侧,那里发布出来的端口共享同一个命名空间。随机选一个宿主端口并映射到固定的容器端口,是并排运行同一服务多个副本的常见做法。
许多 CI 系统和编排工具用另一种方式解决问题:直接向内核要一个空闲端口——绑定到端口 0,操作系统会分配一个未被使用的端口并告诉你选中了哪个。这种方式没有竞态且永远正确,因此当你的程序可以在运行时被告知端口时应优先采用。而像这里生成的固定号码,则适合在任何程序启动之前,需要把一个稳定值写进配置文件、docker-compose 映射或团队文档的场景。