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 端口(以便服务器可以绑定到它)