PMTUD是IPv6的一个工作机制。
其主要的目的就是,当网络源发送数据报文到目的的时候,避免分段,也可以称为分片。
源节点可以使用发现整个路径上面最大的MTU与目的节点通讯。
我们都知道,分段实际上是有害的,对主机的cpu利用率,对路由器的cpu利用率都是一个挑战。
如果再有一些高人利用这些微妙的东西做一个小软件进行一些改动做一个攻击软件,呵呵,那么很容易就导致网络瘫痪。
而且分片对设备的转发能力的性能也要求偏高。
这也是现在一些客户需要巨帧的需求所在。像我遇到的客户在测试的时候就一定需要我们某一个路由器必须支持至少9000bytes的巨帧,不能分片。后来了解到,客户这条链路是要用于高清HD组播视频流的。对于我们来说,每个高清数据流的网络流量大概是每秒4M多字节的带宽需求,客户对于这条组播链路要使用大概5-10个组播组,如果是10个也就是大概50M的整机转发流量的需求。这个时候再加上分片,cpu利用率就可想而知了。
所以对我们来说也是相当有必要的。(当然这段是说的IPv4,但是原理和ipv6一样,如果硬件支持,最好不要分片)
在RFC2460里面,也强烈建议IPv6节点实现IPv6 PMTUD以避免分段.
好了,下面来说一下原理。
IPv6 PMTUD使用ICMPv6的类型2,既数据包超长错误消息。
利用这个包来进行探测做大的MTU值给源网络设备。
可以看看这里,类型2:数据包报文过大,这个类型2就是专门为PMTUD来设计的。
或者可以说,PMTUD的实现原理就是通过ICMPv6的类型2报文来实现的。
这里可以看到,从源到路由器A,发送ICMPv6 二类报文出去,携带MTU=1500能力,路由器A返回的是1400,然后源又发送给路由器B,路由器B回应一个ICMPv6 类型2报文回来,最后源主机只能得到MTU=1300.
下面看看是怎么实现的。
在这里,R1,作为源.在路由器R2上面,FE1/0上面配置一个ipv6 mtu 1400.
在路由器R3的FE0/0上面配置一个ipv6 mtu 1300.
那么最后的结果R1 show出来的是1400还是1300呢?这里通过做实验得到的结论是只在出接口有效果.
这里从R1上面,ping大包,1500字节的,到R3的还回接口2025::1
最后得到的是R2出接口的MTU=1400.
R3上面F0/0配置的ipv6 mtu 1300并没有生效。
我有一个疑问,难道在生产网上面一定需要在数据包通讯以前都要ping一个大包到对端才能正常的工作吗?
应该不是这样的,一些实际的报文应该会触发ICMPv6 类型2的工作机制。