0

我目前正在做一个项目,需要将数据从A发送到B。B收到数据后,需要能够确定传输过程中是否发生错误。

我已经阅读了 CRC 并决定 CRC16 适合我的需求;我可以将数据分成块并一次发送一个块。

但是,我对 B 如何判断是否发生错误感到困惑。我最初的想法是让A生成一个CRC,然后将数据发送给B。一旦B接收到数据,生成CRC并将其发送回A。如果CRC匹配,则传输成功。但是 - 如果从 B 到 A 的 CRC 传输出错怎么办?将 CRC 发回似乎是多余的,因为它可能会以与数据相同的方式损坏。

我是否遗漏了什么或使情况过于复杂?

任何想法将不胜感激。

谢谢,P

4

2 回答 2

1

CRC 是错误检测,请注意,您的代码只能检测有限数量的错误。但是,您可以计算 CRC16 冲突的概率(这对于大多数实际目的而言相对较小)。

现在 CRC 的工作原理是使用多项式除法。您的 CRC 值是一些多项式(对于 CRC16,可能是 (x^15) 的顺序)。也就是说,多项式以二进制形式表示为系数。例如,x^3 + [(0)*x^2] + x + 1 = 1011 是 x^3 阶的某个多项式。现在,您将数据块除以 CRC 多项式。余数是 CRC 值。因此,当您再次对 B 上接收到的块(以及余数)执行此除法运算时,多项式除法应该甚至为 0。如果没有发生这种情况,则说明您有传输错误。

现在,这假设(包括您的 CRC 值的损坏)如果 n 位损坏,CRC 检查将检测到故障(假设没有冲突)。如果CRC校验不通过,只需向A发送重传请求。否则,继续正常处理。如果发生冲突,则无法验证数据是否损坏,除非您手动查看接收到的数据(或发送多个希望无错误的副本 - 请注意,此方法会产生大量开销,并且冗余仅适用于有限精度再次)。

于 2012-12-31T15:33:52.730 回答
1

您通常将校验和数据一起发送。然后从接收端的数据中计算校验和,并将其与随附的校验和进行比较。如果它们不匹配,则数据或校验和已损坏(除非您不幸发生冲突)-在这种情况下,您应该要求重新传输。

于 2012-12-31T15:27:32.923 回答