帧中的CRC如何确定数据是否完整?

CRC通过为帧添加校验和并接收端验证实现数据完整性检查,从而检测传输错误。本文介绍CRC的工作原理。
On this page

帧中的CRC如何确定数据是否完整?

摘要

CRC 在传输过程中提供了一种简单而有效的方法,通过附加一个校验和并在接收时进行验证,从而验证帧数据的完整性。

理解循环冗余校验码 (CRC)

CRC 是循环冗余校验码的缩写。它是一种常用的错误检测码,用于数字通信和存储设备中,以便检测数据的意外更改。

CRC 的关键思想是将数据位序列视为一个大的二进制数。将该数据通过预定的生成多项式进行模 2 除法运算。这个除法运算的余数就成为了 CRC 校验码,它会附加到数据后面。

在接收端,同样的除法过程会被重复执行。如果新计算出的 CRC 与接收到的 CRC 相匹配,那么数据被认为是完好无损的。任何更改都会修改余数,表示数据损坏。

CRC 的计算方法

下面是一个简化的 CRC 值计算示例:

  1. 假设数据位序列为 10010101
  2. 选择一个生成多项式,比如 1001
  3. 对数据进行模 2 二进制除法运算 10010101 / 1001 = 商:10011,余数:110
  4. 余数 110 就成为了 CRC 校验码
  5. 这个 3 位的 CRC 被附加到原始数据后面 10010101110
  6. 组合后的位流被传输

在接收端:

  1. 提取接收到的数据位 10010101110
  2. 将数据 10010101 和 CRC 110 分离开
  3. 对数据进行除以生成多项式的运算 10010101 / 1001 = 商:10011,余数:110
  4. 将计算出的余数与接收到的 CRC 进行比较 如果两者相匹配,数据被认为是无错误的

检查数据完整性

在网络中,被传输的数据被格式化为帧或数据包。在传输之前,CRC 位被插入到帧结构中。

例如,一个包含标志、数据和包括 CRC 的 FCS 的帧可能如下所示:

标志 | 数据 | CRC | 标志

接收方从帧中提取出数据和 CRC 部分,并独立地对数据进行 CRC 计算以验证完整性。

接收方验证

接收方执行以下步骤:

  1. 接收帧并提取数据和接收到的 CRC
  2. 使用相同的多项式对提取的数据进行 CRC 计算
  3. 将计算得到的 CRC 与提取的 CRC 进行比较
    • 如果相等 - 数据完好无损
    • 如果不相等 - 数据已损坏

这种 CRC 比较可靠地检测到数据在传输过程中的任何更改。

确定数据完整性

如果 CRC 值匹配,接收方可以相信数据与源数据保持不变。CRC 已验证完整性。

然而,计算得到的 CRC 与接收到的 CRC 不匹配表示数据已被更改。CRC 已检测到损坏。

然后,接收方丢弃帧并请求重新传输以获得完整的数据副本。

CRC 的限制

尽管非常有效,但 CRC 不能检测出所有错误。特定的位翻转模式可能无法被检测到,尽管发生的机会非常低。

对于嘈杂的信道,将 CRC 与其他校验和结合使用可以提供额外的保护。密码散列也可以防止恶意篡改而不仅仅是随机错误。

因此,单独使用 CRC 并不是绝对可靠的,但它在高效验证数据完整性方面取得了很大的进展。

结论

总之,CRC 提供了一种轻量且强大的方法来验证传输数据的正确性。通过在帧末尾附加 CRC 并在接收端进行交叉检查,可以可靠地检测到数据的意外更改。这使得关键数据可以在容易出错的网络上完整地交换。CRC 的简单性和有效性使其成为数字通信系统中不可或缺的组成部分。