ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-04-20 18:06:01  阅读:381  来源: 互联网

标签:mss 报文 MSS TCP MTU IP pppoe mtu PPPOE


一、问题描述

前端是连接因特网的路由器,中间利用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值代替。

 

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

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

2、什么是MTU

我们可以根据下面这面图表来了解MTU

 

 

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的问题基本搞清楚了。

标签:mss,报文,MSS,TCP,MTU,IP,pppoe,mtu,PPPOE
来源: https://www.cnblogs.com/chenxiaomeng/p/12739395.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有