可以翻转吗二互联网校验和将不是检测到错误吗?
答案1
互联网校验和这种东西根本不存在。
但是,互联网协议套件中的某些协议确实包含校验和。这些校验和通常以模数 65535 和的形式计算,这意味着每个第 16 位位置都会对最终值产生相同的影响。
因此,如果您将一位从 0 翻转为 1,将另一位从 1 翻转为 0,并且如果这两个位在数据包中彼此相距 16 位的倍数,则校验和将不受影响。因此,很容易构建一个场景,其中可以在数据包中翻转两位而校验和无法检测到它。
例如,假设一个数据包包含这些字节 47 6f 6f 64(十六进制)。第二个字节以 1 位结尾,第四个字节以 0 位结尾。这些位相隔 16 个位置,因此如果我们将它们都翻转,校验和将不受影响。47 6e 6f 65 恰好翻转了两个位,因此其校验和相同。
然而,值得注意的是,这些校验和并不涵盖通过互联网发送的所有内容,因此由于其他原因,未被发现的损坏更有可能发生。
现在让我们考虑单独的协议。
IPv4具有报头校验和。它仅涵盖报头,因此无法检测到任何有效负载损坏。由于每个路由器都必须更新 TTL 字段,因此必须在每一跳重新计算校验和。很容易引入实现错误,损坏的数据可能导致在损坏的数据上重新计算此校验和。
IPv6没有任何报头校验和。由于上述问题,它被淘汰了,因为不必更新它会带来一点性能优势,而且其他协议层的校验和更适合。
TCP计算所有有效载荷数据以及 IP 地址和协议号的校验和。因此,即使 IP 地址在传输过程中损坏,数据包因此被传送到错误的目的地,TCP 校验和也可以检测到并丢弃该数据包。
UDP就像 TCP 计算有效载荷数据、IP 地址和协议号的校验和一样。但这是可选的。UDP 数据包可以通过 IPv4 发送,校验和字段为零,在这种情况下,无论有效载荷数据在传输过程中是否损坏,接收方都会接受数据。但这仅适用于 IPv4。在 IPv6 中,UDP 校验和是强制性的。这大概是为了弥补报头校验和的不足,这意味着 UDP 校验和是确保在 IP 地址在传输过程中损坏的情况下丢弃数据包的唯一保护措施。
UDP精简版其行为与 UDP 完全相同,只是校验和不必覆盖所有有效负载数据。发送方决定校验和需要覆盖多少字节(从数据包开头算起)。数据包末尾的损坏将不会被检测到。