FortiOS 支持RFC1191,Path MTU Discovery IPv4,一种动态发现网络路径的最大传输单元 (MTU) 的技术。

PMTUD机制

  1. RFC1191中定义了PMTU发现的机制,它是通过ICMP的Destination Unreachable(Type3)携带消息fragmentation needed and DF set(Code4)来完成的。首先源节点假设PMTU就是其出接口的MTU,发出报文,当转发路径上存在一个小于当前假设的PMTU时,就会向源节点发送此ICMP报文,并且携带自己的MTU值,此后源节点将PMTU的假设值更改为新收到的MTU值。如此反复,直到报文到达目的地之后,源节点就能知道到达某个目的地的PMTU了。

  2. 假设源到目的要先后经过4条链路,链路地MTU分别是1500、1500、1400、1300,当源发送一个分片报文的时候(DF置位),首先分成1500大小的片,当到达1400的出接口时,路由器就会返回Packet Too Big错误,同时携带1400的MTU值。源接收到之后就会重新分成1400大小的片,当到达1300的出接口时,同样返回Packet Too Big错误,携带1300的MTU值。之后源重新分成1300的报文,最终到达目的地,这样就找到了该路径的PMTU。

    Untitled

    <aside> 💡 需要注意的是,只有数据包超过路径上的最小MTU时,PMTU发现机制才有意义,如果报文很小,小于路径上的最小MTU,就不可能产生fragmentation needed and DF set(Code4)报文。

    </aside>

  3. 如下所示,PC通过FortiGate ping Internet,data-size=1400,并将DF置位:

    **CentOS**
    [root@CentOS-1 ~]# ping 114.114.114.114 -s 1400 **-M do
    
    Windows**
    C:\\Users\\cyndi>ping 114.114.114.114 -l 1400 **-f**
    
  4. 路径上FortiGate的出接口MTU为1300,则FortiGate会返回如下ICMP报文。

    Untitled

查看PMTU

  1. 通过diagnose ip rtcache list命令,我们可以看到实际流量传输时两个方向使用的PTMU信息,例如:
R1-FG1101E #  diagnose ip rtcache list | grep 10.1.87.222 -A 1
10.1.87.222@50(ToR2)->10.0.86.221@37(port14) gwy=0.0.0.0 prefsrc=192.168.84.11
ci: ref=2 lastused=9 expire=0 err=00000000 used=3 br=0 **pmtu=1500**
--
10.0.86.221@37(port14)->10.1.87.222@50(ToR2) gwy=0.0.0.0 prefsrc=10.0.86.1
ci: ref=2 lastused=9 expire=0 err=00000000 used=4 br=0 **pmtu=1438**
  1. 那么对于IPSec Tunnel的PMTU,是如何工作的呢,请参考PMTU in IPSec