1

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

2

默认配置下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字节

ICMPv61008字节, 8字节的ICMPv6头部(Type 1字节,Code1字节,Checksum 2字节, Identifier(2字节),Sequence(2字节)),1000字节的Message Body(原始Data(1000字节)

3

ICMPv6 Reply:

R4收到报文后回复ICMPv6 Reply,长度相同,且 Identifier和Sequence值相同。

4

因此如果要不分片,对于IPv6数据包来说,承载数据内容不能大于1500-40=1460, IPv6固定头部40字节,对于ICMPv6,8个字节的报头,因此原始数据不能超过1460-8=1452

注:这里的MTU是指三层IPv6 MTU,因此链路层字节不参与计算

我们测试1452个字节,没有分片

ping ipv6 -s 1452 -c 1 2001::4

5

我们测试1453字节,触发分片。

ping ipv6 -s 1453 -c 1 2001::4

查看第一个分片

总数据包1510=14(链路层)+40(IPv6头)+8(分片扩展头)+1448数据,三层数据包1496Payload Length 1456=8(分片扩展头)+1448数据。分片扩展头M置位表示有后续分片, Identification标志符为0X00000015。

6

查看第二个分片

总数据包75=14(链路层)+40(IPv6头)+8(分片扩展头)+13数据,三层数据包61,Payload Length 21=8(分片扩展头)+13数据。偏移量181,单位为8字节,实际偏移量1448,等于上个分片的数据量,M为0,代表这是分片的最后一个,Identification标志符为0X00000015与上个分片一致。

7

8

2      R3连接R2的接口修改MTU为1440

 [R3-GigabitEthernet0/0/0]ipv6 mtu 1440

1.        不分片的包大小为1440-48=1392,ping ipv6 -s 1392 -c 1 2001::4

9ping ipv6 -s 1392 -c 1 2001::4,不分片

2.        ping ipv6 -s 1393 -c 1 2001::4,不通,抓包看ICMPv6的Identifier0Xd2ab

10

11

查看R4接口抓包,发现R4回了ICMPv Reply,Identifier位也是0Xd2ab这里但被R3回复了ICMPv6 Packet too big

12

我们查看R3回复的包,里面携带了R3连接R2接口的MTU,因此我们确定MTU是生效在接口出方向

13

3.        继续ping ipv6 -s 1393 -c 1 2001::4,这时候MTU已经适应,我们看到request没有分片,reply分片。

14

3      R3连接R2的接口修改MTU为1300

[R3-GigabitEthernet0/0/1]ipv6 mtu 1300

1.        不分片的包大小为1300-48=1252,ping ipv6 -s 1252 -c 1 2001::4

15

2.        ping ipv6 -s 1253 -c 1 2001::4,R1处抓包,R3回复给R1了ICMPv6携带MTU

16

3.        第二次ping ipv6 -s 1253 -c 1 2001::4,发送的报文分片,回复的未分片,因为回复的MTU为1440。

17

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都没有分片。

18

2.        R1上配置PMTU,R1上ping ipv6 -s 1452 -c 1 2001::4,触发分片,PMTU在源节点生效,对过路报文不生效。

19

3.        R2往R3方向配置MTU为1399,小于PMTU,ping ipv6 -s 1452 -c 1 2001::4,触发分片,分片大小为PMTU1400,R2的MTU为1399,第一个分片因此一直回复ICMPv6超时(Packet too big),第二个分片可以传送过去,但因为无法重组,R4收到不回复。

20

 

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值,否则会造成报文丢弃。