2011-03-27 128 views
1

考虑原型多人游戏服务器。防止TCP连接导致UDP数据包丢失

连接到服务器的客户端可以下载地图和脚本。创建一个TCP连接来实现这一点很简单。

但是,服务器必须通过UDP继续响应其他客户端。如果允许TCP下载连接饱和可用带宽,则UDP流量将严重受到数据包丢失的影响。

什么可能是解决此问题的最佳方法?这绝对是一个好主意,可以通过跟踪时间来“节流”TCP上传连接,并且按照固定的时间间隔进行“上传”。这样,如果UDP数据包丢失开始更频繁地发生,则TCP连接可能会进一步受到限制。操作系统是否仍然倾向于将数据集中在一起,而不是稳定地发送数据?我多久会打电话给send()?我认为经常这样做会导致数据被缓冲到一起,从而导致该方法无效,并且过于频繁地执行会导致带宽不足(并且效率低下)。关于每次有多少数据到send存在类似的考虑。

回答

2

这听起来很像你解决问题的错误方式:

  1. 如果你担心失去UDP数据包,您应该考虑不使用UDP。
  2. 如果您担心在两个功能之间共享带宽,您应该考虑为它们分开管道(带宽)。
  3. 流量整形(这听起来像这样)通常在OS中解决。在对应用程序进行奇怪的更改之前,您应该朝这个方向看。
  4. 如果您尚未使应用程序正常工作并遇到此问题,则可能是过早地进行了优化。
+0

关于第4点,您可能是正确的。我将在开发过程中更适当的位置重新讨论此主题。 – 2011-03-27 02:25:15

+0

关于第3点也是如此:) – scherand 2011-03-28 09:31:00

+0

对于函数,“具有独立管道”是什么意思?这是否意味着有多个互联网连接?还是有另一种方式? – Meta 2016-09-23 19:39:15

0

“#如果你担心丢失UDP数据包,你应该考虑不使用UDP。”

对。 UDP意味着没有数据包传送的保证,特别是在互联网上。对于大多数玩游戏的用户来说,检查现代互联网连接中可以接受的TCP速度。

+0

这个问题似乎更多的是关于如何防止造成UDP数据包MOST丢失的TCP连接形式。有确实存在滞后的游戏。在某些情况下,使用UDP和仔细实施的协议可以减轻这种滞后。因此,如何避免丢失某些数据包并不那么重要,因为它是如何避免丢失几乎所有数据包的。他可以在UDP中完成整个事情。只要服务器能够胜任客户端启动滞后时如何处理事务,TCP连接仍然可以正常工作。 (否则,每个人都会遇到最慢的连接。) – Meta 2016-09-23 19:46:38

+0

是的,问题的主要观点是TCP是获得快速文件传输的理想工具(具有流畅和拥塞控制的开箱即用的稳固实现),但是我们也希望有另一块蛋糕让UDP流量的延迟尽可能不受影响。给定无限的开发资源,使用原始数据报并重新实现TCP的一个子集,以了解其余的需求,以便它可以优先考虑连接。 – 2016-09-25 14:28:45

1

为避免饱和带宽,您需要应用某种速率限制。 TCP实际上已经这样做了,但在某些情况下可能无效。例如,你不知道你认为TCP或UDP流量更重要。

要实现任何形式的速率限制包括UDP的,你首先需要计算UDP损失率。 UDP数据包需要有序列号,然后将客户端计算它实际上有多少独特的包了,并将该信息发送回服务器。这给你丢包率。服务器应该监视它,并且如果在文件传输开始后数据包丢失跳转,请开始降低传输速率,直到数据包丢失变得可接受。 (您可能需要为UDP做到这一点无论如何,因为UDP没有拥塞控制)。

请注意,当我提到上述“服务器”,才可能真正做到无论方向,或两者兼而有之。取决于谁需要发送什么。想象一下,与转让这些地图与对等网络连接播放器创建的地图游戏。

虽然降低传输速率可能很简单,因为调用您的发送函数的频率较低,尝试以这种方式控制TCP无疑会与现有的速率控制TCP冲突。正如另一个答案中所建议的,您可能会考虑研究更全面的方法来控制TCP。

在这种特殊情况下,我怀疑这将是一个问题,除非你真的需要发送大量的UDP信息客户端正在传输文件。 我希望大多数游戏都能在这种情况发生时显示加载屏幕或大厅。除非你的游戏拥有自己的VOIP,否则都不需要太多的UDP流量。

这是一篇很好的文章系列,解释了TCP和UDP的一些可能的用途,特别是在网络游戏中。 TCP vs. UDP

在以后的系列文章中,他甚至解释了一种使TCP像UDP一样可靠的方法(带有代码示例)。

和往常一样......并测量您的结果。除非您测量,否则您无法知道您的代码是否更快或更慢地进行连接。