【问题标题】:Prevent TCP connections from causing UDP packet loss防止 TCP 连接导致 UDP 丢包
【发布时间】:2011-07-23 17:02:28
【问题描述】:

考虑典型的多人游戏服务器。

允许连接到服务器的客户端下载地图和脚本。创建 TCP 连接来完成此操作很简单。

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

处理此问题的最佳方法可能是什么?通过跟踪时间和send() 在固定的时间间隔以某种方式“限制” TCP 上传连接,这绝对是一个好主意。这样,如果 UDP 数据包丢失开始更频繁地发生,则 TCP 连接可能会受到进一步限制。操作系统是否仍倾向于将数据捆绑在一起而不是稳定地发送出去?我想多久拨打一次send()?我想这样做太频繁会导致数据被缓冲在一起,首先使该方法无效,并且太不频繁地这样做会导致带宽不足(并且使用效率低下)。对于每次向send 发送多少数据,也存在类似的考虑。

【问题讨论】:

    标签: networking tcp udp


    【解决方案1】:

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

    1. 如果您担心丢失 UDP 数据包,您应该考虑不使用 UDP。
    2. 如果您担心在两个函数之间共享带宽,您应该考虑为它们设置单独的管道(带宽)。
    3. 流量整形(听起来就是这样)通常在操作系统中解决。在对您的应用程序进行奇怪的更改之前,您应该朝那个方向看。
    4. 如果您还没有让应用程序运行并遇到此问题,那么您可能过早地进行了优化。

    【讨论】:

    • 您对第 4 点很可能是正确的。我将在开发过程中的更合适的时间点重新讨论这个主题。
    • 函数的“具有单独的管道”到底是什么意思?这是否意味着拥有多个互联网连接?还是有别的办法?
    【解决方案2】:

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

    要实现涉及 UDP 的任何形式的速率限制,您首先需要计算 UDP 丢失率。 UDP 数据包需要有序列号,然后客户端必须计算它实际收到的唯一数据包的数量,并将此信息发送回服务器。这给了你丢包率。服务器应该对此进行监控,如果在文件传输开始后丢包跳跃,则开始降低传输速率,直到丢包变得可以接受。 (无论如何,您可能需要对 UDP 执行此操作,因为 UDP 没有拥塞控制。)

    请注意,虽然我在上面提到了“服务器”,但它实际上可以是任一方向,或两者兼而有之。取决于谁需要发送什么。想象一个游戏,玩家创建的地图通过点对点连接传输这些地图。

    虽然降低传输速率可以像不那么频繁地调用发送函数一样简单,但尝试以这种方式控制 TCP 无疑会与 TCP 现有的速率控制相冲突。正如另一个答案中所建议的,您可以考虑寻找更全面的方法来控制 TCP。

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

    这是一个优秀的文章系列,解释了 TCP 和 UDP 的一些可能用途,特别是在网络游戏的上下文中。 TCP vs. UDP

    在该系列的后续文章中,他甚至解释了一种使 UDP“几乎”与 TCP 一样可靠的方法(带有代码示例)。

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

    【讨论】:

      【解决方案3】:

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

      没错。 UDP 意味着不保证数据包的传递,尤其是在互联网上。检查 TCP 速度,这对于大多数玩游戏的用户来说在现代互联网连接中是完全可以接受的。

      【讨论】:

      • 问题似乎更多是关于如何防止 TCP 连接形式导致大部分 UDP 数据包丢失。当然,有些游戏会出现延迟。在某些情况下,使用 UDP 和精心实施的协议可以减轻这种滞后。因此,与如何避免丢失一些 个数据包无关,而是如何避免丢失几乎所有 个数据包。他可以在UDP中完成所有事情。只要服务器能够在客户端开始滞后时处理事情,TCP 连接仍然可以正常工作。 (否则每个人都被最慢的连接卡住了。)
      • 是的,问题的重点是 TCP 是用于获得快速文件传输的正确工具(具有开箱即用的流量和拥塞控制实现),但我们也希望还有一点好处,那就是让 UDP 流量的延迟尽可能不受影响。鉴于无限的开发资源,使用原始数据报并重新实现 TCP 的一个子集,它知道其余的要求,以便它可以优先考虑连接将是要走的路。
      猜你喜欢
      • 1970-01-01
      • 2018-03-18
      • 2010-10-21
      • 2019-07-29
      • 2014-07-13
      • 2012-08-18
      • 1970-01-01
      相关资源
      最近更新 更多