取消
显示结果 
搜索替代 
您的意思是: 
cancel
4915
查看次数
6
有帮助
2
回复

【故障案例分享】在PPPOE环境下MTU引起的部分网站无法访问故障

bo chen
Spotlight
Spotlight

案例背景:

某公司有100人左右,申请了一条20M的电信ADSL宽带,使用思科2821路由器做出出口路由器,内部是几台思科交换机。思科路由器做PPPoE拨号、NAT转换和DHCP的功能。但在配置完成之后,网管发现许多电脑不能打开淘宝网,即使打开图片也显示不出来,QQ等应用正常,大部分网站正常,ping、telnet等测试正常。

拓扑图:


排查过程:



到达现场后,笔者先查看并确认了故障现象,确实跟网管描述一致。由于是多台电脑都有此现象,排除了电脑问题。ping网关、各种网站都正常,排除链路问题。由于是刚刚办理的宽带,怀疑是否是电信问题,于是使用电脑直接接光猫进行拨号连接,发现访问网站正常,说明问题出在公司内部。交换机是一台二层交换机,排除交换机问题,查看路由器配置,PPPoE配置正常,MTU也修改为了1492,但未修改TCP mss值,问题出在这里。

解决方案:

将内网接口或内外网接口的tcp mss都修改为1452,再次进行测试,访问正常。下面分析一下为什么会出现这样的问题。

原因分析:

以太网帧

首先,大家要知道的是,正常的以太网帧最大支持1518个字节。这包括1500字节的IP包,6个字节的目标MAC地址,6个字节的源MAC地址,2个字节的类型字段(Eth type)和4个字节的CRC校验。因此,IP报文最大只能是1500个字节,也叫做MTU(最大传输单元)。

标准以太网帧格式如下图:



IP分片:

如果报文超过了MTU的值,就会产生分片。分片可能在电脑上发生,也可能在中间传输的路由器上发生,由于pppoe会增加8个字节的头部(包括6个字节的pppoe头部和2个字节的ppp头部),因此我们在pppoe的环境下,为了防止IP分片的产生,会将MTU值设置为1492,即IP包大小为1492个字节,加上8个字节的pppoe和ppp头部,正好为1500字节,这样传输给运营商,数据包就不会在互联网上被分片。需要注意的是,通常被分片的数据包都是udp报文,因为tcp这个协议本身已经在传输屋解决了分片的问题。

pppoe数据帧格式如下:



TCP mss(maximum segment size,最大报文长度)

tcp mss就是用来解决TCP报文分片的问题的。tcp mss用来描述的是tcp playload的大小,即TCP包头里面内容的大小。TCP在建立三次握手的时候会协商mss的大小,默认值为1460(mtu1500 - 20IP头部-20TCP头部)。


1 PC1发出SYN报文,其中option MSS字段一般为1460(MTU1500-IP头20-传输头20)
2 SERVER收到后回答SYN ACK应答 option字段也为1452。(图中只是为了区别,写为1452,一般环境都为1460。)
3 协商两端比较SYN 与SYN ACK中MSS大小
4 选择自己的mss和收到的mss中最小的值作为MSS分片大小,如上图所示,自己的mss是1460,而是1452,则使用1452做为tcp mss,即这个会话中的tcp数据包中的每个tcp payload最大为1452字节。

对于MPLS,L3VPN,PPPOE+NAT,IPSEC,L2TP,GRE组网等,通常由于报文太大需要分片,使用TCP MSS解决。

tcp mss的设置:

假设在路由器内网接口配置TCP MSS 1200
路由器收到server的SYN ACK后将TCP MSS改为1200,然后再转发给PC1,PC1收到报文后认为对端的tcp mss为1200,这样PC1发送数据给www server时会以1200作为分片大小;但路由器修改tcp mss为1200的操作www server是不知道的,因此www server还会以1460作为分片大小发送报文。
于是PC就以1200发送报文,但server仍会以1460发送数据。
假设在路由器外网配置 TCP MSS 1200
路由器收到PC1的syn报文时会修改option选项中的mss字段为1200,然后再转发给www server,同样www server发送数据给PC1时会以1200作为分片大小;同样PC1不知道路由器修改tcp mss为1200,因为PC1还会以1460作为分片大小发送报文。
故在路由器的出接口上配置TCP MSS即可实现广域网传输时数据不分片。
在路由器的出入接口均设置可实现整个传输不分片
实际抓包截图:

注意:
MTU为二层包大小,一般为1500。
MSS为四层=MTU-IP大小20-四层包头20(如果有其他pppoe、加密报文头的话也同样减去)=1460最大,MSS值其实就是TCP所承载的净载荷的长度

本案例中的问题:

需要注意的是,IP分片时,只有第一片报文带有完整传输层头部信息,后续的分片报文是没有tcp/udp报文人头部的,因此也就没有端口号等信息。这个时候如果设备又实现了nat转换操作,并且应用又是基于TCP/UDP的,这就导致报文不能正确组包,出现能PING通,但访问WWW,FTP等应用时网速异常缓慢。而通过修改tcp mss值,使得报文不需要分片,就解决了该问题。

2 条回复2

nmyp007
Level 7
Level 7
楼主的分享很经典!谢谢分享!

yangkai_716
Spotlight
Spotlight
图文并茂,很详细,学习了,感谢分享
入门指南

使用上面的搜索栏输入关键字、短语或问题,搜索问题的答案。

我们希望您在这里的旅程尽可能顺利,因此这里有一些链接可以帮助您快速熟悉思科社区:









快捷链接