在.NET/Windows Server中最大传出套接字连接数是多少?

12

我有一个稍微不寻常的情况,需要在我的服务器上为成千上万的移动用户维护到另一台服务器的CLIENT tcp连接(基本上移动设备在能够连接时连接到我的中间层服务器,该服务器对第三方服务器进行更稳定的连接维护)。

无论如何,我使用异步套接字(包装在SslStream中)开发了我的服务器应用程序,并且现在有1000个客户端会话全天在其上运行。目前为止,我对结果感到非常满意,因为我在单核处理器上看到平均0-10%的CPU使用率,以及随着时间推移使用约60MB的RAM。

我的问题是,如何扩展这个系统,以便我可以在我的服务器上运行100,000或200,000或更多个客户端会话?再次说明,这有点不传统,因为我的服务器实际上并不像服务器那样运作,因为我担心的是出站连接,而不是入站连接。

我知道有一个MaxUserPort注册表设置需要更改,以超过默认值,似乎默认值为5000。但是,似乎还有另一个硬限制为65535,我对该限制的位置并不太清楚。 这是每个网络接口的限制吗? 这是全局Windows限制吗? 这是每个进程的限制吗?

如果这是每个网络接口的限制,那我可以添加多个网络接口,并将客户端会话套接字绑定到每个接口(例如:在接口1上使用65k,在接口2上使用65k等)吗?

我也不太确定是否需要设置任何套接字选项或属性来帮助提高性能。 我现在没有使用任何套接字选项。

非常感谢任何关于此主题的想法,因为在这个主题上得到清晰的建议非常困难。 谢谢!

2个回答

11

Windows机器可以轻松地扩展到非常高数量的打开连接。64k临时端口限制是每个IP地址而不是每台机器。如果您需要更多的临时端口,请像@SuperTux建议的那样增加限制,但还要为机器分配更多的IP地址。为了利用这一点,您将需要在客户端套接字上手动调用Bind()并传递一个来自具有空闲端口的池中的源IP地址(这也意味着您将负责跟踪可用的每个地址的临时端口计数)。许多高端设备类型都会这样做(例如负载均衡器上的SNAT池),以支持数十万个并发连接。

繁琐的簿记工作虽然麻烦,但比为每个64k客户端连接投入未充分利用的硬件更好。


这是否意味着我可以创建一个本地IPEndPoint,端口为0,但是指定网络接口的IP地址,它会找出可用的临时端口?例如:对于120,000个连接,我需要服务器上的2个IP,并且我负责将一半的连接绑定到每个IP地址?我的想法是将进程分配给特定的IP地址,然后也将客户端会话帐户分配给IP地址。因此,我想说如果我的假设正确,我不必担心要绑定到哪个特定的本地端口,那么“簿记”工作就不会那么糟糕。 - Redth
还有,我在使用套接字时需要注意什么特别的吗?有没有特定的SetSocketOption()函数需要使用,我需要担心UseOnlyOverlappedIO或ExclusiveAddressUse属性吗? - Redth
3
IP协议栈将跟踪各个空闲/繁忙端口。默认的套接字选项应该可以正常工作,除非您计划在进程之间传递套接字。 - nitzmahone
太好了,谢谢。我不打算在进程之间传递套接字或其他东西。这很简单,我将为每个帐户分配一个单独的IP,并确保分配给IP的帐户数不超过临时端口数。 - Redth

3

65355是IP协议的限制,更重要的是大多数操作系统的TCP/IP栈所施加的限制也是这个。

为了在Windows上增加最大临时端口数量,请按照以下步骤操作:

  1. 启动注册表编辑器。
  2. 找到注册表中的以下子键,然后单击“参数”: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  3. 在“编辑”菜单上,单击“新建”,然后添加以下注册表条目:

    值名称:MaxUserPort

    值类型:DWORD

    值数据:65534

    有效范围:5000-65534(十进制)

    默认值:0x1388(5000 十进制)

    描述:此参数控制当程序请求系统中的任意可用用户端口时使用的最大端口号。通常,短暂的(临时的)端口是在1024和5000之间分配的。

通常为了扩展到超过65K个端口,您需要在集群中使用多台服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接