4台路由器运行RIPng,每台设备配置loopback地址,
配置举例:
#
ipv6
#
ripng 1
#
interface GigabitEthernet0/0/0
ipv6 enable
ipv6 address auto link-local
ripng 1 enable
#
interface GigabitEthernet0/0/1
ipv6 enable
ipv6 address auto link-local
ripng 1 enable
#
interface LoopBack0
ipv6 enable
ipv6 address 2001::2/128
ripng 1 enable
#
测试源IP为R1的loop0:2001::1,目的IP为R4的loop0:2001::4
1 默认配置MTU1500
默认配置下,接口的MTU值为1500
默认配置下ping 1000字节的包
ping ipv6 -s 1000 -c 1 2001::4
ICMP Request:
IPv6包的总长1062字节=14字节链路层+40字节IPv6头+8字节ICMPv6头+1000字节数据,payload 1008字节=8字节ICMPv6头+1000字节数据
链路层:14字节,6字节目的MAC,6字节源MAC,2字节以太网类型。
IPv6层:固定40字节
ICMPv6:1008字节, 8字节的ICMPv6头部(Type 1字节,Code1字节,Checksum 2字节, Identifier(2字节),Sequence(2字节)),1000字节的Message Body(原始Data(1000字节)
ICMPv6 Reply:
R4收到报文后回复ICMPv6 Reply,长度相同,且 Identifier和Sequence值相同。
因此如果要不分片,对于IPv6数据包来说,承载数据内容不能大于1500-40=1460, IPv6固定头部40字节,对于ICMPv6,8个字节的报头,因此原始数据不能超过1460-8=1452。
注:这里的MTU是指三层IPv6 MTU,因此链路层字节不参与计算。
我们测试1452个字节,没有分片
ping ipv6 -s 1452 -c 1 2001::4
我们测试1453字节,触发分片。
ping ipv6 -s 1453 -c 1 2001::4
查看第一个分片
总数据包1510=14(链路层)+40(IPv6头)+8(分片扩展头)+1448数据,三层数据包1496,Payload Length 1456=8(分片扩展头)+1448数据。分片扩展头M置位表示有后续分片, Identification标志符为0X00000015。
查看第二个分片
总数据包75=14(链路层)+40(IPv6头)+8(分片扩展头)+13数据,三层数据包61,Payload Length 21=8(分片扩展头)+13数据。偏移量181,单位为8字节,实际偏移量1448,等于上个分片的数据量,M为0,代表这是分片的最后一个,Identification标志符为0X00000015与上个分片一致。
2 R3连接R2的接口修改MTU为1440
[R3-GigabitEthernet0/0/0]ipv6 mtu 1440
1. 不分片的包大小为1440-48=1392,ping ipv6 -s 1392 -c 1 2001::4
ping ipv6 -s 1392 -c 1 2001::4,不分片
2. ping ipv6 -s 1393 -c 1 2001::4,不通,抓包看ICMPv6的Identifier位0Xd2ab
查看R4接口抓包,发现R4回了ICMPv Reply,Identifier位也是0Xd2ab,这里但被R3回复了ICMPv6 Packet too big
我们查看R3回复的包,里面携带了R3连接R2接口的MTU,因此我们确定MTU是生效在接口出方向。
3. 继续ping ipv6 -s 1393 -c 1 2001::4,这时候MTU已经适应,我们看到request没有分片,reply分片。
3 R3连接R2的接口修改MTU为1300
[R3-GigabitEthernet0/0/1]ipv6 mtu 1300
1. 不分片的包大小为1300-48=1252,ping ipv6 -s 1252 -c 1 2001::4
2. ping ipv6 -s 1253 -c 1 2001::4,R1处抓包,R3回复给R1了ICMPv6携带MTU
3. 第二次ping ipv6 -s 1253 -c 1 2001::4,发送的报文分片,回复的未分片,因为回复的MTU为1440。
4 PathMTU
通常情况下,设备根据接口的IPv6 MTU值动态协商PMTU。在某些特殊情况下,为了保护网络设备的安全,避免受到超长报文的***时,可以手工配置到指定目的节点的PMTU,以控制设备到目的节点可转发报文的最大长度。
恢复各端口的默认MTU配置,修改R3连接R4的PMTU为1400
1. R3上配置PMTU
[R3]ipv6 pathmtu 2001::4 1400
R1上ping ipv6 -s 1452 -c 1 2001::4(在默认MTU1500不会分片),在R1/R2/R3都没有分片。
2. R1上配置PMTU,R1上ping ipv6 -s 1452 -c 1 2001::4,触发分片,PMTU在源节点生效,对过路报文不生效。
3. R2往R3方向配置MTU为1399,小于PMTU,ping ipv6 -s 1452 -c 1 2001::4,触发分片,分片大小为PMTU1400,R2的MTU为1399,第一个分片因此一直回复ICMPv6超时(Packet too big),第二个分片可以传送过去,但因为无法重组,R4收到不回复。
5 总结
1. MTU的生效方向为接口的出方向,IPv6 MTU XXX命令针对是IP层的MTU;
2. 要是发送的数据不分片,传送数据不大于MTU-40(IPv6报头),传送数据包括扩展报头时,净载荷=MTU-40(IPv6报头)-扩展报头(比如ICMPv6为8);
3. 当报文超过节点的出接口MTU时,节点回复ICMP超时消息携带MTU给源端节点(数据发起方);
4. 配置设备到指定目的节点的PMTU时,中间途径的所有设备接口的IPv6 MTU值不能小于需要配置的PMTU值,否则会造成报文丢弃。
来源:oschina
链接:https://my.oschina.net/u/4353161/blog/4396951