从服务器实时处理大量数据,并通过UDP将数据发送到iPhone

7

我正在实现一个远程应用程序。服务器将实时处理和渲染数据,以动画方式显示(准确来说是一系列图像)。每次渲染图像时,它将通过UDP传输到接收方的iPhone客户端。

我研究了一些UDP知识,并了解到以下内容:

  • UDP最大大小约为65k。

  • 然而,似乎iPhone只能接收41k的UDP数据包。iPhone似乎无法接收超过此大小的数据包。

  • 当发送多个数据包时,会丢失许多数据包。这是由于UDP处理数据包大小超限造成的。

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

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

压缩数据似乎是必须的,但在这个问题中,我想侧重于UDP部分。通常情况下,如果我们需要实时连续发送大量数据,我们在进行UDP编程时有哪些最佳实践?


你选择UDP而不是TCP有具体的原因吗? - Robert S. Barnes
2个回答

10
假设您有一个非常特定且充分的理由使用UDP,且您需要确保所有数据都到达(即您不能容忍 任何 丢失的数据),那么您需要执行以下几个步骤(这假定是单播应用程序):
  1. 为每个数据包的标头添加序列号。
  2. 确认每个数据包已被接收。
  3. 设置重传计时器,在未收到确认时重新发送数据包。
  4. 跟踪延迟RTT(往返时间),以便知道要设置多长时间的计时器。
  5. 如果对应用程序很重要,则可能需要处理乱序数据到达。
  6. 增加客户端套接字的接收缓冲区大小
此外,您可能会发送得如此之快,以至于在数据甚至进入NIC之前就会在发送机器上内部丢失数据包。在某些系统上,调用select以检查发送套接字的可写性可以解决此问题。此外,调用UDP套接字上的connect可以提高性能,从而减少丢包。
基本上,如果您需要保证有序传递数据,那么您将在UDP之上重新实现TCP。如果您只是出于低延迟的原因而使用UDP,那么您可能可以使用TCP并禁用 Nagle算法。如果您希望在可靠的低延迟传递数据的同时保留数据分组,则另一个可能性是 SCTP ,同样禁用Nagle算法。它还可以提供乱序交付以进一步加速事情。
我建议查看Steven的“Unix网络编程”,其中有一节关于高级UDP和何时适合使用UDP而不是TCP的内容。请注意,他建议不要将UDP用于大量数据传输,尽管现实情况是这对于流媒体应用程序变得越来越普遍。

0

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


抱歉,这并没有什么帮助。您能否进一步详细说明一下? - Karl
1
UDP应用程序的一个好习惯是保持数据包大小低于MTU大小,以避免分段。请注意,MTU大小通常相当低,如1396字节。 - Stefan Arentz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接