Skip to content

为什么端口号最大是 65535?

平时我们访问一个本地服务,经常会看到这种地址:

  • http://127.0.0.1:8080

这里的 127.0.0.1 表示本机。那后面的 8080 是什么?它就是端口号。

再比如:

  • MySQL:3306
  • Redis:6379
  • HTTP:80
  • HTTPS:443

这些数字,本质上都是端口号。

但不知道你有没有想过一个问题:端口号为什么最大是 65535? 为什么不是 99999?为什么不是 100000?

其实原因很简单:端口号在 TCP/UDP 协议里,占用的是 16 位。

1、端口号是干什么的?

先说端口号的作用。

  • IP 地址负责找到哪台机器
  • 端口号负责找到这台机器上的哪个程序

比如你访问:127.0.0.1:8080,可以简单理解成:

  1. 127.0.0.1:找到本机
  2. 8080:找到本机上监听 8080 端口的程序

一台电脑上可以同时运行很多程序。比如:

  • MySQL 监听 3306
  • Redis 监听 6379
  • Nginx 监听 80
  • 某个 Java 服务监听 8080

如果只有 IP 地址,没有端口号,系统就不知道这个请求到底应该交给哪个程序处理。

所以端口号的作用就是:在一台机器内部,区分不同的网络程序。

2、为什么最大是 65535?

因为端口号是一个 16 位的数字。

16 位是什么意思?可以理解成有 16 个二进制位置,每一位只能是 0 或 1。

所以 16 位最多可以表示:

  • 2^16 = 65536

也就是一共有 65536 种可能。但是计算机一般从 0 开始计数,所以端口号范围就是:

  • 0 ~ 65535

一共正好是 65536 个。

这就是为什么端口号最大是 65535。不是因为大家随便定了一个数字,而是协议里端口字段本身就是 16 位。

3、那端口 0 能用吗?

既然端口范围是 0 ~ 65535,那端口 0 能不能用?

一般我们平时不会手动把服务绑定到 0 端口。比如你很少会看到这种配置:

  • server.port=0

但在一些开发场景里,端口 0 有特殊含义。它通常表示:让操作系统自动分配一个可用端口。

比如测试程序启动一个临时服务,不想自己指定端口,就可以让系统帮你挑一个空闲端口。

所以端口 0 不是普通业务服务常用的端口,它更多是让系统自动分配端口时使用。

4、端口号也分范围

虽然端口号范围是 0 ~ 65535,但不是所有端口都建议随便用。通常可以分成几类:

第一类:知名端口(0 ~ 1023)

这些端口一般给一些常见协议使用,比如:

  • HTTP:80
  • HTTPS:443
  • SSH:22
  • DNS:53

所以我们平时开发自己的服务,一般不建议随便占用这些端口。

第二类:注册端口(1024 ~ 49151)

很多常见软件会使用这个范围里的端口,比如:

  • MySQL:3306
  • Redis:6379
  • PostgreSQL:5432

第三类:动态/临时端口(49152 ~ 65535)

这些端口经常被系统临时分配给客户端连接使用。

比如你用浏览器访问一个网站,网站服务端可能是 443 端口,但你本机这边也需要临时开一个端口来建立连接,这个临时端口通常就是系统自动分配的。

5、为什么我平时常见 8080?

很多本地服务喜欢用 8080,比如 http://localhost:8080

这是因为 80 是 HTTP 的默认端口,但在很多系统里,监听 80 端口可能需要更高权限,或者已经被 Nginx、Apache 这类服务占用了。

所以开发环境里,大家经常用 8080 来代替 80。它看起来也比较直观:80 的开发版

类似的还有:

  • 8000
  • 8001
  • 8081
  • 8888

这些端口在本地开发里也很常见。

6、端口会不会冲突?

会。 同一个 IP 地址下,同一个协议,同一个端口,一般只能被一个程序监听。

比如已经有一个服务占用了 127.0.0.1:8080,另一个服务再想监听同样的地址和端口,就可能报错:

  • Address already in use

意思就是:这个地址已经被占用了。

所以有时候本地项目启动失败,不一定是代码错了,也可能只是端口被占用了。这时候可以换一个端口,比如 8081、8082、9000,或者查一下是谁占用了端口。

Linux / macOS 查看端口占用:

sh
lsof -i :8080

Windows 查看端口占用:

sh
netstat -ano | findstr 8080

7、IP + 端口才是一个完整入口

只看 IP 不够,只看端口也不够。真正定位一个服务,通常要看:IP + 端口

比如:

  • 127.0.0.1:8080
  • 127.0.0.1:3306
  • 127.0.0.1:6379

它们 IP 一样,但端口不同,所以可以对应不同程序。

反过来,如果 IP 不同,端口一样,也可能同时存在。比如:

  • 127.0.0.1:8000
  • 127.0.0.2:8000

端口都是 8000,但绑定的 IP 不同,也可以表示不同的监听入口。

8、简单总结一下

这件事可以这么记:

  1. IP 地址负责找到哪台机器
  2. 端口号负责找到这台机器上的哪个程序
  3. 端口号是 16 位,所以范围是 0 ~ 6553565535 是端口号的最大值
  4. 同一个地址上的同一个端口,通常不能被多个程序同时占用

所以以后再看到:

  • localhost:8080
  • 127.0.0.1:3306
  • 0.0.0.0:6379

就不要只盯着前面的地址了,后面的端口号也很重要。它决定了这个请求最终会交给哪个程序处理。