为什么 IPv6 标头不包含校验和?
围绕 IPv6 的想法之一是加速数据包转发。为此,做出了多项决定。例如,IPv6 报头被大大简化并且是固定长度的,这与可变长度的 IPv4 报头不同。此外,您不能像处理 IPv4 那样沿路径对 IPv6 数据包进行分段,因为数据包分段是资源密集型的。
IPv6 头中没有校验和意味着 IPv6 路由器不需要重新计算校验和以查看数据包头是否损坏,并在递减跳数后重新计算校验和。这节省了处理时间并加快了数据包转发。逻辑是第 2 层和第 4 层协议都已经有一个校验和。第 2 层校验和覆盖整个 IPv6 数据包,第 4 层校验和覆盖传输数据报。
UDP 有一个可选的 IPv4 校验和,而 IPv6 则需要它。
因为它是多余的。
所有常见的链路层协议,如以太网或 WiFi,都有自己的错误检查和纠错机制,因此物理传输错误已经不太可能发生。
剩下的是数据包本身的逻辑错误。但几乎所有基于 IPv6 的传输协议,如 TCP 或 UDP,也有错误检查功能以捕获逻辑错误。并且这些校验和通常也覆盖 IP 报头的一部分,即使这些在技术上不是传输层段的一部分(如源地址和目标地址)。
那么,如果 IPv6 路由器尝试路由损坏的数据包,可能发生的最坏情况是什么?数据包要么根本不会被路由,因为头包含无效值或目标地址不存在,要么地址是有效地址(可能是也可能不是预期的地址),因此它将到达目的地,然后将丢弃它,因为传输层校验和不相加。浪费了一点带宽,仅此而已。这是一种并不经常发生的场景。因此,在 IPv6 交换机上计算它们路由的每个数据包的校验和所需的额外 CPU 负载根本不值得。
我之前在某处读到过,从知道做出这个决定的思考过程的人那里读到:IPv4 标头有一个校验和,而 IPv6 标头没有,因为到设计 IPv6 时,网络技术总体上已经改进了很多(少得多的错误等,此外,即使是确实发生的罕见错误,也可能被其他层的校验和捕获),因此在 IPv6 标头中包含校验和的好处很小。
假设 IPv6 地址比 IPv4 地址长,将添加到 IPv6 报头的每个字段都会向已经大于 IPv4 报头的报头添加额外的开销。对于收益微乎其微的事情,认为没有必要。