我不知道要寻找什么,因为我从“纠错代码”中得到的只是与您不知道错误位置的情况相关的内容。因此,这些代码比我需要的要复杂得多,而且效率低下。
在下文中,请注意位等于数据包(因为只有整个数据包可能会丢失,因此位类比非常适合)。
是否有 ECC 考虑到您已经知道的内容k-位丢失,只为您提供一种重建数据流的方法k地方?另外,ECC 添加的位应该是独立的(最好)。这样,如果数据的ECC部分发生丢包,它仍然可以重建一些原始数据(并不总是会有k个错误,大多数情况下不会有。所以ECC对自己的容错很重要添加了 ECC 位)。
在我看来,这是一个很大的区别。对于一个缺失的位,这很简单,我可以只使用一个异或位。但我不够聪明,无法将其推广到 n 位。
再说一遍,我有一个流n-位,我知道直到k位丢失了(我真的知道哪些位丢失了,并且它们丢失了,损坏是不可能的)。现在我需要一个编解码器,可以在尽可能少地添加到数据流的开销的情况下重建它们。我梦想着拥有(n+k)要纠正的位k随机位错误n位流:)。最重要的是,理想情况下,如果其中任何一个kECC 位添加到n位数据流被损坏,就像说c的位k位被损坏,那么它仍然应该能够重建(k-c)位错误在n比特流。
请注意 ofc,尽管 xD,我事先并不知道错误位置。
Example:
我能想到的一种算法是这样的。要防止错误的 n 位数据流。
令 p 为 n 的最小相对素数。然后通过 i = (p * j) mod n 迭代数据流,通过递增 j,对通过选择每个偶数 j 的位获得的子流进行异或。该子流有 n/2 个元素。迭代后,我们获得了 n/2 个元素的奇偶校验。我们可以用同样的方法得到另一半的奇偶性(取奇数j)。
这使得 2 位丢失的错误减少了 50%。
好的一面是我们现在可以任意变得更好。只需取下一个更高的相对素数并再次执行相同的操作即可。现在我们的错误率是 25%。基本上,每次添加两个额外的奇偶校验位,我们就可以将错误机会减少一半。
你需要一个erasure代码(不是错误检测代码)。错误检测由链路层和传输层负责。由于您正在尝试减少 UDP 数据包丢失,因此您已经知道哪些部分丢失了——丢失的数据包丢失了。
字节(或位)级别上不存在擦除或错误,至少不存在任何合理的可能性(至少有两个底层协议,有时是三个,每个层都有一个校验和,以确保这一点) 。你either接收完整、完整的数据报,或者你不。从来没有介于两者之间的任何事情。
柯西里德所罗门码是您可以考虑的一类算法,这些变换k一定长度的数据块k+m块,并且最多允许恢复给定的原始数据m删除。这种算法的一个特例是parity,编码和解码都是简单的异或运算,并且m=1。这正是 Raid-5 中使用的算法,在上面的评论中提到过。
一言以蔽之,你想要longhair https://github.com/catid/longhair.
作为替代方案,如果您有大量数据要传输给多方,并且您想要更花哨,则可以考虑喷泉代码。这些更复杂(因此更慢)且位效率较低,但它们允许您创建任意数量的数据包,其中any k将重建 k 长度的原始消息。如果您能够向许多都需要一大组数据但不一定同时开始下载的客户端进行多播,那么您可以节省大量带宽。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)