netTcp异步回调在互联网上执行得非常慢?

时间:2012-05-28 19:22:36

标签: wcf silverlight iis firewall nettcpbinding

我在IIS 7中使用netTcpBinding托管了双工语音和视频聊天服务。该服务的使用者是Silverlight客户端。客户端在服务上调用一个方法:SendVoiceAsync(byte[] buffer)每秒10次(每100毫秒),服务应该每秒调用客户端10次(在每次调用时) 。我已经在局域网中严格测试了我的服务并且它运行良好,每发送一次语音/视频缓冲区到服务的100个呼叫,该服务在该时间段内使用接收到的语音缓冲区将其他客户端调回100次。然而,当我通过互联网使用服务时,它变得非常缓慢,滞后非常严重,并且经常给我一个超时错误。我注意到,通过HTTP,回调的速度大约是每次调用服务器的十分之一,因此对于服务的每100次调用,服务器调用客户端10次,当这个数字应该是100(就像它在局域网中)或非常接近它的东西。

那么什么可能导致服务变得如此滞后于HTTP?我遵循了关于配置netTcpBinding以获得优化性能的一般指导原则,虽然它似乎在局域网中支付了红利,但它在互联网上却很糟糕。虽然我已经禁用了所有防火墙,并且转发了托管该服务的网站所在的端口4502-4535和端口80,但感觉有些事情阻止了客户端发送回复服务。服务器电脑。如果有帮助,我的服务ConcurrencyMode设置为Multiple,而InstanceContextMode设置为Single。此外,我的服务操作都是单向的,而不是请求 - 回复。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

互联网是比LAN更嘈杂和困难的网络:​​数据包可能会丢失,通过不同的路由器/交换机重新路由,延迟通常非常糟糕。

这就是TCP存在的原因,它是一个有序的,可靠的协议,所以每个数据包都由接收方确认,如果没有,则重新发送。
问题在于它不会试图加快速度,它会尝试将所有数据发送到它所发送的顺序。

所以我对你的设置在局域网中工作并不感到惊讶,因为LAN往返时间(RTT)通常大约是5~80 ms,但是在250毫秒的RTT是正常的互联网上失败了。

您可以尝试更少地发送数据,并切换到UDP,它是无序的,不可靠但比TCP快。我认为UDP是互联网上语音/视频的标准配置,因为您可以通过轻微降低语音/视频质量来补偿丢失的数据包。

在线游戏遇到同样的问题,例如原来的Quake在互联网上无法播放。