去除IPv6碎片化的好处是什么?

10
我正在开发一个使用Java套接字的应用程序项目。然而,当我阅读一些基础知识和新兴的IPv6范例时,我想问下面的问题:从IPv6中删除分段的好处是什么?如果有人能帮我理解为什么这样做会有益处,那就太好了。我在互联网上进行了研究,但没有找到任何有用的描述。
3个回答

16

人们通常会误解IPv6没有分片这一事实,因为IPv6头部没有像IPv4那样的分段偏移字段;但这并不完全准确。IPv6不允许路由器对数据包进行分片;然而,终端节点可以插入IPv6分片头1

正如RFC 5722所述2,分片的一个问题是它容易造成安全漏洞。在 90 年代末期,有一些众所周知的攻击Windows 95利用了重叠的 IPv4 片段3。此外,数据包的行内分片对于烧进互联网路由器芯片来说也很危险,因为必须处理长列表的问题。最大的问题之一是,如果路由器中缓冲了重叠的片段(等待重新组装),如果处理不当,可能会在该设备上引起安全漏洞。结果是,大多数路由器实现将需要分片的数据包推送到软件;但这在高速率下无法扩展。

另一个问题是,如果你重新组合片段,你必须将它们缓冲一段时间直到其余部分接收到。某些人可能会利用这种动态发送大量未完成的 IP 片段;强迫目标设备花费大量的资源等待重新组合的机会。智能实现限制了未完成片段的数量,以防止此类拒绝服务攻击;但是,限制未完成片段可能会影响可以重新组装的有效片段数。

总之,有太多棘手的问题不允许路由器处理分片。如果IPv6数据包需要分片,则主机实现应该足够智能,使用 TCP路径MTU发现。这也意味着必须允许几个 ICMPv6 消息终端到终端传输;有趣的是,许多IPv4防火墙管理员阻止 ICMP 以保护网络不受恶意映射攻击(然后幼稚地阻止所有 ICMPv6),没有意识到阻止所有 ICMPv6 会在微妙的方式中破坏事情4


**END-NOTES:**
  1. 请参考Internet Protocol, Version 6 (IPv6) Specification第4.5节。

  2. 根据RFC 5722: Handling of Overlapping IPv6 Fragments

    常用的防火墙使用[RFC1858]中指定的算法来过滤试图覆盖传输层头部以绕过入站连接检查的恶意数据包。[RFC1858]通过建议丢弃分段偏移量为1的数据包来防止对上层协议(在本例中为TCP)进行重叠分段攻击。
    虽然这种方法对IPv4分段有效,但不适用于IPv6分段。这是因为IPv6数据包的可分段部分可以在TCP头部之前包含扩展头部,从而使该检查变得不太有效。

  3. 请参考Teardrop attack (wikipedia)

  4. 请参考RFC 4890: Recommendations for Filtering ICMPv6 Messages in Firewalls


1
+1,当路由器可以在硬件中完成所有操作时,它们的速度可以快得惊人。 - mpontillo
5
禁止所有的 v4 ICMP 同样有害,因为“需要分片”的响应对于 IPv4 中的 PMTUD 同样重要。 - caf

6
我没有“官方”答案可以回答你,但是基于我阅读IPv6如何处理过大数据报的内容,我的猜测是为了减轻路由器的负担。在路由器上进行分片和重组会产生额外开销。IPv6将这个负担转移到了末端节点,并要求它们执行MTU发现来确定它们可以发送的最大数据包大小。很明显,末端节点更适合处理此任务,因为它们需要处理的数据较少。实际上,路由器已经承载足够多的负担;强制节点处理它并允许路由器简单地丢弃超过其MTU阈值的数据包是有意义的。
理想情况下,最终结果应该是路由器能够在IPv6下处理比IPv4更大的负载(所有其他条件相等),因为它们不必担心分片/重组问题。这个处理器的功率可以用于路由流量。

2
“分段和重组会在路由器上产生开销”,为什么路由器要处理重组? - curiousguy

0

IPv4的最小MTU保证为576字节,IPv6为1,5001,280字节,建议为1,500字节,差异基本上是性能。由于大多数终端用户LAN段为1,500字节,因此它减少了网络基础设施开销,因为需要更小尺寸的旧网络的额外分段导致存储状态。

对于UDP,在IPv4标准中没有关于重构分段数据包的定义,这意味着每个平台可以以不同的方式处理它。IPv6断言分段和组装将始终发生在IP堆栈中,并且片段不会呈现给应用程序。


4
很抱歉,IPv6需要1500字节并不正确。根据RFC 2460,第5节允许使用低至1280字节的第二层MTU。 - Mike Pennington
3
UDP和TCP的区别为什么很重要?IPv4分片处理在IP层进行。 - Mike Pennington
@Mike 数据报组装并不是有保障的。许多消息中间件堆栈都包括专门用于在底层IP堆栈无法保证时进行重构的代码。 - Steve-o
2
我的怀疑是你混淆了TCP序列化和重组的字节,而不是UDP(数据报服务),这意味着负载在定义上是原子的。因此,可能有平台代码来构建UDP消息流,但这与IPv4分段无关。 - Mike Pennington
@Mike 实际上,我可能会混淆原始IP数据报和UDP数据报,UDP数据报可能是有保障的,但IP数据报则不然。也就是说,在IP之上实现自定义协议时需要注意。 - Steve-o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接