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 分片.
3R3 连接 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.
4PathMTU
通常情况下, 设备根据接口的 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 值, 否则会造成报文丢弃.
来源: http://blog.51cto.com/xxy12345/2511193