高流量站点如何服务超过 65535 个 TCP 连接?

高流量站点如何服务超过 65535 个 TCP 连接?

如果一台机器的端口数量有限制,并且套接字只能绑定到未使用的端口号,那么处理大量请求(超过最大端口号)的服务器如何处理这个问题?是否只需使系统分布式,即在多台机器上安装多台服务器即可?

答案1

您误解了端口号:服务器只监听一个端口,并且可以拥有大量来自连接到该端口的客户端的打开套接字。

在 TCP 级别,每个同时连接的三元组(源 IP、源端口、目标 IP、目标端口)必须是唯一的。这意味着单个客户端不能同时向单个服务器打开超过 65535 个连接。但服务器(理论上)可以同时处理 65535 个连接每位客户

因此,实际上服务器仅受其处理请求的 CPU 能力、内存等的限制,而不受服务器的 TCP 连接数量的限制。

答案2

你错了——插座的唯一性由五个因素决定:

  1. 本地 IP 地址
  2. 本地端口号
  3. 远程 IP 地址
  4. 远程端口号
  5. 传输协议 (TCP/UDP)

在提供网络服务时,1. 和 2. 通常是静态的(例如 IP 10.0.0.1,端口 80),但除非你预计有数千个连接来自单个客户端(或单个 NAT 网关),在本地资源耗尽之前,您不会突破 3. 和 4. 的可能组合的界限。

因此,尽管实际上客户端不会使用已经用于连接的端口来打开到不同目标 IP 地址的连接,但对于几乎所有应用程序(无论是在服务器端还是客户端)来说,端口号耗尽都是最不重要的问题。

NAT 网关(路由器)为拥有大量开放出站连接(例如 torrent)的客户端提供服务时,这个问题非常现实 - 当可用于 NAT 的端口池被清空后,您会看到端口号耗尽。在这种情况下,NAT 网关无法创建任何其他关联,从而有效地切断了客户端与互联网的连接。

答案3

问题是如何处理大量(>64k)连接数。最常见的两种方法是:

  • 添加更多服务器,这会增加源/目标地址和端口号元组的数量。有多种方法可以在多个服务器之间共享负载;DNS 循环就是其中一种;还有其他方法

  • 部署“运营商级 NAT”(一位朋友将其嘲讽地称为“低级 NAT”,在我看来这是正确的)。这本质上是 NAT 的 NAT。这对应用程序有非常不好的影响,但这是一些大型提供商在 IPv4 空间和/或端口号用尽时,以及/或者他们不想迁移到 IPv6 时所做的。

相关内容