如何确保UDP服务器不会丢失传入的数据?

时间:2010-01-09 12:06:02

标签: network-programming udp tcp

有一个数据馈送服务器通过UDP接收来自不同客户端的馈送,因为客户端正在如此快速地抽取数据,如果服务器花费时间处理接收到的数据,接收缓冲区很容易变满,所以< / p>

  1. 如果是Feed服务器会有帮助吗? 只是多播它收到的所有数据 到局域网上的其他服务器 数据馈送服务器有第二个 网卡连接?其他每一个 服务器只接收数据 关注处理和离开 其他数据到其他服务器。
  2. 如果传入的数据仍然存在 太快了,有什么策略可以做到 保证不丢失任何数据?
  3. 感谢。

5 个答案:

答案 0 :(得分:1)

尝试的一些策略包括

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

答案 1 :(得分:1)

  1. 如果我理解你的要求那么不,因为你会收到数据然后再发送出来,有效地将你使用的带宽加倍,所以它可能没有帮助。

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

答案 2 :(得分:1)

UDP可以被认为代表“不可靠的数据报协议”。这样就可以立即解释您的问题:您需要可靠性,这是底层协议无法提供的服务。可能你也想要拥塞控制,因为缺乏网络缓冲是一个拥塞的来源,就像缺乏带宽一样。

解决方案是使用除UDP之外的其他东西,或者在UDP之上添加可靠性和拥塞控制;承认和速率限制,基本上。

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

答案 3 :(得分:0)

你需要编写自己的“ack”方法。客户端重新发送chunk直到从已收到的服务器获取ack。

答案 4 :(得分:0)

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

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