根据相关帖子,端口转发不可能同时为使用相同互联网服务/应用程序/协议(例如 FTP、HTTP 等)的多个客户端主机提供服务,因为每个互联网服务都有 IANA 设置的专用端口。换句话说,仅使用端口转发,同一内部网络中的多个客户端主机不可能同时使用相同的互联网服务,甚至对于在单个主机上运行的同一互联网应用程序的多个实例也是不可能的。然而,观察表明,在同一内部网络中同时支持多个 Internet 服务实例是可能的。
这在实践中如何解释?
根据相关帖子,端口转发不可能同时为使用相同互联网服务/应用程序/协议(例如 FTP、HTTP 等)的多个客户端主机提供服务,因为每个互联网服务都有 IANA 设置的专用端口。换句话说,仅使用端口转发,同一内部网络中的多个客户端主机不可能同时使用相同的互联网服务,甚至对于在单个主机上运行的同一互联网应用程序的多个实例也是不可能的。然而,观察表明,在同一内部网络中同时支持多个 Internet 服务实例是可能的。
这在实践中如何解释?
我将您的问题解释为:“当多个客户端主机位于 NAT 后面并共享一个‘外部’IP 地址时,多个客户端如何连接到同一端口上的同一台服务器?”
这是通过完全相同的机制实现的,该机制还允许单个主机建立到同一服务的多个连接。(例如,您的 Web 浏览器经常使用 2-3 个并发 HTTP 连接到同一个 Web 服务器。)
TCP 连接和 UDP 流始终由一对端口标识。每个 TCP 或 UDP 数据包都带有两个字段:“源”端口和“目标”端口。
在来自客户端的数据包中,“目标”端口包含 IANA 分配的服务端口(例如 HTTP 的 80),但“源”端口由操作系统自动分配,因此 {source, dest} 对始终是唯一的。例如,客户端可能将端口 {54794, 80} 用于第一个 HTTP 连接,将 {48973, 80} 用于第二个。服务器以相反的源和目标进行响应——它的数据包将具有 {80, 54794} 或 {80, 48973}。
当您在 NAT 后面有多个客户端主机时,该过程保持不变,并且 NAT 设备使用端口组合来识别哪个客户端建立了哪个连接。如果多个客户端设备碰巧选择了相同的端口,NAT 设备将转换源端口以确保该对在 WAN 端仍然是唯一的。
相同答案的另一个版本(不太清楚,但有示例):互联网服务器如何响应来自私有 IP 的请求?
其他一些基于 IP 的协议(例如 SCTP)也具有完全相同的工作方式的端口。
QUIC 为此目的使用 UDP 封装——QUIC 端口实际上是 UDP 端口。
ICMP Echo(又名 ping)具有唯一的 ID 字段,其作用与“源端口”相同。(您可以说 ICMP 类型/代码字段用于“目的端口”。)
IPsec ESP 具有安全关联 ID,但据我所知,它们通常不会被 NAT 跟踪——NAT 设备通常将 ESP 视为没有端口之类的东西,并且只允许单个客户端连接到给定的服务器(甚至更糟糕的是,一些 NAT 设备一次只允许一个客户端使用 ESP)。UDP 封装用于解决这个问题。
正确的。反过来想想为什么不允许这样做。如果我点击一个公共 IP(比如 74.32.xx:5000),其中有 2 台机器在内部使用相同的端口,如果它们都是在路由器级别转发的端口,它怎么知道要路由到哪一台?答案是根据用例在网络或负载均衡器中使用反向代理来委派传入流量。负载均衡器将能够为在同一端口上运行的应用程序提供服务,反向代理可以读取数据包标头并将数据发送到正确的内部服务器。
反向代理示例:假设您有 2 个运行 blue.com 和 red.com 的网站,它们都托管在内部服务器上,但共享您的公共 IP,并且都在端口 80 上运行。传入的请求将到达路由器,被发送到反向代理然后会说“用户要求 red.com”,然后将请求传递给内部托管 red.com 的网络服务器。
负载均衡器 示例:2 个内部服务器共享同一个端口,托管同一个应用程序。负载均衡器接收传入请求并发送到流量最少的服务器,或者可以设置为始终发送到一个服务器,但如果它停止响应,则重新路由到另一台服务器作为故障转移。