通过UDP从服务器向iPhone发送大量实时处理数据

时间:2010-03-05 17:06:09

标签: iphone networking udp real-time

我正在实施一个远程应用程序。服务器将处理&将数据实时渲染为动画。 (准确地说是一系列图像)每次渲染图像时,它都会通过UDP传输到接收的iPhone客户端。

我研究了一些UDP,我知道以下内容:

  • UDP的最大大小约为65k。

  • 但是,似乎iPhone只能接收41k UDP数据包。 iPhone似乎无法接收大于此数据包。

  • 发送多个数据包时,会丢弃许多数据包。这是由于UDP处理过大。

  • 减少数据包大小会增加未丢弃的数据包数量,但这意味着需要发送更多数据包。

我之前从未编写过真正的实用UDP应用程序,所以我需要一些有效的UDP通信指导。在这种情况下,我们正在讨论从服务器实时传输渲染图像以在iPhone上显示。

压缩数据似乎是强制性的,但在这个问题中,我想关注UDP部分。通常,当我们实现UDP应用程序时,如果我们需要实时不间断地发送大量数据,我们可以在高效UDP编程的最佳实践方面做些什么呢?

2 个答案:

答案 0 :(得分:9)

假设您有一个非常具体和充分的理由使用UDP并且您需要所有数据到达(即您无法容忍任何丢失的数据)那么您有一些事情需要做的(这假设是单播应用程序):

  1. 为每个数据包的标头添加序列号
  2. 确认每个数据包
  3. 设置重新传输计时器,如果没有ack recv'ed
  4. ,则重新发送数据包
  5. 跟踪延迟RTT(往返时间),以便您知道为
  6. 设置计时器的时间
  7. 如果这对您的应用程序很重要,可能会处理无序数据到达
  8. 增加客户端套接字上的接收缓冲区大小
  9. 此外,您可能发送得如此之快,以至于您在发送计算机内部丢弃数据包,甚至没有将网卡放到线路上。在某些系统上,在发送套接字上调用select-write-ablity可以帮助解决这个问题。此外,在UDP套接字上调用connect可以加快性能,从而减少丢弃的数据包。

    基本上,如果您需要保证按顺序传送数据,而不是在UDP之上重新实现TCP。如果您使用UDP的唯一原因是延迟,那么您可以使用TCP并禁用Nagle Algorithm。如果您希望打包数据具有可靠的低延迟交付,则另一种可能性是SCTP,同样禁用Nagle。它还可以提供无序交付,以加快速度。

    我会推荐Steven的“Unix Network Programming”,它有一个关于高级UDP的部分,以及何时适合使用UDP而不是TCP。作为一个注释,他建议不要使用UDP进行批量数据传输,尽管现实情况是,这对流式多媒体应用来说正变得越来越普遍。

答案 1 :(得分:0)

小数据包可能比大数据包更好: - )