如果校验和有缺陷,为什么要使用它们?

网络工程 校验和
2021-07-31 06:11:44

考虑一个过于简单的例子:

假设我们要计算“hi”的校验和。由于 h 是字母表中的第 8 个字母,我们将说 h=8,类似地,i=9。所以hi的校验和是8+9=17。

1) 如果 i 不小心被翻转到 j,但 h 被翻转到 g 的事实平衡了怎么办?

2) 如果我被翻转到 j,但校验和本身也被破坏并最终为 18 怎么办?

似乎校验和可以让您强烈怀疑某事,但不能确定。如果是这样,如果我们需要确定性,为什么要使用它们?

2个回答

在以太网上通过 IPv4 传输 TCP 时,会使用三个级别的校验和(或 CRC):

  • 以太网具有称为帧校验序列 (FCS) 的 32 位 CRC。这是非常可靠的:对于随机损坏,这意味着即使包含损坏的数据,40 亿分之一的数据包也会被意外接受。考虑到一个数据包通常大约为 1 千字节,这意味着随机损坏每发送 4 TB 的损坏数据就会损坏您的数据一次。不幸的是,以太网的 FCS 不是真正的端到端校验和。
  • IPv4 具有 16 位标头校验和。它是使用 Internet 校验和算法计算的。它远不如以太网的 FCS 可靠,每个路由器都必须通过减少跳数(从而重新计算校验和)来修改数据包,因此这也不是真正的端到端校验和。由于路由器需要额外的工作负载,IPv6 消除了这个校验和。
  • TCP 有 16 位全数据校验和保护 IPv4 报头的某些部分、TCP 报头和所有数据。这是一个真正的端到端校验和,使用与 IPv4 报头校验和相同的算法计算。不幸的是,接受随机损坏的可能性为 65536 分之一,这意味着在给定 KB 段大小的情况下,一旦接受发送的 64 MB 随机损坏数据。

因为数据在计算机的数据包缓冲存储器中可能会损坏,而不仅仅是在通过链接传输时,好的协议即使在通过 TCP 运行时也会实现自己的校验和,因为 TCP 的校验和不是那么可靠。这三个校验和都不是加密质量。例如,Git 版本控制系统使用加密质量 SHA-1 保护所有数据(不幸的是,最近发现它遭受冲突......)

如果今天设计 TCP,它肯定会使用 32 位甚至 64 位 CRC,而不是 16 位 Internet 校验和。

数据没有绝对的可靠性。校验和是提供数据正确性的某种安全性的相对较小且快速的方法,但由应用程序来确保。

TCP 确实使用校验和,但它不保证数据是正确的。TCP 的可靠性是因为 TCP 保证段以正确的顺序传送和呈现给应用程序。它具有请求丢失段的机制,并且可以重新排序乱序段。