IPv4与IPv6分片重组的区别。分别从协议栈(无连接跟踪),以及连接跟踪来考虑。
协议栈: host: IPv4重组后就提交给传输层了。 这点和IPv6相同。
router:(IPv4)IPv4转发分片包,不进行重组。如果分片包大于PMTU时,则仍然将分片包再分片,再转发。
(IPv6)IPv6只转发分片包,绝对不重组。如果分片包大于PMTU,则给源端发送
ICMPv6 'Too Big'消息。
参见RFC2460, 第4.5,5节。
URL:
连接跟踪: host: (IPv4) 如果重组成功,则将重组后的完整的数据包提交给IPv4协议栈,查找路由(查找结果是 host),
后再提交给传输层。 IPv4协议栈就不需要再分片了。
如果重组失败,则将分片包保留在连接跟踪中,直到重组超时,清除这些收到的分片包。
超时后,仍然需要给源端发送ICMP time excite 消息。
(IPv6) 如果副本重组成功,则将重组后的副本数据包交给连接跟踪进行状态跟踪。
而原始的分片将会被转发到IPv6协议栈。
查找路由(查找结果是host),再重组并提交给传输层。这需要重组两次哦。
如果重组失败,处理跟IPv4相同。
route:(ipv4) 如果原始包重组成功,则将重组后的完整的数据包提交给IPv4协议栈,查找路由
(查找结果是router),再转发。
如果大于PMTU,还会再分片的。
如果重组失败,则将分片包保留在连接跟踪中,直到重组超时,清除这些收到的分片包。
超时后,不需要给源端发送ICMP time excite 消息。
(ipv6)如果副本重组成功,(重组后的完整的副本包将被连接跟踪处理) ,则将原始的分片包提交给
IPv6协议栈, 查找路由(查找结果是router),再转发。
如果大于PMTU,则给源端发送ICMPv6 'Too Big'消息。
如果重组失败,与IPv4相同。
参见RFC2460, 第4.5,5节。“ IPv6 router does not reassemble fragmented packets.”
So I designed that nf_contrack_ipv6 forwards fragments to IPv6 stack even
if nf_conntrack detects missing piece of fragments.
---------------------------------------------------------------------------------------
补充一点:(20101110)
自从引入了commit 70789d70(ipv6: discard overlapping fragment),该patch加入到2.6.37-rc1中,
IPv6,无论协议栈还是连接跟踪都支持了RFC5722,即禁止重组重叠的IPv6的分片。一旦收到重叠的IPv6分片,则将相关的所有的分片丢弃,并且增加IPSTATS_MIB_REASMFAILS计数值。 但是IPv4中仍然允许重组重叠的分片。
原因是IPv6的分片中可能含有其他扩展头部,扩展头部之后是传输层(tcp,udp)头部,伪造的重叠分片会更改原始的包中的数据。
P.S.
host是指,主机linux是目的地。
router是指,中间linux节点,需要将包进行转发。
阅读(6810) | 评论(0) | 转发(0) |