端口是一个 16 位的数字,0 到 65535:它标识「主机上的哪个程序」。 它分三段用:知名、注册、动态,三段的分配规则完全不同。
6.1.1 说端口是「分用键」,这一节讲这个键怎么编号、谁来管。 6.2.4 会讲「端口怎么定」,这一节先讲「有哪些端口可用」。
一、端口是什么
它是一个 16 位的整数,写在 TCP 或 UDP 首部的前两个字段里。 所以「端口」不是硬件,是协议字段——这也是为什么「换个程序还能用同一个端口」。 它的作用类似「学号」:地址定位到「哪个学校」,端口定位到「学校里的哪个人」。 所以「IP 加端口」才能唯一确定一个通信端点,只给 IP 只能到门口。
二、三段划分
IANA 把 65536 个端口切成三段:
| 区段 | 范围 | 个数 | 谁来定 |
|---|---|---|---|
| 知名端口 | 0~1023 | 1024 | IANA 统一规定 |
| 注册端口 | 1024~49151 | 48128 | 申请登记 |
| 动态端口 | 49152~65535 | 16384 | 系统临时分配 |
第一段只有 1024 个,却装下了绝大多数「老协议」:80、443、22、53、25、110。 所以「知名端口」这个词的意思是「大家都知道的号码」,不是「很重要的端口」。 第三段才是「客户端用的」:你每打开一个网页,系统都从这一段里挑一个给你,用完回收。 所以「抓包看到一堆 5 万多端口」是正常的,它们都是短期租用的。
三、端口和进程的关系
端口属于「进程」还是「连接」? 准确答案是:端口属于「端点」,而一个进程可以有多个端点。 服务器是「一个端口,很多连接」:80 端口只有一个监听,但可能挂着几千条已建立的连接, 它们靠「客户端地址加端口」区分。 客户端是「一条连接,一个临时端口」:每次发起连接都换一个。 所以「端口被占用」这个错误,只发生在「监听」这一侧: 两个程序不能同时监听同一个「协议加端口」,但它们可以同时连出去很多条连接。
四、端口不是「门的数量」
「65536 个端口」经常被理解成「最多 65536 个程序」,这是错的。 真实限制是「同时存在的四元组组合数」: 一个客户端到同一个服务器的同一个端口,最多能有 65535 条连接(源端口不够用), 但换一个服务器就又有 65535 条。 所以「全机最多多少条连接」远大于 65536,实际瓶颈通常是内存和文件句柄,不是端口号。 反过来说,「端口耗尽」倒是真的会发生: 当一台机器要连的「目的地址加端口」种类太多,临时端口池就不够了—— 这是 5.6.4 里那个问题在客户端侧的版本。
五、动手 Demo:65536 个端口怎么分段
算出三段的个数和占比。 注意「知名端口」只占 1.6%,却装下了几乎所有老协议。
for name, lo, hi in (('知名', 0, 1023), ('注册', 1024, 49151),
('动态', 49152, 65535)):
n = hi - lo + 1
print('%-4s %5d~%-5d %6d %.1f%%' % (name, lo, hi, n,
100.0 * n / 65536))
实跑输出:
--------------------------------------------------------------------
65536 个端口怎么分段
--------------------------------------------------------------------
**端口是 16 位,0 到 65535**,**IANA 把它切成三段,用途完全不同。**
区段 范围 个数 占比
---------------------------------------------
知名端口 0~1023 1024 1.6%
注册端口 1024~49151 48128 73.4%
动态端口 49152~65535 16384 25.0%
**第一段只有 1024 个,却装下了几乎所有「老协议」**:
**HTTP 80、HTTPS 443、SSH 22、DNS 53、SMTP 25。**
**第二段是「新协议登记处」**,**比如 3306 MySQL、6379 Redis、8080 备用的 HTTP。**
**第三段是「临时端口」**:**客户端发起连接时,由系统随便挑一个。**
**所以「服务端用固定端口、客户端用随机端口」不是约定,是分段规则决定的。**
**这也解释了为什么「抓包看到一堆高位端口」是正常的。**
1024 加 48128 加 16384 等于 65536:三段正好把 16 位空间分完,没有空隙。 这个划分是 1990 年代定下来的, 当时没想到「客户端会同时开几千条连接」,所以动态端口那 16384 个现在有点紧。 这也是「端口范围可以调」的原因: Windows 和 Linux 都允许把动态端口范围改大(比如挪到 1024 到 65535), 代价是「可能和已注册的服务撞车」。 所以这个调整要谨慎,不能随手改。 最后一个观察: 「知名端口」这个词有历史包袱——它原意是「root 才能用」,所以 1024 以下叫「特权端口」。 现在很多系统仍然要求管理员权限才能监听这些端口, 这也是「为什么有些服务要用 8080 而不是 80」的现实原因。
30 秒实验
- 算一下:三段加起来是不是正好 65536?
- 想一下:为什么客户端要用「动态端口」而不是「知名端口」?
- 想一下:「端口耗尽」和「端口号用完」是同一件事吗?
常见误区
- 以为「端口是物理接口」。 它只是 16 位数字,写在首部里。
- 以为「最多 65536 个程序同时上网」。 限制的是四元组组合,实际瓶颈是内存和句柄。
- 以为「知名端口很重要」。 它的意思是「大家都知道」,不代表优先级。
自测三问(点开对答案)
1. 端口号有几位?范围是多少? —— **16 位,0 到 65535,共 65536 个。** 2. 三段端口分别是什么? —— **知名 0~1023、注册 1024~49151、动态 49152~65535。** 3. 为什么客户端会用「高位端口」? —— **系统从动态端口池里临时分配一个**,用完回收,所以每次都不一样。下一节看「端口号怎么认出应用」。
- ☐ (本节完,下一节 6.2.2 根据端口号识别应用)