AR路由器部署MPLS VPN后由于TCP MSS值不合理导致无法访问网页

发布时间:  2015-09-23 浏览次数:  1032 下载次数:  0
问题描述
如图1所示,CE_1和CE_2连接企业分支,CE_3和CE_4连接企业总部,其中CE_1和CE_3属于vpna,CE_2和CE_4属于vpnb。企业部署了MPLS VPN后,企业分支的PC能Ping通总部服务器的IP和域名,但却不能通过HTTP访问网页。而PC和服务器网上邻居、文件共享业务正常。

图1 MPLS VPN网络



设备信息及版本信息:AR2240 V200R005C20SPC200
处理过程
1、检查PC与服务器之间的链路是否正常。

在PC上Ping服务器IP地址和域名,例如服务器地址为10.1.1.1,执行ping 10.1.1.1命令可以正常Ping通。再用Tracert工具跟踪路径也正常,表明PC跟服务器的链路没有问题。

2、检查设备配置、各协议邻居状态,路由表都正常。

3、检查MTU值是否设置合理。

在PC上Ping服务器IP地址并且设置报文的DF位为不允许报文分片。Ping多次发现能Ping通最大包只能是1468字节,而1469字节就Ping不通了,所示怀疑是由于MTU值不合理引起的。因为在原网络不分片的情况下,可以Ping通的报文最大字节是1472字节。而部署了MPLS VPN网络后会多打上一层4字节的MPLS标签,所以会比1472少4字节。

然后在两端PE路由器上调大接口MTU及MPLS MTU值为1520。发现能Ping通最大包还是1468字节,1469字节就Ping不通。后来经客户咨询运营商了解是运营商传输设备的MTU做限制了。

4、检查TCP MSS值是否合理。



通过获取报文分析发现有TCP Previous segment lost告警,说明TCP报文有丢失。因为MSS值加上各种开销的报文总长度(MSS+TCP报文头+IP报文头)大于链路的MTU值。由于TCP连接一般情况下不允许分片(协商MSS值)会设置DF位,而企业部署MPLS VPN会在数据报文中增加MPLS标签,导致MSS值加上各种开销的报文总长度超过传输链路MTU值造成丢包,从而使HTTP应用不能正常访问。

5、修改TCP MSS值。

在PE与CE互联接口下执行命令:tcp adjust-mss 1452 ,调小接口的TCP最大报文段长度。修改TCP MSS值后,PC可以通过HTTP正常访问服务器网页。

根因

TCP MSS(Max Segment Size)指定了TCP最大报文段长度,如果MSS值加上各种开销的报文总长度(MSS+TCP报文头+IP报文头)大于链路的MTU值,则数据报文会被分片发送。

在本案例中,TCP报文总长度(MSS+TCP报文头+IP报文头+MPLS标签等)大于链路的MTU值,导致数据报文会被分片发送。对于某些高层应用(例如HTTP等应用层协议等)会将IP报文的DF(Don't Fragment)标记位置为有效,以防止TCP报文分片。如果DF标记位被置为有效,而路由器接口MTU小于MSS的值,此时路由器会因为不能强制分片TCP报文而将报文丢弃。所以PC无法正常访问服务器网页。

解决方案
在MPLS VPN场景中,考虑到TCP报文头、IP报文头等开销,有三种方案:

1、在PE与CE互联接口下执行命令:tcp adjust-mss 1452,调小接口的TCP最大报文段长度,从而使TCP报文总长度(MSS+TCP报文头+IP报文头+MPLS标签等)不会超过传输链路MTU值,从而不会造成丢包。

2、联系运营商将传输链路MTU值调大。

3、修改PC的MTU值,因为TCP 协商的MSS值是由设备本身MTU-20(IP头)-20(TCP头)。如果把MTU调小MSS协商的值也会变小(因为MSS值是取两端的最小值)。

这里采取第一种方法解决问题。
建议与总结
在部署MPLS VPN时,PC只能Ping通服务器IP地址,却不能通过HTTP访问服务器网页,这时需要考虑MTU和MSS值的问题了。

END