代码之家  ›  专栏  ›  技术社区  ›  crysoberil

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

  •  1
  • crysoberil  · 技术社区  · 11 年前

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

    1 回复  |  直到 11 年前
        1
  •  2
  •   ZqBany    11 年前

    如果你想要简短的答案而不是否定,那么就不能总是依赖它们,如果你有真正关键的数据,那么你应该自己封装数据,或者用单独的通道传输一些好的散列,比如例如SHA-256,以确认数据传输无误。

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

    这些剩余的错误应该被IP和TCP校验和捕获。但这些校验和计算不能检测所有错误,例如:重新排序两个字节的字或总和为零的多个错误。

    在乔纳森·斯通(Jonathan Stone)、迈克尔·格林沃尔德(Michael Greenwald)、克雷格·帕特里奇(Craig Partridge)和吉姆·休斯(Jim Hughes)的《校验和和CRC在真实数据上的性能》(Performance of checksum and CRC over Real Data)中,您可以找到一些真实数据,这些数据表明,大约十亿分之一的TCP段在包含损坏数据时具有正确的校验和。

    所以我要说,ISO/OSI模型中的错误检测机制在大多数应用程序中为我们提供了足够的保护,在有效和快速的同时消除了大多数错误。但是,如果您使用一些额外的哈希,那么您对错误都是最健壮的。只需从 article on hash collisions odds of hash collision