• 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值代替。

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

  • 相关阅读:
    爸爸妈妈儿子女儿吃水果问题以及五个哲学家吃饭问题
    同步与互斥中的购票和退票问题的PV操作与实现
    创建react&ts&antd项目
    在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”的解决方案
    aws rds 储存空间占用 异常排查 存储空间占满
    Linux下clang、gcc、intel编译器最新版本安装笔记
    extern "C"与extern "C" { … }的差别
    gcc预处理指令之#pragma once
    指向类的成员变量的指针
    Java程序中使用SQLite总结
  • 原文地址:https://www.cnblogs.com/chenxiaomeng/p/12739395.html
Copyright © 2020-2023  润新知