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


29

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

Answers:


55

您会严重误解端口号:服务器仅在一个端口上侦听,并且可能有来自连接到该端口的客户端的大量开放套接字。

在TCP级别上,每个同时连接的元组(源ip,源端口,目标ip,目标端口)必须唯一。这意味着单个客户端最多只能打开到服务器的65535个并发连接。但是服务器可以(理论上)为每个客户端 65535个服务器同时连接。

因此,在实践中,服务器仅受其必须处理请求的CPU能力,内存等的限制,而不受服务器的TCP连接数的限制。


我想知道电信级NAT将如何影响这一情况
TheLQ 2013年

@TheLQ如果没有CGN,则每个客户端最多只能打开65535个连接到同一服务器的连接,没有客户端需要到同一服务器的连接数几乎是多少。使用CGN时,每个CGN最多只能为同一服务器打开65535个连接,必须使用该CGN在所有客户端之间共享这些连接。CGN是否可以同时打开到一台服务器的65535连接和到另一台服务器的65535连接是一个实现细节,在不同的CGN实现之间可能会有所不同。
卡巴斯德(Kasperd)

可以通过向CGN添加更多IP地址或部署更多CGN来增加限制。但是您也可以只部署双栈。这样,与具有IPv6支持的服务器的连接将不会通过CGN,因此它们不会消耗宝贵的端口号。
卡巴斯德(Kasperd)

14

您错了-套接字的唯一性由四个因素决定:

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

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

因此,尽管实际上客户端不会使用已用于连接的端口来打开与其他目标IP地址的连接,但是端口号耗尽对于几乎所有应用程序来说都是最小的麻烦-无论是在服务器上还是在服务器上客户端。

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


2

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

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

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


2
如果您阅读的内容不止标题,您会发现此问题与端口耗尽有关,OP对它的工作方式有误。这个答案究竟如何为它增加新的价值?
MDMarra 2013年

2
OP明确询问(而不仅仅是在标题中)“服务器如何经历大量……的请求”。撇开套接字如何工作的困惑,这是一个有效的问题。
user8162 2013年

1
切断疑问句的出色工作。那句话的其余部分说:(more than the max port number)
MDMarra 2013年

2
也许您错过了我规定OP不了解套接字机制的部分。我认为如何超过64k端口是一个有效的讨论话题。很抱歉,如果您不同意,那是一个问题,那是我提供了几个答案的原因。您问这有何反应?这就是如何。
user8162 2013年

3
那是问题的一半。OP的最后一句话支持的更大问题是如何突破64k的障碍。
user8162 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.