是否应该始终依赖错误检测机制?

Should error detection mechanisms always be relied on?

我知道在网络中,数据 link 层、网络层、tcp 甚至更高层都强制执行错误检测(或有时纠正)机制。但是例如每4KB的数据,考虑到所有层的错误检测,总共使用了多达200字节的错误检查字节。因此,即使具有良好的校验和功能,理论上也可能发生冲突。那么人们为什么要使用这些错误检测机制呢?异常不太可能发生吗?

如果你想要简短的回答而不是不,他们不能总是依赖,如果你有真正重要的数据,你应该自己封装数据或使用单独的通道传输一些好的散列,如 f.e。 SHA-256 以确认数据传输无误。

以太网 CRC 将捕获大多数错误,例如单位错误或任何奇数个单位错误。有些错误可能未被发现,但它极其罕见,并且它讨论了错误的确切概率是多少,但它小于 2^32 中的 1。此外,源和目标之间的每个以太网设备都在重新计算,因此假设每个设备都正常工作,它对错误的鲁棒性更强。

这些剩余的错误应该被 IP 和 TCP 校验和捕获。但是这些校验和计算无法检测到所有错误 f.e。 : 重新排序总和为零的两个字节字或多个错误。

在 Jonathan Stone、Michael Greenwald、Craig Partridge 和 Jim Hughes 的 "Performance of Checksums and CRCs over Real Data" 中,您可以找到一些真实数据,表明大约十亿分之一的 TCP 段在包含损坏数据的同时具有正确的校验和。

所以我会说 ISO/OSI 模型中的错误检测机制在大多数应用程序中为我们提供了足够的保护,在有效和快速的同时消除了大多数错误。但是,如果您使用一些额外的散列,那么您对错误的抵抗力就会最强。只需检查 article on hash collisions

中的 table