0

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

那么是什么导致服务在 HTTP 上变得如此滞后呢?我遵循了配置netTcpBinding优化性能的一般准则,虽然它似乎在 LAN 中带来了好处,但在互联网上却很糟糕。感觉好像有什么东西阻止了客户端向服务发送回复,尽管我已经禁用了所有防火墙,并将托管服务的网站所在的端口4502-4535和端口转发到服务器计算机。80如果有帮助,我的服务已ConcurrencyMode设置为Multiple,并且已InstanceContextMode设置为Single。此外,我的服务操作都是一种方式,而不是请求回复。

谢谢你的帮助。

4

1 回答 1

1

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

这就是 TCP 存在的原因,它是一个有序、可靠的协议,因此每个数据包都会被接收方确认,如果没有成功则重新发送。
这样做的问题是它不会尝试快速,它会尝试按照发送的顺序获取所有发送的数据。

因此,您的设置在 LAN 中工作我并不感到惊讶,因为 LAN 往返时间 (RTT) 通常约为 5 ~ 80 毫秒,但在互联网上发生故障时,RTT 为 250 毫秒是正常的。

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

在线游戏也存在同样的问题,例如最初的雷神之锤无法在互联网上播放。

于 2012-05-28T21:31:12.763 回答