[转载]【IPv6】基于ICMPv6的PMTUD

标签:
转载 |
分类: CCIETEA |
原文地址:【IPv6】基于ICMPv6的PMTUD作者:红茶三杯
- PMTU就是路径上的最小接口MTU。
- PMTUD的主要目的是发现路径上的MTU,当数据包发向目的地时避免分段。然后源节点可以使用发现到的最大MTU与目的地节点进行通信,这样可以避免数据包在从源传输到目的的过程之中,被中途的路由器分片,而导致性能的下降。
- 因此IPv6的分片不是在中间路由器上进行的,仅当路径MTU比欲传送的数据包小的时候,由源节点自己对数据包进行分片。
在RFC1981中定义了PMTU发现协议。IPv6 PMUTD使用ICMPv6 Type
2消息。典型过程如下:
- 首先Source用1500字节作为MTU向目标节点发送一个IPv6数据包
- 中间路由器A意识到数据包过大,MTU为1400,于是回复一个ICMPv6 type=2消息向Source应答,在该ICMPv6消息中指定较小的MTU=1400
- Source开始使用MTU=1400发送IPv6数据包,该数据包到了B
- 然而B意识到本地接口MTU为1300,于是回复一个ICMPv6 type=2消息向Source应答
- Source开始使用MTU=1300发送IPv6数据包,该数据包顺利到达了目的地。
- Source和Destination之间的会话被建立起来。
注意:
- PMTU,指的是单向的,沿路上的数据包出接口MTU中最小的。
- IPv6要求的链路层所支持的MTU最小为1280bytes
- 用IPv6 PMTUD发现的MTU值被源节点缓存,使用CISCO IOS,可以用show ipv6 mtu来显示每个缓存的目的地PMTUD值
测试:
1.准备工作
2.实验测试
现在,将R2的Fa1/0口的接口ipv6 MTU修改为1400字节(上图中默认接口IPv6
MTU都是1500字节):
Ipv6 mtu 1400
完成后,在R2上简单的show一下:
R2#show ipv6 interface f1/0
FastEthernet1/0 is up, line protocol is up
……
现在,我们再到R1上,
R1#ping 2034::4 repeat 1 size 1500
!! 让R1产生一个报文大小为1500的包,发给R4
Type escape sequence to abort.
Sending 1, 1500-byte ICMP Echos to 2034::4, timeout is 2
seconds:
B
结果不通,因为报文在传递到R2时,超出了R2 Fa1/0口的MTU,因此R2回送一个TYPE=2(packet too
big)的ICMPv6消息给R1。在这个回送给R1的ICMPv6消息中,包含允许的MTU=1400,以便告知R1,后续发送的报文不要超过1400字节。这个过程抓包如下:
其中,R2回送给R1的ICMPv6差错消息如下:
此时,在R1上进一步查看一下:
R1#sh ipv6 mtu
MTU Since
Source Address
Destination Address
1400 00:00:27
2012::1
2034::4
我们发现,R1创建了一条缓存,标识从2012::1到2034::4,PMTU=1400,因此R1在后续发送给2034::4的报文中,如果超出1400字节,R1自己就会进行分片,例如我们再做测试,在R1上继续ping
2034::4,报文大小为1500字节,则:
上图中,前面两个包就是R1发送给R4的ICMPv6报文的两个分片,第三个报文是R4的reply包
所以这样R1发送大包给R4的时候,就不会有问题了。直接在R1源头这就分片。当然,我们可以继续试验,在R3的Fa1/0接口上将IPv6
MTU设置为1300字节,然后继续R1去ping大包给R4,最终R1上的缓存条目,PMTU会变成1300字节。
红茶三杯
网络工程 | 项目管理 | IT服务管理 | CCIE培训
学习 沉淀 成长 分享