WCF 双工服务和 TCP 端口耗尽

Posted

技术标签:

【中文标题】WCF 双工服务和 TCP 端口耗尽【英文标题】:WCF Duplex Service and TCP Port Exhaustion 【发布时间】:2010-09-22 03:06:53 【问题描述】:

我正在努力解决这个问题。我正在制作一个特定于业务的消息传递应用程序,它将通过 WCF(没有 ***s,全网)将 5000 到 10,000 台机器连接回我们的数据中心。它主要用于警报,我需要能够直接向特定客户端发送消息,而 WCF 允许我使用双工合同来完成所有这些工作,但是对于这么多客户端,它让我开始考虑最大化 TCP 端口空间65535 个端口。

我将假设所有入站连接都将通过我选择的任何端口进入,但返回客户端的出站连接将分别使用一个端口。我很好奇 WCF 端口共享服务是否可以解决此问题,或者它是否只有 65535 个端口到 IP 地址?那么,MSN Messenger 之类的如何处理这种情况。诚然,我可能永远达不到它,但至少我正在进入这个领域。

或者服务端的 WCF 双工合约是在客户端期间保持端口打开以进行回调,还是释放它?

【问题讨论】:

【参考方案1】:

在高打开/关闭事务环境中耗尽默认 TCP 堆栈仍然很容易,例如服务于非持久连接的套接字服务器。

默认的 TIME-WAIT 延迟会加剧这种情况 - 套接字在被回收之前必须关闭的时间量 - 默认为 90 秒(如果我没记错的话)

要从我的其他线程中回收一些位 - 有一堆可以调整的注册表项 - 建议至少创建/编辑以下键

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

TcpTimedWaitDelay = 30
MaxUserPort = 65534 
MaxHashTableSize = 65536 
MaxFreeTcbs = 16000 

MSDN 和 Technet 上有大量关于这些键功能的文档。例如

http://technet.microsoft.com/en-us/library/cc776295.aspx

为套接字服务器应用程序调整这些键是很常见的,例如SQL、Biztalk、IIS 等

【讨论】:

【参考方案2】:

我认为每个端口实际上是 DestinationTCPAddress 和端口号的组合 - 所以你不会用完。

即您可以在同一个源端口上与多个订阅者通话。这只是容量问题。

【讨论】:

【参考方案3】:

如果这些连接都是并发的,那么您需要确保您的防火墙可以同时处理这么多的连接。

状态防火墙需要记录通过它们的每个正在进行的连接,以便它们可以判断是否允许后续数据包。小型防火墙具有数百个会话限制的情况并不少见。

【讨论】:

【参考方案4】:

连接在源地址、目标地址、源端口、目标端口方面是不同的(至少在 IP 层)。对最大连接数的某种操作系统限制可能会成为一个问题,但不要以为端口号本身就是任何现实限制。

【讨论】:

以上是关于WCF 双工服务和 TCP 端口耗尽的主要内容,如果未能解决你的问题,请参考以下文章

WCF net.tcp 绑定:托管多个服务是不是需要端口共享?

如何使用 NetTcpBinding (WCF) 找到可用的 TCP 端口(以便服务器可以绑定到它)

防止短连接耗尽你的动态TCP端口

【nginx】如何解决使用nginx作为反向代理端口耗尽问题?

Wcf 回调网络 tcp 双工仅 1 路故障

net.tcp协议共享tcp端口的功能