MTU&MSS

MTU是Maximum Transmission Unit的缩写,意为最大传输单元,通俗的理解就是在网络上传送的最大数据包,单位是字节。服务器

      以太网对数据帧的长度都有一个限制,其最大值为1500,这个特性被称做MTU,不一样类型的网络大多数都有一个上限。若是IP层有一个IP包要传,并且数据的长度比链路层上的MTU值还要大,那么就须要对这个数据包进行分片处理,并且要求被分片的每一个数据包都要等于或小于这个MTU值,通常是最后一个数据包小于这个值。例如,一个大小为5000字节的数据包在穿越网络时,若是遇到一条MTU大小为1500字节的数据链路,即数据帧对多能容纳大小为1500字节的数据包。须要在数据成帧以前将数据包分片成多个小的数据包。被分片后,每片数据包的标示字段上打上相同的标记,以便接收者能够识别出属于同一个数据包的分片。若是不分片,该数据包就会被丢弃,从而形成数据包丢失。可是,若是由于MTU值设定得过小,以至于一个不是很大的数据包被分红许多片进行传输,这样就会产生不少数据包碎片,增长了设备负担,下降了网络使用率。网络

     EthernetII帧的结构DMAC+SMAC+Type+Data+CRC。因为以太网传输电气方面的限制,每一个以太网帧都有最小的大小64bytes,最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧咱们均可以视之为错误的数据帧,通常的以太网转发设备会丢弃这些数据帧。 小于64Bytes的数据帧通常是因为以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于这些小于64Bytes的“碎片”,MAC子层就会在数据字段的后面填充以知足整个数据帧长不小于64字节,以便传输。tcp

为何以太网规定会规定数据帧长度不小于64字节?测试

      以太网是不可靠的,这就意味着发送者并不知道本身发出的数据对端是否收到,但若是它发出的数据包出现错误,则会进行重传。何时会发生错误,发生错误是指什么呢,以太网是如何检测到错误的?大数据

      以太网的错误主要是发生碰撞,碰撞是指两台机器同时监听到网络是空闲的,同时发送数据,就会发生碰撞,碰撞对于以太网来讲是正常的。很是有名的CSMA/CD就是用来检测冲突的。假设A检测到网络是空闲的,开始发数据包,尽力传输,当数据包尚未到达B时,B也监测到网络是空闲的,开始发数据包,这时就会发生碰撞,B发现发生碰撞,开始发送碰撞信号,所谓碰撞信号,就是连续的01010101或者10101010,十六进制就是55或AA。这个碰撞信号会返回到A,若是碰撞信号到达A时,A尚未发完这个数据包,A就知道这个数据包发生了错误,就会重传这个数据包。但若是碰撞信号会返回到A时,数据包已经发完(在数据包比较短的状况下),则A不会重传这个数据包。网站

      以太网为何要设计这样的重传机制。首先,以太网不想采用链接机制,由于会下降效率,但他又想有必定的重传机制,由于以太网的重传是微秒级,而传输层的重传,如TCP的重传达到毫秒级,应用层的重传更达到秒级,咱们能够看到越底层的重传,速度越快,因此对于以太网错误,以太网必须有重传机制。要保证以太网的重传,必须保证A收到碰撞信号的时候,数据包没有传完,要实现这一要求,A和B之间的距离很关键,也就是说信号在A和B之间传输的来回时间必须控制在必定范围以内。IEEE定义了这个标准,一个碰撞域内,最远的两台机器之间的round-trip time 要小于512bit time.(来回时间小于512位时,所谓位时就是传输一个比特须要的时间)。这也是咱们常说的一个碰撞域的直径。512个位时,也就是64字节的传输时间,若是以太网数据包大于或等于64个字节,就能保证碰撞信号到达A的时候,数据包尚未传完spa

512bit time是如何得来的?设计

      先看一下一个比较古老但流行一时的标准:10BASE5,一种以太网标准,该标准用于使用粗同轴电缆、速度为10Mbps的基带局域网络,在总线型网络中,最远传输距离为500米。网络节点装有收发器,该收发器插在网卡上的15针链接单元接口(Attachment Unit Interface)中,并接到电缆上。也做thick Ethernet,ThickNet,ThickWare。另见coaxial cable,Ethernet,指的是使用标准的(粗)50Ω基带同轴电缆的10Mbit/s的基带以太网规范。它是IEEE802.3基带物理层规范的一部分,在每一个网段上的距离限制是500m,整个网络最大跨度为2500m,每一个网段最多终端数量为100台,每一个工做站距离为2.5m的整数倍。上面提到的这个碰撞域的来回时间其实就是当时依据10M网络的标准来定义的,10BASE5容许最远的两个工做站间距离2.5千米 ,电子信号在2.5千米來回时间约为51.2us。根据CSMA/CD,最小封包以51.2us计算和10Mbps计算:51.2us * 10Mbps = 512 bit = 64 byte。这就是为何以太网要最小64个字节的历史缘由了,一个是基于CSMA/CD的须要,另一个就是依据了当时10M网络的标准进行了计算和定义。3d

     以太网帧最大不能超过1518bytes,这也是一个规定,但没有上述的这些限制,之因此规定为1518,主要是考虑到传输效率正确率。因为以太网EthernetII最大的数据帧是1518Bytes,这样,除去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC(FCS)校验部分4Bytes。那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值咱们就把它称之为MTU。这个就是网络层协议很是关心的地方,由于网络层协议好比IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就比如一个盒子无法装下一大块面包,咱们须要把面包切成片,装在多个盒子里面同样的道理。blog

PPPOE环境下的MTU值设定

      为何在PPPOE拨号链接的状况下,将MTU设置大于1492时会出现ping大包不通的状况呢?先要弄清楚,MTU包含了那些东西,值是怎样算出来的?在上述网络环境下,路由器拨号接口下的MTU值设置为1500,主机ping www.qq.com –l 1470测试时抓包查看。此时是不能ping的。命令ping www.qq.com –l 1470中的1470表示的是这个ICMP包的净载荷数据长度为1470字节。结合上图,抓取的ICMP报文中包含:Ethernet Header、IP Header、ICMP - Internet Control Messages Protocol及FCS - Frame Check Sequence等内容。其各项所占字节长度以下表:

项目

内容

长度(字节)

备注

Packet Length

 

1516

数据包总长度

 

Ethernet Header

 

Destination

6

目的MAC及源MAC分别为48Bit,分别占6字节

Source:

6

Protocol Type:

2

IP Header

Header Length:

20

IP报头

ICMP

ICMP Type

8

ICMP报头

ICMP Data Area:

1470

ICMP净载荷长度

FCS

 

4

帧校验序列号

      在这个ping包截图中,MTU值计算时包含了IP报头、ICMP报头及ICMP净荷载长度即20+8+1470=1498。按一般理解1498明显小于拨号接口下的MTU值1500,这时候不须要分片,该ICMP包应该是被正常发送出去的。但为何不能ping通呢?那是在以太网链路上的状况。那么在经过PPPOE拨号上网时,MTU又包含哪些东西呢?所谓PPPoE就是在以太网上面跑PPP协议, PPP协议和Ethernet不都是链路层协议吗?怎么一个链路层跑到另一个链路层上面去了,难道升级成网络层协议了不成。其实这是个误区:就是某层协议只能承载更上一层协议。PPPOE协议栈以下:

IP

PPP

PPPoE

Ethernet

      为何会产生这种奇怪的需求呢?这是由于随着宽带接入(这种宽带接入通常为Cable Modem或者xDSL或者以太网的接入)因为以太网缺少认证计费机制而传统运营商是经过PPP协议来对拨号等接入服务进行认证计费的,因此就出现了PPPoE。

再看PPPOE的数据报文格式:

版本

类型

代码

会话ID

长度

净载荷

      pppoe是经过以太网传输的,其含有PPPOE协议头有6个字节和以太网帧类型2字节。这个8字节的PPPOE封装字段会在数据从拨号接口发送出去时被添加到数据报文中。所以,该数据报文从拨号接口出去时的真实长度是1498+8=1506大于物理以太网接口F0/1的MTU值1500,所以,该数据包将会被丢弃,从而出如今主机上用ping www.qq.com –l 1470不通的状况。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值被丢弃,并且还能够在不须要分片的状况下最大限度的发送数据包,提升传输效率。

MTU分片

      当以个数据包的长度比链路层上的MTU值还要大,那么IP层就须要对这个数据包进行分片处理,并且要求被分片的每一个数据包都要小于这个MTU值。下面仍然经过实验抓包的方式来分析数据包是如何分片的。在PC上执行ping www.qq.com –l 1600,1600为ICMP净载荷数据长度。

跟数据包分片有关的几个字段:

Identifier(标示符):该字段长度为16,一般与标记字段和偏移字段一块儿用于数据包分片。

Fragmentation Flags(分片标记):长度为3,其中第1位没有使用,第2位是不分片(DF),当DF位被设置为1时,表示路由器不能对数据包进行分片处理(对于一些上层TCP应用程序,由于某些缘由,要求不能对该应用的数据包进行分片,这时候就须要将DF为设置为1)。若是数据包由于不能分片而未能被转发,路由器则会丢弃该数据包,并向源点发送错误消息,这一功能能够用工做在网络上测试MTU值。

第3位表示还有更多的分片(MF)位,当路由器对数据包进行分片时,除了最后一个分片的MF位设置为0外,其余全部分段的MF位都设置为1,以便接受者直到收到MF位为0的分段为止。

      数据包被分片后每一个分片的大小是否同样,分片大小是随机仍是有规律可循?数据包在被分片时,是依照最大净载荷字节长度尽力让每一个分片包大小都达到MTU容许的上限值,这样能够提升数据传输的速率。好比,主机A向主机B发送了4个大小为3000的数据包,每个数据包都被分片为3个分片包,第一个分片包大小与第2、三个分片包的大小是怎样的呢?根据PPPOE下最大MTU为1492的规定以及分片标记的工做原理,每一个数据数据包的最大净载荷为1472字节,因此该大小为3000字节的大包会被分片为净载荷分别为1472字节、1472字节及48字节的数据包。所以主机A发往B的4个3000字节的大包被分片的状况是彻底同样的。

Fragment Offset:(分段偏移):字段长度为13位,以8个8位组为单位,用于指明分段起始点相对于报头起始点的偏移量。因为分段到达时可能错序,因此分片偏移字段可使将接收者按照正确的顺序重组数据包。

      综上所述,当主机向目的服务器地址222.73.78.203发送一个长度为1600字节的ping包时,这个ping包被发送到主机网卡(主机网卡MTU值默认为1500),网卡将这个数据包分片成2个包,第一个包总长度为1500(1472+20+8)字节,第二个包总长度为148(128+20)字节。第一个分片包经由交换机转发(交换机接口MTU为1500,且不进行分片处理)给路由器,路由器的内网口F0/0也不作分片处理,这个长度为1500的分片包被转发路由器的虚拟接口时,再次被进行分片处理(由于该虚拟接口的MTU值为1492),被分片的数据包在出虚拟接口时被加上8个字节的PPPOE头,因为被分片后的数据包长度小于外网口F0/1的MTU值1500,所以从物理口F0/1转发出去。被分片的数据包不会在数据链路的另外一端被重组,而是一直保持分片状态,直到到达最终目的地时才会根据分片标记字段中的标记被重组。

TCP-MSS是Maximum Segment Size 最大分段大小的缩写,意为TCP数据包每次可以传输的最大数据分段,是TCP协议里面的一个概念 ,default value is 536。

      MSS值所表示的是TCP报文的净载荷数据大小。经过设置其大小能够达到与设置MTU值同样的效果,都是为了不主机发送的数据包大小超过网络链路MTU值而形成数据包被丢弃的状况。可是在实际状况中,该MSS值在TCP协议中实现的时候每每被MTU所代替。其实现原理是:一些TCP实现只有当目的主机在一个非直接链接网络上才发送MSS选项,pc上网或者别的一些tcp链接,PC会与目的地的IP地址,协商一次mss参数,做为本身发送数据包的参考。mss参数就是告诉对端本端最大支持不分片的数据包大小,只含净荷。

      MSS是TCP数据包每次可以传输的最大净载荷数据分段。TCP MSS 被定义为相关的IP数据报尺寸减去TCP报头(20)和IP报头(20)即为40,而最大IP数据报尺寸的默认值是576,这就致使TCP MSS的默认值是536字节。在以太网链路上容许传输的最大IP数据包长度即MTU为1500,这也就致使MSS的最大值为1500-20-20=1640,而在PPPOE拨号的环境下,还须要减去8个字节的PPPOE封装头,所以PPPOE下的拨号接口的MSS最大值为1500-20-20-8=1452。

     TCP报文中MSS的位置就在选项的位置,选项中内容有不少种,MSS是其中的一种。MSS在TCP报文中是可选项不是必选项,换句话说MSS是可协商的,并且在协商事后该选项内容能够改变也能够没有,在协商MSS时通常是创建TCP链接的两端发送[Syn]标志报文时互相通报而后选取最小MSS做为双方的约定,若是双方都不通报或有一方不通报通常选择MSS的默认值536。在这里不由要问,TCP不是属于应用层的吗,MSS是TCP的属性选项,为何会由IP来处理呢?这是由于一般TCP层不可能有适当地信息来做出这种决定,全部它更愿意把决定因特网路径合适的MTU的工做留给IP层来完成。

      在PC访问网站服务器时,会在TCP链接阶段协商MSS值和其余的一些参数。而后PC使用默认的1460字节MSS向网站服务器发送TCP链接请求。所以,在使用PPPOE方式上网时,PC与网站服务器之间经过协商好的1460字节发送数据包,这个数据包通过封装加上TCP头和IP头后,到达路由器虚拟接口时,路由器会检查其接口的MTU值,发现这个数据包大于其设定好的MTU值1492,就会将该数据包分片成2个数据包进行发送。但网站认为,咱们之间已经协商好了MSS值,就只接受MSS定义好长度的报文,任何大于或小于该MSS长度的报文都是无效,我会将它丢弃,这就会形成有些应用或某些网站没法打开的状况。当在路由器上设置了ip nat mss 1452命令后,当PC按照1460字节的MSS向网站发送TCP链接请求时,路由器接收到该请求,发现1460的设置加上报文头后会超过了最大的1492的限制,就会将该MSS值减8,即为1452,而后将修改后的链接请求发送给须要转发的网站。这样该网站若是赞成路由器转发的该链接请求,TCP链接就能够创建成功。这样之后PC访问该网站时,最大就只会发送1492字节的IP报文。

在文章的概述部分,已经对什么是TCP-MSS,其做用是什么作了描述,如今仍然用实验抓包的方式来对其分析。

      在PC访问www.qq.com网站时,PC与服务器之间会创建TCP协商,PC与服务器之间会相互通报本身本端的MSS值,而后选取最小的MSS值做为双方的约定。这一点经过深刻的分析一下TCP协商时的数据报文就能得出结论,咱们对比如下PC1访问网站的第一个数据报文和网站返回的第一个数据报文的具体状况。

本站公众号
   欢迎关注本站公众号,获取更多信息