在 tcp 连接中,一个服务器怎么可能同时处理超过 65535 个客户端?

In a tcp connection, how possibly can a server handle more than 65535 client at an instant?

我一直在阅读 Oracle 的 this socket tutorial 并偶然发现以下文本:

If everything goes well, the server accepts the connection. Upon acceptance, the server gets a new socket bound to the same local port and also has its remote endpoint set to the address and port of the client. It needs a new socket so that it can continue to listen to the original socket for connection requests while tending to the needs of the connected client.

现在,如果我没记错的话,端口大小是 16 位,这将端口的最大数量限制在 65K 左右。这意味着如果服务器的所有端口都绑定到某个客户端本地端口,则服务器在任何时刻都无法处理超过 65535 个连接。虽然 Whosebug 上的 this 等一些答案表明对活动连接没有限制。这到底是对是错?

编辑 1:如果服务器确实不能处理超过 2^16-1 个连接,那么像 Google 这样的网站如何处理这个限制?

唯一的 TCP 连接由客户端 IP、客户端端口、服务器 IP 和服务器端口的唯一组合定义。对于特定的服务,服务器 IP 和端口是不变的(即 HTTP 端口 80),但客户端 IP 和端口可以变化。由于端口范围仅为 1..65535,这意味着服务器最多只能同时处理来自同一客户端 IP 地址 的最多 65535 个不同连接 ,因为这些都可能是唯一的当只能更改端口时连接元组的组合。但是,如果有多个客户端具有不同的 IP 地址,则此限制分别适用于这些客户端中的每一个。如果您随后查看不同可能的 IP 地址(IPv4 和 IPv6)的数量,您会发现理论上服务器可以处理的连接数量基本上没有实际限制。

实际上,这些 TCP 连接中的每一个都占用服务器的内存,因为必须保持当前状态。内核和应用程序需要额外的内存用于文件描述符和应用程序协议状态等。这意味着根据机器的资源存在实际限制,可能小于 64k,但也可能更多,具体取决于系统及其配置.

他们为您的 ISP 使用 NAT(网络地址转换)之类的东西。 您可以访问路由器后面的不同计算机,因为您的路由器在内部将路由映射到 PC。

例如Google 数据中心做同样的事情。将 "Google.com" 映射到不同的内部服务器,允许它们总共接受超过 65k 的连接。