目录
前言:
IPV6不支持中间设备分片原因:
IPV6报文分片使用的扩展报头(44)所包含的参数
IPv6报文分片过程
源节点分片数据包
前言:
在IPv4网络中,报文如果过大,则需要分片进行发送,所以在每个节点发送报文之前,设备都会根据发送接口的最大传输单元MTU(Maximum Transmission Unit)对报文进行分片。在IPv6中,如果报文较大,超出中间链路的MTU,这时分片会增加中间设备的压力,所以IPv6协议中规定中 间转发设备不能对IPv6报文进行分片,而将报文的分片将在源节点进行,分片重组在目的节点进行。当中间转发设备的接口收到一个报文后,如果发现报文长度比转发接口的MTU值大,则会将其丢弃;同时将转发接口的MTU值通过ICMPv6报文的“Packet Too Big”消息发给源节点,源节点以该值重新发送IPv6报文,这样带来了额外流量开销。PMTU发现协议可以动态发现整条传输路径上各链路的MTU值,减少由于重传带来的额外流量开销。
IPV6不支持中间设备分片原因:
- 提升效率:在 IPv4 当中,中间路由器的分片功能对路由器来说较为复杂和耗时,分成多片后也显著增 加了后续所有路由器的转发开销,这对整个网络的通信效率产生了一定程度的影响。IPv6 作为IPv4的升级协议,自然考虑到了这一点,把它移到源端和目标端进行分片重组,能有效地提升中间路由器的转发效率。
- 提升安全性:分片一直是 IPv4 中安全漏洞的常见来源。对于分片的 IPv4 数据包,第 4 层报头信息(如 TCP)在第2个到最后一个分片中不可用。分片和分片重组的过程可能会在中间节点(如防火墙和路由器)和终端节点(如用户计算机)中产生意外和有害的行为。
PMTU发现协议是通过ICMPv6的Packet Too Big报文来完成的。首先源节点假设PMTU就是其出接口的 MTU,发出一个试探性的报文,当转发路径上存在一个小于当前假设的PMTU时,转发设备就会向源节点发送Packet Too Big报文,并且携带自己的MTU值,此后源节点将PMTU的假设值更改为新收到的MTU值继续发送报文。如此反复,直到报文到达目的地之后,源节点就能知道到达目的地的PMTU了。
整条传输路径需要通过4条链路,每条链路的MTU分别是1500、1500、1400、1300,当源节点发送一个分片报文的时候,首先按照PMTU为1500进行分片并发送分片报文,当到达MTU为1400的出接口时,设备返回Packet Too Big错误,同时携带MTU值为1400的信息。源节点接收到之后会将报文重新按照PMTU为1400 进行分片并再次发送一个分片报文,当分片报文到达MTU值为1300的出接口时,同样返回Packet Too Big错误,携带MTU值为1300的信息。之后源节点重新按照PMTU为1300进行分片并发送分片报文,最终到达目的地,这样就找到了该路径的PMTU。
由于IPv6要求链路层所支持的最小MTU为1280,所以PMTU的值必须大于1280。建议使用1500作为链路的 PMTU值。
IPV6报文分片使用的扩展报头(44)所包含的参数
在IPv6中,使用分片报头44来实现IPV6的报文分片,以便于源节点分片,目的节点进行重组。IPV4的分片是 在基本报头中实现的,IPV6是通过基本报头的next-header来标识下一个报头,将分片报头紧跟在基本报头之后。分片扩展报头中的信息与IPv4头部中的分片信息大致相同,identfication标识符字段为32位,IPv4为16位,这个更大的字段提供了在网络中容纳更多分片的能力。
打开一个分片包
IPv6报文分片过程
源节点分片数据包
当源节点决定发送一个数据包,并且大于其设定的MTU时,需要对数据进行分片之后再发送。
此时,源数据包可分为如下两部分:
不可分片部分和可分片部分。
不可分片部分包括IPv6头部和任何到达目的地之前需要由中间节点处理的扩展头部(即包括路由头部之前的所有头部,如果有逐跳选项扩展头部,则是该头部之前的所有头部)。如:Routing Header或者Hop-by-Hop Options Header。
可分片部分包括数据报的其余部分(即目的选项头部,上层头部和有效载荷数据)。此部分根据MTU大小切割 成若干相同大小的分片数据,且每一个分片数据为8 octets的整数倍,然后剩余小于MTU的数据组成最后一 个分片包,简单说,就是有些扩展头部是不允许分片的,需要每个分片报文都携带这部分不允许分片的内容。
当原始数据报被分片后,将会产生多个分片包,其中每一个分片数据包由如下部分构成:
- 1. 源数据包中的不可分片部分,Payload Length为此分片数据包的排除IPv6包头长以外的所有数据长度, Next Header中必然为Fragment Header for IPv6(44);
- 2. 扩展包头——Fragment Header——内容:a. Next Header为源数据包中的Next Header;b. Fragment Offset: 第一个分片为0,之后的分片为8的整数倍;c. M flag:最后一个分片为0,其他分片 为1;
- 3. 分片数据。
注意: 由于中间节点路由器不针对分片数据包重组和再分片,所以源节点的MTU最好定义为所有节点的MTU 最小值。
下面结合一个例子演示一下IPv6源节点对数据报的分片过程。在该例子中,一个6000字节的有效载荷被分片,其中分片的大小都没有超过1500字节(一个典型的以太网MTU),分片数据的大小仍为8字节的倍数。
如上图:R4要与R1互访,R4为报文发送的源节点,报文大小为6000字节,目的节点为R1上的环回网段 1::/64,首先进行PMTU探测,最终发现链路最小的MTU值为1300,然后开始将6000字节的报文分片,每个 分片中都包含一个带相同的标识符字段的分片头部,以便于目的节点收到报文后判断所有分片是否为同一个 报文。除了最后一个分片M位设置为0,其他所有分片的M位都设置为1,表示不是最后一片,偏移量以8字节为单位。
当前将有效载荷6000字节开始分片,链路最小MTU为1300字节,表示IPV6的报文只能封装1300字节,这 1300字节中包含两部分内容:可分片部分和不可分片部分,不可分片部分为IPV6的基本报头,以及分片所用的分片报头(44),剩余为可分片部分,所以得出1300字节-40字节的IPV6基本报头-8字节的分片报头=实际 分片的数据,同时需要满足一个条件,可分片的数据必须被8整除。
以上图为例:1300-40-8=1252,1252除以8余4,不能被8整除,所以分片数据的字节需要下降,变为1248字 节,此时1248字节可以被8整除,所以最终使用1248字节来分片,6000字节以1248字节为一片开始切片, 最多可以分为5片,最后一片不需要被8整除,分片报文如下图:
分片报头中存在几个重要的标志位,Offset偏移量(用于报文重组排序)、Identfication分片标识(同一份报文的分片标识都一致,用于标识分片属于同一个报文),More Fragment(置位为1表示后续还有分片, 该片为中间分片报文,置位为0表示该片为最后一片,后续不会再有分片),next header表示下一个IPV6报头类容或者上层协议。
在报文分片过程中,偏移量的作用是分片重组是排序,标识每一个分片所处原报文的位置,所以每一个分片报文的偏移量值都不相同,该值如何计算呢?如下:首先报文一共分为5片,从0开始排序,可以排到4,每 一片的偏移量计算如下:
- 第一片,0X(1248字节/8字节)=0
- 第二片,1X(1248字节/8字节)=156
- 第三片,2X(1248字节/8字节)=312
- 第四片,3X(1248字节/8字节)=468
- 第五片,4X(1248字节/8字节)=624
最终报文每一个分片封装的长度为:1248字节(有效数据载荷)+8字节(分片报头)+40字节(IPV6基本报 头)+二层帧头14字节=整个发出去的报文长度,值得注意的是第一个分片到第四个分片都标识了上层协议为 ICMP(58),但是并没有携带ICMP报文头部,只有在最后一个分片不仅标识了上层协议而且还携带了ICMP的头部,以上就是R1访问R4报文分片的全过程。
这是第一个分包片
这是第二个分包片
最后一个分包片--由于使用ping测试,类型为ICMP。
配置:
1.所有节点配置IPV6地址
[Huawei]ipv6 —全局开启IPV6
[Huawei-GigabitEthernet0/0/0]display this
[V200R003C00]
#
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address 1200::1/64 —接口激活IPV6,并配置IP地址
[Huawei-GigabitEthernet0/0/0]ipv6 mtu ?
INTEGER<1280-1500> MTU (bytes) —改变接口默认的IPV6mtu值
2.配置路由使全网可达------采用OSPFV3
配置如下:
[Huawei]ospfv3 1 —全局启动OSPFV3
[Huawei-ospfv3-1]router-id 1.1.1.1—配置RID,这里需要注意的是OSPFV3必须手工指定RID,格式按照
IPV4的格式指定,如果不指定RID,OSPFV3将无法正常工作
[Huawei-GigabitEthernet0/0/0]ospfv3 1 area 0 —进入对应的接口,在接口上使能OSPFV3,这里指定接
口使用的OSPF进程和属于的区域,注意:所有需要接入OSPF网络的接口都需要进行接口使能。区域ID可以
采用十进制整数或IPv4地址形式输入,但显示时使用IPv4地址形式
测试:ping ipv6 -s 6000 1::1(-s指定ping包的大小,即数据量这里指定为6000字 节,目标网段1::/64)