pppoe环境下的mtu和mss的配合问题

一、问题描述

前端是连接因特网的路由器,中间利用LINUX –IPTABLES搭建的防火墙,由PPPOE协议承担拨入功能,并开通NAT,后端是客户机,故障现象是当LINUX系统拨入VPN后,LINUX系统本身域名解析和网站浏览正常,NAT后端客户机出现域名解析正常但网站浏览失败。

二、问题解决

我们在给防火墙加入以下规则后,网络通信恢复正常。

iptables -A FORWARD -p tcp -m tcp--tcp-flags SYN,RST SYN -j  TCPMSS--clamp-mss-to-pmtu

我们现在来看下这条规则的具体功能,-A 是增加,-FORWARD是要处理通过的数据包,-p,指定要审查tcp协议,审查内容是SYN, RST标志,TCPMSS,是指通过TCPMSS模块调整MSS的大小。

那么为什么通过调整MSS的大小就可以解决的网络通信的故障呢?

三、MSS和MTU

 1、什么是TCP-MSS?

MSS: Maxitum Segment Size 最大分段大小,MSS就是TCP每次能够传输的最大数据分段。为了达到最佳的传输效能,TCP协议在建立连接时要协商双方的MSS值,现实情况下,常使用二层协议中的MTU值代替。

pppoe环境下的mtu和mss的配合问题

 

TCP报文中MSS的位置在选项的位置,选项中内容有很多种,MSS是其中的一种。MSS在TCP报文中是可选项不是必选项,换句话说MSS是可协商的,而且在协商过后该选项内容可以改变也可以没有,在协商MSS时一般是建立TCP连接的两端发送[Syn]标志报文时互相通报然后选取最小MSS作为双方的约定。

这里又出现了一个概念,MTU。

2、什么是MTU

我们可以根据下面这面图表来了解MTU
pppoe环境下的mtu和mss的配合问题

 

 

MTU:MaxitumTransmission Unit 最大传输单元,在以太网中数据帧最长为1518Bytes,扣除帧头14Bytes和帧尾CRC校验部分4Bytes,承载上层协议的数据部分最大是1500Bytes. 这个值我们就把它称之为MTU。网络层的IP协议会根据这个值来决定如何对数据进行分片,在网络,两台终端进行网络通信时,数据需要经过各种型号的路由器和多种传输媒介才能到达对端,网络中不同媒介的MTU各不相同,最终取值由最小的MTU值决定。对于网络层的上层协议而言,它们对MTU的值并没有特别关心,它们认为这个是网络层的工作。网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,所以在网络层更高一层(传输层)的实现中往往会对此加以注意。有些高层协议要求在IP包中设置DF标志,DF(Donot Fragment),说明不能进行分片,这样当这个IP数据包在网络传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据 包,然后返回一个错误信息给发送者。这样会造成某些通讯上的问题,不过现实情况是大部分网络链路都是MTU1500或者大于1500。

3、MTU和MSS的联系

MTU是一个二层的概念,以太网最大的MTU是1500Bytes,MSS是TCP协议中一个可协商的选项,,它是TCP数据包每次能够传输的最大数据分段, IP MTU=MSS+20Bytes(IP包头)+20Bytes(TCP包头)。在PPPoE的情况下,还要包括6Bytes的PPPoE头部和2Bytes的PPP协议ID号,因此, PPP负载数据不能超过1492字节,也就是相当于在PPPOE环境下的MTU是1492字节,MSS是1452字节。

四、原因

现在回头看下问题的产生原因:在利用pppoe+nat组网时,由于PPPOE是按下图的形式进行封装的,

IP

PPP

PPPoE

Ethernet

 

随着宽带接入,PPPOE由于具有认证和计的费功能而得广泛应用。

下面是PPPOE的数据报文格式:

版本

类型

代码

会话ID

长度

净载荷

PPPOE是通过以太网传输的,其含有PPPOE协议头有6个字节和以太网帧类型2字节。这个8字节的PPPOE封装字段会在数据从拨号接口发送出去时被添加到数据报文中。因此,该数据报文从拨号接口出去时的真实长度会大于物理以太网接口的MTU值1500,因此,该数据包将会被丢弃,PPPOE造成的影响是二次封装耗费资源,降低了传输效能等等,最大的不足就是PPPoE导致MTU变小了,以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492,所以在PPPOE环境下,设置接口MTU时需要将8个字节的PPPOE封装字段考虑进去,MTU=1500-8=1492,这样,当IP报头(20)+ICMP报头(8)+ICMP净荷载长度+PPPOE头(8)<=物理接口1500(即ICMP净载荷<=1500-28=1472)时,该数据包不会因为数据包长度超过接口MTU值被丢弃,而且还可以在不需要分片的情况下最大限度的发送数据包,提高传输效率

所以有可能由于报文太大需要分片,导致必须通过设置tcpmss解决。另外IP 报文里是由五元组组成的的,报文要进行分片的,这时就有可能只有第一片报文带有IP的五元组信息(源目的ip位址,源目的端口号,协议号),后续的分片不再保留 TCP/UDP报文所有的标识信息,如端口号信息等,这时,当网关进行NAT转换时,将导致报文不能正确组包,

因此可以看出,MTU和TCP MSS是密不可分的,在PPPOE+NAT环境下尤为重要。如果是PPPOE+NAT上网出现网站打开不流畅,就有可能是MTU或MSS设置不当了,至此,对PPPOE+NAT上网环境下MTU和MSS的问题基本搞清楚了。

上一篇:TCP/IP的一些需要理解的点(一)


下一篇:YESLAB学霸日记—PMTU实验