【问题标题】:How to assure a UDP server does not lose incoming data?如何确保 UDP 服务器不会丢失传入的数据?
【发布时间】:2010-01-09 12:06:01
【问题描述】:

有一个数据馈送服务器通过UDP接收来自各个客户端的馈送,因为客户端抽数据的速度非常快,如果服务器花时间处理接收到的数据,接收缓冲区很容易被填满,所以

  1. 如果提要服务器会有所帮助吗? 只是多播它收到的所有数据 到 LAN 上的其他服务器 数据馈送服务器有第二个 网卡连接到?彼此的每一个 服务器只接收它的数据 处理和离开的担忧 其他数据到其他服务器。
  2. 如果传入的数据仍然到达 太快了,有什么策略可以 确保不丢失任何数据?

谢谢。

【问题讨论】:

    标签: network-programming udp tcp


    【解决方案1】:

    可以尝试的一些策略包括

    • 确保接收进程在接收线程中做的很少,只需读取数据并发布到内部队列以在另一个线程上处理 - 这应该会减少接收缓冲区填满的可能性
    • 在您的消息中包含一个序列号。如果接收者注意到丢失的消息,它可以从发布者重新请求它。此重新请求将非常昂贵,但会使一般情况非常快。这假设发布者要么在内存中保留合理数量的已发布消息(以允许重新请求),要么将它们保存在某个地方以应对重放。

    【讨论】:

      【解决方案2】:
      1. 如果我理解您的要求,那么不会,因为您将接收数据然后再次将其发送出去,有效地使您使用的带宽增加一倍,因此它可能无济于事。

        李>
      2. 确保不丢失数据的最佳策略是使用 TCP over UDP。但是,如果您必须使用 UDP,您可以编写一些代码对每个发送的数据包进行编号(这样您就可以确保它们按顺序到达),并添加更多功能以允许服务器请求丢失的数据包,例如:发送方发送1、2、3、4,但Receiver只收到1、2、4,然后再次请求3。

      【讨论】:

      • 感谢您的 cmets。但是如果客户端(传入数据)和其他服务器位于两个独立的网络中(数据馈送服务器有两个 NIC,一个用于接收传入的馈送,另一个用于转发数据),带宽不会有问题吗?不是吗?
      【解决方案3】:

      UDP 可以被认为代表“不可靠的数据报协议”。这样就可以立即解释您的问题:您需要可靠性,这是底层协议不提供的服务。可能您也需要拥塞控制,因为缺少网络缓冲区与缺少带宽一样会导致拥塞。

      解决方案是使用 UDP 以外的东西,或者在 UDP 之上增加可靠性和拥塞控制;本质上是确认和速率限制。

      UDP 的可能替代品包括 TCP 和 SCTP。 SCTP 会很好,因为它具有数据报模式,因此您不必将协议转换为使用流。见这里:http://en.wikipedia.org/wiki/Stream_Control_Transmission_Protocol

      【讨论】:

        【解决方案4】:

        你需要编写自己的“ack”方法。客户端重新发送块,直到从服务器收到它的确认。

        【讨论】:

        • 很快,您将拥有一个损坏的 TCP 版本。使用 TCP 或接受 UDP 限制。
        【解决方案5】:

        如果您需要 UDP 的可靠性,那么您必须在其之上构建自己的。正如其他人所说,您需要某种方法将 ACK 从一个对等方发送到另一个对等方,以告诉另一个对等方数据已安全到达。然后,其他对等方可以选择性地重新发送数据报,直到它们被确认为止。

        我在这里有一个问题:What do you use when you need reliable UDP?,它正在收集各种选项以增加基于 UDP 的传输的可靠性。

        【讨论】:

          猜你喜欢
          • 2020-06-15
          • 2021-12-30
          • 2020-06-23
          • 2015-03-05
          • 1970-01-01
          • 2015-12-02
          • 2012-02-26
          • 2012-03-27
          • 1970-01-01
          相关资源
          最近更新 更多