错误纠正丢包代码(UDP)

时间:2015-03-08 08:02:40

标签: c++ math udp protocols error-correction

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

在下文中,请注意位等于数据包(因为只有整个数据包可以丢失,因此比特类比非常适合)。

是否有ECC考虑到您已经知道WHICH k -bits缺失,并且只为您提供了在 k 位置重建数据流的方法?另外,ECC添加的比特应该是独立的(优选地)。这样如果丢包发生在数据的ECC部分内部,它仍然可以重建一些原始数据(并不总是会有k个错误,大多数都没有。因此,ECC对其自身具有容错能力非常重要增加了ECC位。)

这是IMO的一大不同。对于一个缺失的位,它很简单,我只能使用一个XOR位。但我并不聪明地把它推广到n位。

所以再一次,我有一个 n -bits的流,我知道 k 位缺失了(我真的知道哪些是准确的,它们是失踪,腐败是不可能的)。现在我需要一个可以重建它们的编解码器,尽可能少地增加数据流的开销。我梦想有(n + k)位来纠正 n 位流中的 k 随机位错误:)。最重要的是,理想情况下,如果添加到 n 位数据流中的任何 k ECC位被破坏,例如 c k 位被破坏,然后它仍然能够重建 n 位流中的(kc)位错误。

请注意我通过xD预先知道错误位置。

示例:

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

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

这使得2位丢失的误差减少50%。

光明的一面是我们现在可以任意改善。只需采取下一个更高的相对素数并再次做同样的事情。现在我们有25%的错误几率。基本上我们可以在每次添加两个额外的奇偶校验位时将错误几率降低一半。

3 个答案:

答案 0 :(得分:5)

您需要删除代码(不是错误检测代码)。错误检测由链接和传输层负责。由于您正在尝试减少UDP数据包丢失,因此您已经知道哪些部分丢失了 - 丢失的数据包丢失了。

在字节(或位)级别上没有删除或错误,至少没有任何合理的可能性(至少有两个底层协议,有时三个,每个都有一个校验和,这可以确保那个)。您要么收到完整,完整的数据报,,要么 。从不介于两者之间。

Cauchy Reed Solomon代码是您可以考虑的一类算法,它们将 k 一些长度的数据块转换为 k + m 块,并允许恢复最多给出 m 删除的原始数据。这种算法的一个特例是 parity ,编码和解码都是一个简单的xor操作, m = 1 。这是Raid-5中使用的算法,在上面的评论中提到过。

总之,您需要longhair

作为替代方案,如果你有很多数据要传输到多方,并且你想要花哨,你可以考虑喷泉代码。这些更复杂(因此更慢)和更低的位效率,但它们允许您创建任意数量的数据包,其中任何k 将重建k-lenght原始消息。如果您能够向需要大量数据的许多客户进行多播,但不必同时开始下载,则可以节省大量带宽。

答案 1 :(得分:1)

如果你发送无限精确的实数/复数,那么基于这样一个事实就会有一个简单的解决方案:通过任何具有不同x坐标的d点,都有一个唯一的多项式d-1。因此,给定d个数据点,您可以找到这个多项式(比如使用拉格朗日插值)并在n个点上进行评估。如果你丢弃d + n点中任意n个的值,你仍然可以从另一个n的值中恢复多项式。实际上,这通常是无法使用的,因为它在数值上不稳定。

在一个大的离散字母表中,您会询问与加密中的secret sharing相关的内容,当您至少有n个密钥时,您希望能够解码消息。你的目标有点不同,但一些有效的秘密共享技术可能有用。

您需要的是error detecting code这与错误更正代码没有什么不同。具有最小距离n的二进制代码是一组二进制向量,使得任何两个不同的向量在至少n个位置上不同。此代码将允许您检测n-1个错误,并且您可以纠正已知位置的n-1个错误(或未知位置的(n-1)/ 2个错误)。

如果两个代码字只在n个地方有所不同,那么如果丢失这些代码,就无法区分代码字,因此无法恢复数据。

一些最简单的纠错码会将校验和附加到最后。有关具有任意大的最小距离的无限代码系列,请参阅BCH codes。拥有一个无限的家庭是件好事,因为虽然人们在实践中发送小的固定数据块,但在你的问题中你想要一个巨大的块,如果你想优化错误的数量,你可以纠正扩展消息。这些概括了添加奇偶校验位的想法:你选择一些多项式p(x),然后确保你发送的位是可被p(x)整除的多项式的系数,系数算术模2(或有限的领域)。例如,您可以将8个校验位添加到7个数据位,然后使用已知位置更正最多4个错误。在BCH代码中,有错误时恢复消息比许多其他代码更简单。一种解码方法与我为实值数据提到的插值多项​​式有关。

答案 2 :(得分:1)

Reed-Solomon代码RS(255,223,32)纠正了影响255个字节中16个(或更少)的所有错误模式 - 无论它们如何被破坏。如果您事先知道哪些字节已损坏,那么该功能甚至更高。这种类型的错误称为擦除。

RS(255,255-k)解码器纠正所有字节错误/擦除模式:

(2 * errorCount + erasureCount)< = k

这意味着编码器获取(255-k)字节的信息块并计算k个字节的奇偶校验信息,其与信息块一起作为255字节的块发送。

好的一点是,您在编码数据时不需要决定errorCount / erasureCount分布,只需告诉接收端的解码器需要担心的字节位置,它会照顾这些错误以及未知位置的任何剩余错误(只要符合上述条件)。

在一些传输方案中,对多个Reed-Solomon块进行编码,然后以多个分组进行传输。这样,来自单个分组丢失的丢失字节分布在多个Reed-Solomon码字上。这通常被称为交错。

您可以查看我的Reed-Solomon Encoder/Decoder C实现。它可以处理错误和删除,并且包含一个很好的测试平台。