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

如果一台机器可以拥有的端口数量有限制,并且一个套接字只能绑定到一个未使用的端口号,那么服务器如何处理这个请求的数量(超过最大端口数)将会如何处理呢? 是否仅仅通过使系统分布来完成,即许多机器上的许多服务器?

您误解端口号非常严重:服务器只侦听一个端口,并可以从连接到该端口的客户端有大量的开放套接字。

在TCP层次上,元组(source ip,source port,destination ip,destination port)对于每个同时连接都必须是唯一的。 这意味着单个客户端无法打开超过65535个同时连接到服务器。 但是服务器可以(理论上) 为每个客户端同时连接65535个服务器。

所以在实践中,服务器只受限于CPU的功率,内存等,而不是服务器的TCP连接数。

你错了 – sockets的独特性取决于四个因素:

  1. 本地IP地址
  2. 本地端口号
  3. 远程IP地址
  4. 远程端口号

在提供networking服务时,1.和2.通常是静态的(例如,IP 10.0.0.1,端口80),但除非您希望从单个客户端 (或单个NAT网关)连接数千个连接否则不会推送在用完本地资源之前,3.和4.的可能组合的边界。

因此,虽然客户端实际上不会使用已经用于连接的端口来打开到不同目标IP地址的连接,但是对于几乎所有的应用程序来说,端口号的消耗将是您的问题中最less的 – 无论是在服务器上还是在服务器上客户端。

问题是一个非常真实的NAT网关(路由器)服务客户端与大量的开放出站连接(例如山洪) – 那里你会看到端口号耗尽后,可用于NAT的端口池已被清空。 在这种情况下,NAT网关无法创build任何其他关联,从而有效地将客户端切断Internet。

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

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

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