请选择 进入手机版 | 继续访问电脑版

设为首页 收藏本站
思科服务支持社区 点击关注
思科服务支持社区

  
 找回密码
 立即注册

扫一扫,访问微社区

搜索
热搜: 邮件服务器
查看: 455|回复: 2

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

[复制链接]
发表于 2018-6-20 15:20:10 | 显示全部楼层 |阅读模式


案例背景:
  某公司有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值,使得报文不需要分片,就解决了该问题。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
平均得分3 (1 评价)
发表于 2018-7-2 11:30:16 | 显示全部楼层
楼主的分享很经典!谢谢分享!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
平均得分0 (0 评价)
发表于 2018-7-3 10:13:30 | 显示全部楼层
图文并茂,很详细,学习了,感谢分享
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
平均得分0 (0 评价)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver | 思科服务支持社区  

GMT+8, 2018-7-21 12:16 , Processed in 0.078958 second(s), 34 queries .

京ICP备09041801号-187

版权所有 :copyright:1992-2019 思科系统  重要声明 | 保密声明 | 隐私权政策 | 商标 |

快速回复 返回顶部 返回列表