考虑一个过于简单的例子:
假设我们要计算“hi”的校验和。由于 h 是字母表中的第 8 个字母,我们将说 h=8,类似地,i=9。所以hi的校验和是8+9=17。
1) 如果 i 不小心被翻转到 j,但 h 被翻转到 g 的事实平衡了怎么办?
2) 如果我被翻转到 j,但校验和本身也被破坏并最终为 18 怎么办?
似乎校验和可以让您强烈怀疑某事,但不能确定。如果是这样,如果我们需要确定性,为什么要使用它们?
考虑一个过于简单的例子:
假设我们要计算“hi”的校验和。由于 h 是字母表中的第 8 个字母,我们将说 h=8,类似地,i=9。所以hi的校验和是8+9=17。
1) 如果 i 不小心被翻转到 j,但 h 被翻转到 g 的事实平衡了怎么办?
2) 如果我被翻转到 j,但校验和本身也被破坏并最终为 18 怎么办?
似乎校验和可以让您强烈怀疑某事,但不能确定。如果是这样,如果我们需要确定性,为什么要使用它们?
在以太网上通过 IPv4 传输 TCP 时,会使用三个级别的校验和(或 CRC):
因为数据在计算机的数据包缓冲存储器中可能会损坏,而不仅仅是在通过链接传输时,好的协议即使在通过 TCP 运行时也会实现自己的校验和,因为 TCP 的校验和不是那么可靠。这三个校验和都不是加密质量。例如,Git 版本控制系统使用加密质量 SHA-1 保护所有数据(不幸的是,最近发现它遭受冲突......)
如果今天设计 TCP,它肯定会使用 32 位甚至 64 位 CRC,而不是 16 位 Internet 校验和。
数据没有绝对的可靠性。校验和是提供数据正确性的某种安全性的相对较小且快速的方法,但由应用程序来确保。
TCP 确实使用校验和,但它不保证数据是正确的。TCP 的可靠性是因为 TCP 保证段以正确的顺序传送和呈现给应用程序。它具有请求丢失段的机制,并且可以重新排序乱序段。