哪种是按顺序发送大型UDP数据包的最佳方法

Fer*_*ira 5 java sockets networking android udp

我有一个Android应用程序,需要每100毫秒通过协议UDP发送数据.每个UDP数据包平均有15000字节.数据包以广播形式发送

下面每100毫秒行都会循环一次.

DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, broadcast, 9876); 
clientSocket.send(sendPacket);
Run Code Online (Sandbox Code Playgroud)

应用程序开始正常工作,但在大约1分钟后,接收到的数据包的频率会降低,直到数据包没有到达目的地.

UDP数据包的最大大小的理论限制(在Windows上)为65507字节

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

我不明白为什么在最初的1分钟内数据包被正确发送,一段时间后数据包不再到达.所以我想知道解决这个问题的最佳方法是什么?

Dav*_*rtz 12

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

You need to keep your broadcast datagrams small enough not to fragment. If you have a stream of 65,507 byte chunks such that you cannot change the fact that you must have the whole chunk for the data to be useful, then naive UDP broadcast was bad choice.

我必须更多地了解您的应用程序的细节,以提出合理的建议.但是如果你有大约64KB的数据,这样你需要整个数据块才能使数据变得有用,并且你无法改变它,那么你应该使用一种方法将这些数据分成具有一定冗余的碎片,以便有些碎片可能丢失.使用擦除编码,您可以将65,507个字节的数据分成46个块,每个块包含1,490个字节,这样原始数据就可以从任何44个块中重建.这将容忍中等数据报丢失,数据大小仅增加约4%.