保持超过 65k TCP 连接到服务器的方法

保持超过 65k TCP 连接到服务器的方法

作为一名程序员和网络及基础设施领域的新手,我开发了一个能够同时处理超过 100,000 个连接的服务器程序。

在每个客户端有 20,000 个连接的本地网络中进行测试时,一切运行顺利:

           ┌──────┐
           │Router│
           └───┬──┘192.168.0.1/24
    ┌──────────┴───────┬─────────┬─────────────┐
    │                  │         │             │
    │192.168.0.101     │         │             │
┌───┴──┐           ┌───┴───┐ ┌───┴───┐     ┌───┴───┐
│Server│           │Client1│ │Client2│ ... │Client5│
└──────┘           └───────┘ └───────┘     └───────┘
                 192.168.0.2             192.168.0.6
                           192.168.0.3

在这种情况下,服务器程序将具有如下套接字:

SRC IP,      SRC Port, DST IP,        DST Port
192.168.0.2, 1       , 192.168.0.101, 8080
192.168.0.2, 2       , 192.168.0.101, 8080
...
192.168.0.2, 20000   , 192.168.0.101, 8080
192.168.0.3, 1       , 192.168.0.101, 8080
192.168.0.3, 2       , 192.168.0.101, 8080
...
192.168.0.3, 20000   , 192.168.0.101, 8080
...
192.168.0.6, 1       , 192.168.0.101, 8080
192.168.0.6, 2       , 192.168.0.101, 8080
...
192.168.0.6, 20000   , 192.168.0.101, 8080

但是 WAN 上的客户端会发生什么情况?

     x      x             x
                 x
         Lots of Clients x
         x    x
    x          │ x      x    x
               │      x
             xx│
           xx  xx xx
          xx     x  x
         x  Internet x
          xxxxxxxxxxx
               │ 1.2.3.4
           ┌───┴──┐
           │Router│
           └───┬──┘192.168.0.1
    ┌──────────┘
    │192.168.0.101
┌───┴──┐
│Server│
└──────┘

我没有端口转发以外的经验,所以 imageine 让我来做这件事。(1.2.3.4:8000 到 192.168.0.101:8000)

此时,我预见到了潜在的问题。我担心的是,服务器可能被限制在 65,535 个套接字,因为它只有在连接来自 WAN 时才能看到路由器。

SRC IP,      SRC Port, DST IP,        DST Port
192.168.0.1, 1       , 192.168.0.101, 8080
192.168.0.1, 2       , 192.168.0.101, 8080
...
192.168.0.1, 65355   , 192.168.0.101, 8080

我发现了一些通用的解决方案,例如

  • 高级路由器的 NAT 配置思科或 Juniper
  • DNS RR(受单个公网 IP 限制)
  • 编辑客户端以随机选择端口范围,例如 1.2.3.4:8000 到 :8080。(具有挑战性的前景)
  1. 我的假设是一个真正的问题吗?

  2. 如果我使用 HAProxy,HAProxy 是否应该完全取代路由器?因为如果 HAProxy 仍然放在路由器后面,路由器到 HAProxy 的比例是 1:1,那么上述问题仍然存在。不是吗?

  3. 除了将 WAN 电缆直接插入服务器之外,还有其他可能的解决方案吗?

    目前,我正在考虑使用 HAProxy 进行负载平衡。通过向接口添加地址,我可以使用以下命令连接多达 130,000 个客户端ip addr add 192.168.0.102/24 dev eth0

答案1

我担心的是,服务器可能被限制为 65,535 个套接字,因为只有当连接来自 WAN 时它才能看到路由器。

通常情况下,目标 NAT 又称反向 NAT 又称端口转发不会改变来源IP 地址或端口号。这样就不存在这样的限制了。

许多负载均衡器还会将源 IP:port 转换为其自身池中的 IP:port,以方便反向连接。这取决于配置,也可以通过增加池(即(私有/面向服务器的)IP 地址数量)来缓解。

通常,服务器仅受其自身资源的限制[*1]。其他限制可能来自源 NAT、带宽可用性或来自路径内防火墙、IDS/IPS 等的一般吞吐量限制。

HA 代理可能使用与 NAT 大致类似的端口替换,因此适用相同的逻辑。

[*1] 理论上,每个源 IP 地址(从服务器的角度来看可能是经过转换的)可以同时打开一个可供使用的 TCP 端口连接。临时端口因操作系统而异,范围在 49152-65535 到 1024-65535 之间。

答案2

是的,在 IPv4 和 IPv6 中,套接字由 IP 地址和端口号标识。如果您的所有流量出现必须来自同一个 IP 地址,那么端口数量就会受到限制。事实上,如果您的伪装路由器支持多个服务器在不同的本地地址上侦听同一个端口,那么可用的端口将在它们之间共享。

限制在于,服务器对每个客户端 IP 地址的连接数限制为 65535 个。客户端也是如此。

(实际上少于 65535,因为一些端口被保留 - 具体数量因操作系统而异)。

但主机可以有多个 IP 地址。根据您的操作系统,这甚至可以在单个 NIC 上得到支持。它可能需要额外的配置来避免不对称路由。路由器中的伪装是否支持大量连接是另一个问题。

大多数服务都需要服务器完成大量工作——而且几乎总是最好有 2 个较小的主机来处理任务,而不是一个大的主机。因此,这个限制在现实世界中很少成为约束。

HAProxy 无法解决您的问题。事实上,它强制执行NAT 约束。

相关内容