用于程序员的实用芦苇

2021-06-14 22:26:54

最近我正在做一些工作解码新的伽利略高精度数据。简而言之,这款新闻服务将允许伽利略(“欧洲公绩”)用户实现排比级精度,这很好。通过利用芦苇所在的芦荟索入,这种“具有”数据被高度冗余传输。

为了解决这些数据,我试图了解更多有关Reed-Solomon和Ifound的更多信息几乎所有的解释对我来说都是无用的 - Oodles的AdvancedMath,但没有如何在实践中使用R-S的指导。事实上,数学沉重的页面的很多很多是为了获得实用细节错误。

Reed-Solomon背后的数学确实非常漂亮,我可以了解为什么以告诉用户有关可爱的Galois领域的讲述。同时将专注于您真正需要知道的事情。

本文不会让您成为芦苇专家。它将允许您了解和使用您必须工作的任何R-S代码。此外,您还会了解R-S可以且不能做的,以及如何对其他错误纠正系统进行Itellate。最后,随着这个问题,数学沉重的解释越多,可能会变得更加难忘。

我要感谢Phil Karn,KA9Q指向METO各种有趣的文件&清理一些误解的误解。此外,此页面使用他的FeClibrary,这很棒(也是Linux内核的一部分)。

简而言之,Reed-Solomon是一种很酷的方法,可以保护信息免受损坏的损坏。在您选择中,您可以将T奇偶校验符号添加到Amessage。

符号可以是8位长而等于一个字节,但情况不一定。

不仅是非常好的错误弹性,它不会比这更好地克服(至少,而不是按照每个符号的基础)。

您可以选择T匹配,这意味着您可以选择您想要的保护级别。

然而,您无法选择的是生成的ProtectedBlock的长度:这始终为255字节(使用字节大小的符号时)。更一般地,长度是\(2 ^ s-1 \),其中\(s \)是位中的符号大小。

请注意,对于7位符号,块大小将是127个符号,或总共889bits,相当于大约111个字节。

您添加的奇偶校验符号越多,块块的越少的空间。

一个非常常见的R-S配置通常被描述为“(255,223)”。这意味着块大小n为255,这意味着TheSymbol大小为8位。第二个数字意味着这些符号的有效载荷的223(k),并且255-223 = 32(t)字节是奇偶校验符号。

此配置可以从16个损坏的字节,255byte大小块中的任何位置恢复。这些损坏可以在消息本身或arparity符号中,影响没有差异。

作为额外的属性,如果您可以告诉解码器符号符号,您可以从32个“擦除”中恢复。这可能是非常有帮助的划分丢包。

如果在未知的地方有16到32个损坏,则R-S将至少告诉您他们。如果更多数据已损坏,则消息中的消息会再次“有效”。

因为没有办法区分结果4结果1和2,R-SIS无法替代加密完整性功能!

谈论“(255,223)”芦苇所谈论,但描述是非常不完整的。请注意,如果(255,223)是您获得的规范,则这不足以互操作。或者换句话说,您需要了解更多信息。

Galois字段中的原始元素用于生成簧片所罗门代码发生器多项式

前三个项目可以衍生自“(255,223)”,所以休息的然而拾取。

如果您必须与现有标准互操作,则必须从规范中收集映射器。这些可能是很好的隐藏,或者他们可能使用不同的单词来描述同样的事情。

如果您想选择自己使用的配置,您将在线找到几乎尼古尔,或更糟糕的建议。

\(1 + x ^ 2 + x ^ 3 + x ^ 4 + x ^ 8 \)(由美国国家航空航行美国国家航空航天局航行员任务使用)

对于“原始元素”,您可以选择255岁以下的任何数字,只要不可分割,3,5或17即可。这与8位R-S中使用的Galois领域的复杂性有关。在实践中,人们挑选11个,例如也可以使用7,8,13,14,16或19。我已经完成了一些部分,它似乎是8,11或14的都是最快的。如果USEA非8位符号大小,则必须使用其他数字(以及其他多项式,您可以在此处找到该数字)。

对于“先连续的根”,就我所能说明,你可以选择255岁以下的任何人。由于某种原因,人们有时候会选择121,我不知道为什么。也许是因为它是什么是旅行者所做的?在任何情况下,似乎都没有表现出现。

所以总之,你必须选择的一些参数,但只要youpick上面建议的一个值你应该是好的。

为了了解这项工作的感受,我写了一个基于Phil Karn,KA9Q的优秀FEC图书馆的小工具。您可以在此处下载预编译的Linux二进制文件,或从Github获取源。

请注意,此工具默默地填充您的消息,以便它具有正确的长度,并在输出中隐藏您的信息。请记住,R-S操作ondefined块大小 - 您可以自己包含一个长度字段!

$ ./rscmd --nroots 8"这是一个测试消息" nroots:8prim:11fcr:121poly:1 + x + x ^ 2 + x ^ 7 + x ^ 8polyval:0x187(n,k)=(255,247)&#34的8个奇偶校验字节;这是一个测试消息&#34 ;:7642B8E385FCF392

所有这些设置都可以默定更改(检查--help)。现在让我们透露解码作品。请注意,该消息已被损坏:

$ ./rscmd --nroots 8"这是一个假消息" 7642B8E385FCF392混合的4个损坏位置:10 11 12 13 recovered:这是一个测试消息

在这里,我们损坏了4个字节,可以使用8parity字节纠正。它的工作!如果我们损坏了一个位置,Reed-Solomonis保证才能检测到这一点,总共最多8个损坏:

$ ./rscmd --nroots 8" xhis是假消息" 7642B8E385FCF392Fatal错误:无法纠正消息

$ ./rscmd --nroots 8" xhis是假消息" -e 0 -e 1 -e 2 -e 3 -e 10 -e 11-e 12-e 13 7642b8e385fcf392informing解码器约8擦除:0 1 2 3 10 11 12 13定位的8个损坏位置:0 1 2 3 10 11 12 13:这是一个测试消息

#vv vvvv $ ./rscmd --nroots 8"这是一个测试消息" 7642B8E385FC0000修复4次损坏位置:5 6 253 254 254Recovered:这是一个测试消息

如上所述,只要我们使用8位符号,总码字总始终为255字节。

根据您的需求,您可能需要更多或更少的保护。请注意,只要计算机硬件只会损坏单个字节(incethey命中您的编程语言)。这么常见的是,虚假扇区,磁盘或记忆库在您身上消失。

然而,您的RAM可能会损坏单位数据.ALSO,TCP和以太网校验和足够弱,损坏堵塞通过未检测到。

然而,这是如此稀有,您更好地依赖于密码学嘟嘟此类数据完整性问题并完全翻译。 R-S在这个领域中没有沃思。

ZFS中可能是ZFS的显着例外,它在其初始introduction中发现了一堆在服务器和驱动器中发生的腐败。

您没有看到大量损坏字节的一个原因是许多经销商在内部使用R-S或R-S样算法,而不会将其暴露在您身上。

程序员的一个更常见的问题是ofdata的直接消失。这一切都发生了 - 磁盘经常失败,即使是SSD,也是如此。此外,网络一直丢弃数据包。

作为一个例子,假设我们有一个音频流,我们想要硬化反对数据包。让我们说我们希望为20%Packetloss添加保护。

为此,我们可以采取4个原始数据包,为每个人添加25%的奇偶校验,andsmear出来的4个原始数据包超过5个新的数据包,如下所示:

请注意,我们还必须向每个数据包添加序列号。这允许将其检测到何种数据包丢失。

如果没有丢失丢失,接收器等待,直到所有5个数据包都在,并不顺利。在这种情况下运行Reed-Solomon解码器将在这种情况下检测任何(非常罕见)个体损坏的字节。

所有原始的4包现在都有一个25%的洞!要从中恢复,R-S解码器需要确切地知道消息GOTLOST的哪些部分。幸运的是,我们知道这一点,因为我们知道分发模式和我们知道哪个数据包丢失了。

如此通知,R-S能够重建完美的四个原始数据包,我们的音频流不会中断。

以上是如何使用R-S获得ResiliEnceaGainst的非常简单的例子,严重的数据丢失。但是,请注意,在此类计划中放弃很多思考。数据包丢失是什么样的?强大的爆发?并且是什么样的延迟是可以接受的?例如,一个非常有效的缓冲器30秒的数据,例如,这对于LiveIterviews而言是无用的。

上面概述的方案也适用于冗余文件和数据存储。例如,使用R-S或多或少地使用如上所述。

255个字节可能只是对您的信息太大。处理这个问题的一种方法是达成同意“填充”。如常用,如果您的焊盘'100bytes,这意味着假设255个代码块的前100个字节是向零的,并且不发送。

这将a(255,223)代码变成(155,123)。使用填充可以节省大量频串,而不是“浪费”奇偶校验。 R-S也在继续工作,即使你知道你的填充没有腐败。

聪明地抓住这个并传输一个长度字段,因此您可以进行动态规模的代码字。如果你这样做,意识到你也会仔细加入R-S到你的长度字段以使这种安全!否则长度字段中的否则可能会将您击出。

作为填充的示例,在GitHub页面上,您可以找到一个小型工具配置的IPProtectwhotectwhotcoctChotecthocewhothswhotectwhothcocthcocthswhotcoctwhotcoctwhothcocthswhotcoctwhotcocthswhotecthoce(n,k)=(6,4)代码,将两个额外的电信集添加到IP地址以提供2个符号的rs保护。

如上所述的错误控制码的理论和实践,芦苇所罗门确实是“完美”,但只有你的问题整齐地符合R-S可以做到。 R-S块大小是一个硬参数,可能不需要。

此外,虽然R-S可以修复和检测符号最大理论上的损坏,但您可能无法在符号方面进行思考,但是更多的位翻转数量。

如果x位被翻转过您的消息,这将完全破坏符号。其他纠错代码可能会更好地处理如此分布的伤害。 R-S excels在修复错误数据的爆发。

在过去的几十年中,已经了解了很多关于错误纠正码。现代通信协议使用涡轮偶像码等的东西,低密度PariteCheck代码或甚至更新的偏光码。 Thesealgorithms解决了“软判决编码”问题,不仅仅是处理在嘈杂的频道上发送的数据,我们将在那里达成“Zeroes”,但具有1 OR0(或许多其他值)的值的概率。

Reed Solomon适用于硬判决编码,其中每个符号都有明确值。然而,R-S通常具有作为连接(ORNESTED)代码的作用以及软判决解码器。

尽管使用LDPC和Polar代码发生了非常聪明的事情,但是在保护不包括占有欲的数据中的AEAPEAR在保护数据中没有作用。

对于较小的有效载荷,可以“填充”某些甚至大部分255-T有效载荷字节

使用Reed-Solomon时,请注意究竟是如何配置的,(255,223)不会告诉您

通常不需要在磁盘上保护数据或对单个字节错误的网络传输期间保护数据

虽然处理概率的代码有很多创新,但LDPC,Turbo和Polar代码不适用于纠正纠正混凝土位和字节 在我所有的搜索中,如果您已经理解Reed-Solomon,我大多数人都发现了很令人困惑的信息或描述。 从评论和我的个人体验中,还可以清楚误差控制的理论和实践(R.E。Blahut,1983)是一个非常有用的书,非常值得怀疑。 作为一个特别的奖金,它包含足够的数学介绍,大量的实际工作,您将能够真正理解的理论效果芦苇(以及许多相关代码)。 如果您真的想要Tounderstand细节,我强烈建议让您的手放在此书上,不要在互联网上尝试随机页面。