当有效负载跨越多个数据包时,有效负载上的CRC的目的是什么?

时间:2013-08-14 21:01:11

标签: network-protocols packet crc

我一直在阅读定制的低速通信协议,该协议计算完整有效载荷的CRC。该有效载荷可以分成多个分组。自定义协议在现有总线协议的基础上运行,允许每个数据包CRC可选。

所以可能发生的事情是:

Pkt 0:S | Pkt Hdr Seq = 0 |开始有效载荷| Pkt CRC | E

Pkt 1:S | Pkt Hdr Seq = 1 |有效负载继续| Pkt CRC | E

Pkt 2:S | Pkt Hdr Seq = 2 |有效载荷结束|有效负载CRC | Pkt CRC | E

S - 数据包开始;  E - 数据包结束;  Seq - 数据包的序列号

当已经存在数据包级CRC时,为什么协议在其传递的有效负载上有自己的CRC?有效载荷已受到保护。协议设计者知道CRC数据包级选项。

我能想到的唯一理由是:

  1. 将有效负载传递到下层协议层的层不一定知道下层是否已经有CRC
  2. 传递有效负载的层不知道较低协议层的配置是否启用了CRC。
  3. 传递有效负载的层使用有效负载上的高级错误检查或更正技术。
  4. 向下传递有效负载的层正在保护有效负载免受潜在的坏/片状下层/硬件的影响。
  5. 1,2和& 3不适用于这种情况。所以4我唯一的“好”理由。

2 个答案:

答案 0 :(得分:1)

1,4,也许3。

在协议栈中,层通常彼此独立是很重要的。图层通常提供他们提供的基本服务,并且可以提供额外的功能。例如:在ISO / OSI 7层中,您可以编写通过套接字进行通信的应用程序。如果您将校验和添加到您自己的应用程序级协议层,那么您不必依赖于TCP或UDP层的错误检查。

因此,在当前情况下,您可能知道协议在某个现有的BUS协议上运行。但也许在未来(比如说从现在起5年后),BUS将被改为其他东西。某种I2C,ODB,谁知道。现在,通常较新的协议可能提供更好的错误检查,但您不必依赖未知。

您可以在ISO / OSI图层中观察到这一点,更多图层有各种错误检查。这似乎是多余的,但层技术是可交换的。

答案 1 :(得分:0)

从源到目的地时,数据包可以传输多个(较低层)跃点。验证目标的校验和可确保我们不会在任何中间跃点上遇到任何位错误。因此,即使我们将数据包分段为多个较小的数据包,它也是进行分段的源,并且它是重新组合分段的目标。这就是为什么从校验和的角度来看,它使得每个片段都被视为一个单独的数据包。实际上,这正是IP网络中碎片和校验和的完整方式。如果要发送的数据包大于MTU,则发送方将数据包分成多个较小的数据包,并分别计算每个数据包的校验和。一旦目标接收到这些片段,它就会在重新组装之前验证每个片段的校验和。所以,我也会选择4!