“端口地址转换 (PAT) 解决了当多个主机恰好使用相同的源端口号同时建立不同的外部连接时发生的冲突。然后,PAT 可能会为该连接分配一个来自可用端口池,将此端口号插入到源端口字段中。”
https://en.wikipedia.org/wiki/Network_address_translation
如果我们有 10 台高度可扩展的服务器,可以接受数千个请求,该怎么办?端口耗尽似乎是一个非常基本的限制(64k),我们很容易达到。
行业如何处理这种情况?
答案1
归根结底,NAT 实际上只是 NAT 设备上的一个查找表,其中包含哪些连接去往何处的映射。然而,这些表条目是在每场会议基础。
例如,如果我有一位主持人10.10.10.10,想要与互联网上的服务器进行通信8.8.8.8,通过我的互联网网关,其公共 IP 是1.1.1.1,当发生这种通信时,我的互联网网关可能会创建一对如下所示的条目:
来源 | 运动 | 目的地 | 德波特 | 操作 |
---|---|---|---|---|
10.10.10.10 | 20000 | 8.8.8.8 | 80 | SNAT 10.10.10.10:20000 --> 1.1.1.1:40000 |
8.8.8.8 | 80 | 1.1.1.1 | 40000 | DNAT 1.1.1.1:40000-->10.10.10.10:20000 |
虽然看起来1.1.1.1:40000现已被此会话占用,现在剩下约 63999 个端口,这并不完全正确。由于这些条目是基于每个会话的,因此后续通信发生并构建如下表是完全合理的:
来源 | 运动 | 目的地 | 德波特 | 操作 |
---|---|---|---|---|
10.10.10.10 | 20000 | 8.8.8.8 | 80 | SNAT 10.10.10.10:20000 --> 1.1.1.1:40000 |
8.8.8.8 | 80 | 1.1.1.1 | 40000 | DNAT 1.1.1.1:40000-->10.10.10.10:20000 |
10.10.10.10 | 20001 | 8.8.8.8 | 81 | SNAT 10.10.10.10:20001 --> 1.1.1.1:40000 |
8.8.8.8 | 81 | 1.1.1.1 | 40000 | DNAT 1.1.1.1:40000-->10.10.10.10:20001 |
10.10.10.10 | 20002 | 8.8.4.4 | 80 | SNAT 10.10.10.10:20002 --> 1.1.1.1:40000 |
8.8.4.4 | 80 | 1.1.1.1 | 40000 | DNAT 1.1.1.1:40000-->10.10.10.10:20002 |
10.10.10.10 | 20003 | 8.8.4.4 | 81 | SNAT 10.10.10.10:20003 --> 1.1.1.1:40000 |
8.8.4.4 | 81 | 1.1.1.1 | 40000 | DNAT 1.1.1.1:40000-->10.10.10.10:20003 |
因此在公共接口上(通常是您担心 NAT 耗尽的地方),我们可以看到实际上有 4 个会话:
1.1.1.1:40000 --> 8.8.8.8:80
1.1.1.1:40000 --> 8.8.8.8:81
1.1.1.1:40000 --> 8.8.4.4:80
1.1.1.1:40000 --> 8.8.4.4:81
但是这 4 个会话并没有完全消耗 4 个端口,并且 NAT 设备确切地知道应该将属于这 4 个会话中的任何一个的流量路由到哪里。
因此,虽然看起来端口限制为 64k,但实际上更像是每个目标套接字 64k(有一些注意事项)。虽然不是取之不尽,但肯定比固定的 64k 更具可扩展性。