人们通常会误解IPv6没有分片这一事实,因为IPv6头部没有像IPv4那样的分段偏移字段;但这并不完全准确。IPv6不允许路由器对数据包进行分片;然而,终端节点可以插入IPv6分片头1。
正如RFC 5722所述2,分片的一个问题是它容易造成安全漏洞。在 90 年代末期,有一些众所周知的攻击Windows 95利用了重叠的 IPv4 片段3。此外,数据包的行内分片对于烧进互联网路由器芯片来说也很危险,因为必须处理长列表的问题。最大的问题之一是,如果路由器中缓冲了重叠的片段(等待重新组装),如果处理不当,可能会在该设备上引起安全漏洞。结果是,大多数路由器实现将需要分片的数据包推送到软件;但这在高速率下无法扩展。
另一个问题是,如果你重新组合片段,你必须将它们缓冲一段时间直到其余部分接收到。某些人可能会利用这种动态发送大量未完成的 IP 片段;强迫目标设备花费大量的资源等待重新组合的机会。智能实现限制了未完成片段的数量,以防止此类拒绝服务攻击;但是,限制未完成片段可能会影响可以重新组装的有效片段数。
总之,有太多棘手的问题不允许路由器处理分片。如果IPv6数据包需要分片,则主机实现应该足够智能,使用 TCP路径MTU发现。这也意味着必须允许几个 ICMPv6 消息终端到终端传输;有趣的是,许多IPv4防火墙管理员阻止 ICMP 以保护网络不受恶意映射攻击(然后幼稚地阻止所有 ICMPv6),没有意识到阻止所有 ICMPv6 会在微妙的方式中破坏事情4。
根据RFC 5722: Handling of Overlapping IPv6 Fragments:
常用的防火墙使用[RFC1858]中指定的算法来过滤试图覆盖传输层头部以绕过入站连接检查的恶意数据包。[RFC1858]通过建议丢弃分段偏移量为1的数据包来防止对上层协议(在本例中为TCP)进行重叠分段攻击。
虽然这种方法对IPv4分段有效,但不适用于IPv6分段。这是因为IPv6数据包的可分段部分可以在TCP头部之前包含扩展头部,从而使该检查变得不太有效。
请参考RFC 4890: Recommendations for Filtering ICMPv6 Messages in Firewalls。
IPv4的最小MTU保证为576字节,IPv6为1,5001,280字节,建议为1,500字节,差异基本上是性能。由于大多数终端用户LAN段为1,500字节,因此它减少了网络基础设施开销,因为需要更小尺寸的旧网络的额外分段导致存储状态。
对于UDP,在IPv4标准中没有关于重构分段数据包的定义,这意味着每个平台可以以不同的方式处理它。IPv6断言分段和组装将始终发生在IP堆栈中,并且片段不会呈现给应用程序。