我有一个 Android 应用程序,需要每 100 毫秒通过 UDP 协议发送数据。每个UDP数据包平均有15000字节。数据包以广播方式发送
下面的每 100 毫秒行就会运行一次循环。
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, broadcast, 9876);
clientSocket.send(sendPacket);
应用程序开始正常工作,但大约 1 分钟后,接收数据包的频率降低,直到数据包无法到达目的地。
UDP 数据包最大大小的理论限制(在 Windows 上)为 65507 字节
我知道网络的媒体 MTU 是 1500 字节,当我发送较大的数据包时,它会被分成几个片段,如果片段未到达目的地,则整个数据包都会丢失。
我不明白为什么最初 1 分钟数据包被正确发送,但过了一段时间数据包就不再到达。所以我想知道解决这个问题的最佳方法是什么?
这正是你所描述的问题。您广播的每个数据报都分为 44 个数据包。如果其中任何一项丢失,数据报就会丢失。一旦有足够的流量导致 1% 的数据包丢失,就会导致 35% 的数据报丢失。 2% 的数据包丢失相当于 60% 的数据报丢失。
您需要保持广播数据报足够小,以免产生碎片。如果您有一个 65,507 字节块的流,因此您无法更改必须拥有整个块才能使数据有用的事实,那么朴素的 UDP 广播就是bad choice.
我必须更多地了解您的申请的具体情况才能提出明智的建议。但是,如果您有大约 64KB 的数据块,需要整个数据块才能发挥作用,并且您无法更改这一点,那么您应该使用一种方法将该数据划分为具有一定冗余的片段,这样有些碎片可能会丢失。和纠删码 http://en.wikipedia.org/wiki/Erasure_code,您可以将 65,507 字节的数据分为 46 个块,每个块 1,490 字节,这样就可以从任意 44 个块重建原始数据。这可以容忍适度的数据报丢失,而数据大小仅增加约 4%。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)