飞扬的喵窝 猫爪必须在上

使用GRE隧道时,可能会遇到的MTU问题

使用GRE隧道时,可能会遇到的MTU问题

一般来说,以太网的MTU(帧除了头以外的Palyload)是1500字节,头+尾尾则是14字节 

这1500字节包含了 
  1. IP层头(固定20字节)

  2. TCP / UDP层报头(固定20字节)

  3. TCP / UDP层有效载荷

对TCP来说,在三方交握时,两方会针对第三点的大小进行协议,得到的数值就是MSS 

因为以太网MTU一般是1500字节,扣掉固定大小的IP头和以太网头部之后, 

得到的1460 Bytes就是在一般情况之下,MSS能够达到的最大值。 

因此TCP在进行三方交握时,一般都假设自己的MSS是1460 Bytes。 


好,MTU的观念整理完了,接下来要说GRE Tunnel。 

GRE Tunnel是把封包原封不动的在前面另外加上GRE Header,而这个Header总计24 Bytes *。 

所以一个TCP / IP包(MSS = 1460),送到GRE隧道路由器后,再加上GRE头部会变成 
1460 + 20 + 20 + 24 = 1524字节
冰崩,问题来了,就算是GRE Tunnel的封包,最终还是要从实体端口传送出去, 

以太网MTU是1500字节,所以封包若要传送一定要经过Fragmentation,如果封包加上DF,则传送就会失败。 

要避免分段的问题,其中一个方法是减少MSS,让封包加上GRE Header之后还能在1500 Bytes以下。 

因此这个MSS应该小于或等于 
1500-24-20-20 = 1436
这也是为什么GRE隧道MTU预设会是1436 + 20 + 20 = 1476字节了 


至于修改MSS的方式有几种, 
  1. 主机上修改。很不方便,不建议

  2. 路由器拦截TCP连接后修改MSS值: ip tcp adjust-mss 1436 (设定在int tunnel)(注)

在windows中ping指令测试时,要注意的是,当我们用-l指令来指定封包大小时,这个大小其实只包含了icmp数据栏位,也就是不包含icmp header **,更不包含ip对于MTU = 1500字节的以太网来说,icmp封包超过1500 - 20 - 8 = 1472时,封包就无法传送出去了。(前提是测试时有设定DF位) 
ping 168.95.1.1 -l 1472 -f
但在cisco设备上作ping测试时,指定的数据包大小其实是包含了ip头+ icmp头+ icmp数据所以做测试时,包大小最大可以设定成1500.超过此数值,又同时设定df-bit则封包会无法传送***。 

IPv6报头大小为40字节,所以一般状态下MSS应该是1500(MTU) - 40(IPv6报头) - 20(TCP报头)= 1440字节在GRE隧道状态下,MSS等于1500 - 24 - 40 - 20 = 1416字节(比IPv4小20字节)。 

* 更严格来说4字节系来自于GRE的4字节与新的IP头20字节因为 新IP包=新ip头+ gre头+原始ip包 。通过使用GRE的动态多点VPN(DMVPN)标题是26字节。 

** ICMP封包的完整格式包括: ethernet header + ip header + icmp header。所以icmp不属于二层也不属于三层,但是又需要IP来协助传送。


***引用思科论坛上一个CCIE工程师的回答 
在IOS中,当您指定大小时,即总的包长度。 因此,如果指定大小250,则数据包将为250字节。 在Windows中,ping -l <size>指定ICMP数据。 所以-1 250产生278字节的IP分组。 这被计算为250字节的数据+ 8字节的ICMP报头+ 20字节的IP报头。 我只是想区分是什么大小意味着在IOS而不是Windows。
注意有的文章说IPv6的指令,IOS版本必须在15.2(4)M之后才有,但是我测试结果是不行,或许跟许可有关? 


2014-07-07更新 
经理网路上前辈提醒,该文章说的ipv6 tcp adjust-mss指令,只有在ASR才会出现,所以我用ISR试一辈子也没用。不过原本的IP tcp adjust-mss指令就可以满足我的条件,因为他会同时修改IPv6和IPv4 TCP MSS。早上做了实验的确是这样,用Wireshark看三方交握的封包,确定改成我设定的1220字节(测试用,依据最小MTU 1280 byte计算得来)

参考文章 
http://networklessons.com/ip-routing/pppoe-mtu-troubleshooting-cisco-ios/ 
http://www.cisco.com/c/en/us/support/docs/ip/generic-routing-encapsulation-gre/13725-56.pdf 
http://itchenyi.blog.51cto.com/4745638/1137143 
http://blog.thousandeyes.com/troubleshooting-path-mtu-tcp-mss-problems/ 
http://switchpacket.blogspot.tw/2014/07/understanding-difference-between-mtu.html 


作者:Fish 分类:网络摘抄 浏览:533 评论:0
留言列表
发表评论
来宾的头像