2013-09-27 52 views
4

我有一个android应用程序需要通过协议UDP每100毫秒发送一次数据。每个UDP数据包平均有15000字节。数据包以广播形式发送按顺序发送大型UDP数据包的最佳方法

下面的每个100毫秒的行都通过循环运行。

DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, broadcast, 9876); 
clientSocket.send(sendPacket); 

应用程序启动时工作正常,但之后收到的数据包约1分钟的频率减小,直到数据包不会在到达目的地。

理论极限(在Windows上)对于UDP数据包的最大尺寸为65507个字节

我知道网络的媒体MTU是1500个字节,当我发送一个数据包越大它被分解成几个片段如果一个片段没有到达目的地,那么整个包就会丢失。

我不明白为什么最初1分钟的数据包发送正确,过了一段时间数据包不会到达更多。所以我想知道解决这个问题最好的办法是什么?

+0

BTW碎片也可能无序到达。 ;) –

+1

我认为TCP不是一个选项? –

+0

我正在发送图片,如果我失去了一些30%的数据包不会成为问题。在这种情况下,tcp较慢并不是一个好主意。我的问题是所有数据包在一段时间后都会丢失。谢谢 –

回答

10

这正是你所描述的问题。您广播的每个数据报被分成44个数据包。如果其中任何一个丢失,数据报将丢失。只要有足够的流量导致1%的数据包丢失,就会有35%的数据报丢失。 2%的数据包丢失等于60%的数据报丢失。

你需要保持你的广播数据报足够小,不要碎片。如果你有一个65,507字节的数据流,这样你就不能改变你必须让整个数据块有用的事实,那么天真的UDP广播是不好的的选择。

我必须知道更多关于应用程序的具体信息才能提出明智的建议。但是,如果你有大约64KB的大量数据,这样你需要整个数据块才能有用,而且你不能改变它,那么你应该使用一种方法,将数据分成若干冗余,一些碎片可能会丢失。通过erasure coding,您可以将65,507个字节的数据分成46个块,每个块包含1,490个字节,这样原始数据就可以从任意44个块中重新构建。这将容忍中等数据报丢失,数据大小只增加约4%。

+0

(对于OP)一个选项是将UDP消息拆分为几个较小的UDP消息,因此如果丢失一个数据包,则只有一小部分数据丢失。当然,这意味着您可能需要一种机制来在接收方“重建”原始消息,这可能会要求重复丢失数据报。在UDP上有效地实现(类似)TCP。 – SJuan76

+0

并非如此不寻常,实际上这就是OpenVPN的工作原理。 – SJuan76

+0

我有一个android应用程序,它使用opencv分析来自摄像头的帧并通过UDP将这些帧发送到另一个设备。我会尝试压缩更多的帧并将其分成冗余的图表,然后研究擦除代码。谢谢你的提示。我只是不明白为什么平均1分钟执行后会有更大的包丢失。 –

2

当您需要可靠和正确的订购交货时,TCP专门用于代替UDP。但是,假设你真的需要UDP广播,你可以:

  1. 调试网络,看看如何&,其中包丢失,或者它是堵塞/滞后的接收器。但是你经常无法控制这些东西。是否涉及WiFi网络?如果是这样,很难获得良好的QoS。

  2. 在应用层上做些什么来确保订购和可靠的交付。例如,SIP通常使用UDP,但该协议使用事务和序列号,因此客户端将根据需要重新传输消息。

  3. 实现丢包隐藏。使用数学方法,接收器可以重新创建丢失的数据包,类似于RAID磁盘设置如何丢失驱动器并仍能正常工作。

您的设置可以正常工作一分钟,然后不会暗示广播或接收端有网络拥塞或软件拥塞。

你可以用Wireshark做一些数据包捕获并分享结果吗?

+0

我不知道Wireshark。我会读一读。我没有想过要在网络上进行调试。对我来说可能是一个好主意,可以了解正在发生的事情并了解更多信息。谢谢你的提示。 –

+0

我只是选择UDP,因为我的应用程序发送一系列图像,每个包一个图像,并且应用程序丢失了一些没有问题的包。我希望传输尽可能快,所以我选择了UDP。数据通过使用WIFI的专用网络传输。 –