我目前正在开发一个需要将数据从A发送到B的项目。一旦B收到数据,它就需要能够确定传输过程中是否发生了错误。
我读过有关CRC的信息,并认为CRC16适合我的需要;我可以将数据分成块并一次发送一个块。
但是,我很困惑B如何能够判断是否发生了错误。我最初的想法是让A生成CRC然后将数据发送到B.一旦B接收数据,生成CRC并将其发送回A.如果CRC匹配,则传输成功。但是 - 如果将CRC从B传输到A错误怎么办?将CRC发送回来似乎是多余的,因为它可能以与数据相同的方式被破坏。
我是否遗漏了某些内容或过于复杂的情况?
任何想法都会受到赞赏。
谢谢, P
答案 0 :(得分:1)
您通常使用数据发送校验和。然后计算接收端数据的校验和,并将其与随附的校验和进行比较。如果它们不匹配,则数据或校验和都已损坏(除非您不幸发生冲突) - 在这种情况下,您应该要求重新传输。
答案 1 :(得分: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发送重传请求。否则,继续正常处理。如果发生冲突,则无法验证数据是否已损坏,直到您手动查看收到的数据(或发送多个,希望无错误的副本 - 请注意,此方法会产生大量开销,而冗余仅适用于再次有限精度。)