纠正丢包(UDP)的代码

the*_*int 6 c++ math udp protocols error-correction

我不知道要寻找什么,因为我得到的所有与“错误纠正代码”有关的东西都与您不知道错误位置的情况有关。因此,这些代码比我需要的要复杂得多,效率低下。

在下文中,请注意位等于数据包(因为仅可能丢失整个数据包,因此该位模拟非常适合)。

是否存在已考虑到您已经知道k位丢失的ECC,而仅提供给您一种在那k个位置重构数据流的方法?另外,由ECC添加的位应该是独立的(最好)。这样,如果数据包的ECC部分内部发生数据包丢失,它仍然可以重构一些原始数据(并非总是会出现k个错误,大多数情况下不会出现任何错误。因此,ECC容错自己是很重要的ECC位已添加)。

这与IMO有很大的不同。对于一个简单的缺失位,我只能使用一个XOR位。但是我不够聪明,无法将其概括为n位。

再说一次,我有n位数据流,而且我知道最多有k位丢失(我真的知道确切是哪一个,并且它们丢失了,不可能发生损坏)。现在,我需要一个编解码器,它可以以尽可能少的开销添加到数据流中来重构它们。我梦想着拥有(n + k)位来纠正n位流中的k个随机位错误:)。最重要的是,理想情况下,如果添加到n位数据流中的k个 ECC位中的任何一个遭到破坏,例如k个位中的c个位都被破坏,那么它仍然应该能够重构(kc)位错误。n位流。

请注意,通过xD我不知道错误位置。

例:

我能想到的一种算法是这个。n位数据流要防止错误。

令p为n的最小相对素数。然后,通过递增j,对i =(p * j)mod n的数据流进行迭代,对通过选择每个偶数j的位获得的子流进行XOR。该子流具有n / 2个元素。迭代后,我们获得了n / 2个元素的奇偶校验。我们可以用相同的方式(取奇数j)获得另一半的奇偶校验。

对于2位丢失,这可减少50%的错误。

好的一面是,我们现在可以任意改善。只需采用下一个较高的相对素数,然后再次执行相同操作即可。现在,我们有25%的错误机会。基本上,每次添加两个额外的奇偶校验位,我们就可以将错误机会减少一半。

Dam*_*mon 6

您需要一个擦除代码(而不是错误检测代码)。错误检测由链路和传输层负责。由于您正在尝试减轻UDP数据包丢失的风险,因此您已经知道丢失了哪些部分,即丢失了丢失的数据包。

在字节(或位)级别上没有擦除或错误,至少没有任何合理的可能性(至少有两个基础协议层,有时是三个,每个层都有一个校验和,可以确保这一点) 。你要么得到一个完整的,完整的数据包,或者你没有。两者之间绝对没有。

Cauchy Reed Solomon码是您可能考虑的一类算法,它们将一定长度的k个数据块转换为k + m个块,并允许最多恢复m次删除原始数据。这种算法的一个特殊情况是奇偶校验,对于它而言,编码和解码都是简单的异或运算,并且m = 1。这是Raid-5中使用的算法,上面的评论中已经提到过。

一句话,您想要长发

作为替代方案,如果您有大量数据要传输给多方,并且想花哨的话,可以考虑使用源代码。这些复杂得多(因而也更慢)并且位效率更低,但是它们允许您创建任意数量的数据包,其中任何k都将重构k长度的原始消息。如果您能够多播到很多都希望获得一组大数据但不必同时开始下载的客户端,则可以节省大量带宽。