我正在实施一个远程应用程序。服务器将处理&将数据实时渲染为动画。 (准确地说是一系列图像)每次渲染图像时,它都会通过UDP传输到接收的iPhone客户端。
我研究了一些UDP,我知道以下内容:
UDP的最大大小约为65k。
但是,似乎iPhone只能接收41k UDP数据包。 iPhone似乎无法接收大于此数据包。
发送多个数据包时,会丢弃许多数据包。这是由于UDP处理过大。
减少数据包大小会增加未丢弃的数据包数量,但这意味着需要发送更多数据包。
我之前从未编写过真正的实用UDP应用程序,所以我需要一些有效的UDP通信指导。在这种情况下,我们正在讨论从服务器实时传输渲染图像以在iPhone上显示。
压缩数据似乎是强制性的,但在这个问题中,我想关注UDP部分。通常,当我们实现UDP应用程序时,如果我们需要实时不间断地发送大量数据,我们可以在高效UDP编程的最佳实践方面做些什么呢?
答案 0 :(得分:9)
假设您有一个非常具体和充分的理由使用UDP并且您需要所有数据到达(即您无法容忍任何丢失的数据)那么您有一些事情需要做的(这假设是单播应用程序):
此外,您可能发送得如此之快,以至于您在发送计算机内部丢弃数据包,甚至没有将网卡放到线路上。在某些系统上,在发送套接字上调用select-write-ablity可以帮助解决这个问题。此外,在UDP套接字上调用connect可以加快性能,从而减少丢弃的数据包。
基本上,如果您需要保证按顺序传送数据,而不是在UDP之上重新实现TCP。如果您使用UDP的唯一原因是延迟,那么您可以使用TCP并禁用Nagle Algorithm。如果您希望打包数据具有可靠的低延迟交付,则另一种可能性是SCTP,同样禁用Nagle。它还可以提供无序交付,以加快速度。
我会推荐Steven的“Unix Network Programming”,它有一个关于高级UDP的部分,以及何时适合使用UDP而不是TCP。作为一个注释,他建议不要使用UDP进行批量数据传输,尽管现实情况是,这对流式多媒体应用来说正变得越来越普遍。
答案 1 :(得分:0)
小数据包可能比大数据包更好: - )