1

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

所以可能发生的是:

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

包装 1:S| Pkt Hdr Seq=1 | 有效载荷续 | PKT CRC |E

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

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

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

我能想到的唯一原因是:

  1. 将有效载荷向下传递到较低协议层的层不一定知道较低层是否已经具有CRC
  2. 传递有效载荷的层不知道较低协议层的配置是否启用了 CRC。
  3. 将有效载荷向下传递的层正在有效载荷上使用高级错误检查或纠正技术。
  4. 将有效载荷向下传递的层正在保护有效载荷免受潜在的不良/脆弱的较低层/硬件的影响。

1、2 和 3 不适用于这种情况。所以 4 我唯一的“好”理由。

4

2 回答 2

1

1、4,也许还有 3。

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

因此,在当前情况下,您可能知道该协议运行在某个现有的 BUS 协议上。但也许在未来(假设从现在起 5 年后)BUS 会变成别的东西。某种I2C,ODB,谁知道呢。现在,通常较新的协议可能会提供更好的错误检查,但您不必依赖未知数。

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

于 2013-08-14T22:58:37.890 回答
0

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

于 2013-08-14T21:50:43.680 回答