MTU 巨帧 TCP/UDP与分片

常常见到交换机和网卡说明中提到支持Jumbo Frame,但我一直对以太网的Jumbo Frame(巨帧)如何使用不太理解,今日在网上找到2则现摘录下来,相信看了以后大家会有收获。 ---- 这是一种厂商标准的超长帧格式,专门为千兆以太网而设计,目前还没有获得IEEE标准委员会的认可。以太网标准的最大帧长度为1518字节,而Jumbo Frame的长度各厂商有所不同,从9000字节~64000字节不等。采用Jumbo Frame能够令千兆以太网性能充分发挥,使数据传输效率提高50%~100%。在网络存储的应用环境中,Jumbo Frame更具有非同寻常的意义。
----Jumbo Frame需要在相互通讯的2个通讯端口(交换机端口或网卡端口)上同时支持,而且与以前的以太网产品不兼容,因此主要会应用于千兆主干的端口之间以及服务器端口接入到网络主干的链路。交换机把Jumbo Frame格式的数据转发向不兼容Jumbo Frame的端口时应进行帧格式的转换,即把Jumbo Frame帧格式的数据转换成标准以太网的帧格式,从而保证其正常工作。相反,从不兼容Jumbo Frame的端口向支持Jumbo Frame的端口转发数据时,交换机可以把多个标准以太网帧合并成超长Jumbo Frame帧,从而提高传输效率。   ---- 由于Jumbo Frame没有成为国际标准,目前只有部分厂商支持这种帧格式。不过随着以太网向千兆、万兆的发展,必然要诞生1种超长帧格式,因而Jumbo Frame从厂商标准转变为国际标准的可能性非常大。
---- 巨型帧 ( Jumbo Frame )面临的问题 (转载自安恒) 
 
     通常人们都认为Jumbo Frame(巨型帧)是一个相对简单的技术,应该被广泛的应用在局域网中,但是情况并非如此。
     应该说Jumbo 帧在一些领域里是非常有用的,它是有意设计为加速大文件传输服务的。以太网标准定义的最大帧长度为1518字节,这样一个大的文件就需要被切碎成为若干块,放到多个以太网帧中。而每个数据块传输的时候都会引入帧头和尾的开销。倘若能够用一个大的帧完成文件的传输,则会减少很多帧的开销,提高网络的利用率和传输速率。通常人们认为,这一技术最大的应用瓶颈是在于至今没有标准化。
     但是,有些人不这么看,许多人提出了超长帧的以下缺点:它们可能会成为融合网络的障碍。如果人们在网络上传送语音或其他对延迟敏感的内容,不需要有妨碍这些对延迟敏感数据的超长帧传输。有人举例说,超长帧会造成延迟,一旦一个‘大家伙’在线路上传送,它会较长时间占用线路,阻止其他人使用线路,从而造成延迟。
     另一位读者提到超长帧可以在一条与其他网络隔离的网络中使用,因此它们不会妨碍其他传输流。存储区域网也许就是这样的一个例子。

     但是首先,使用超长帧可能不再是一种优势。来自大学的两位用户说,为了了解超长帧是否能实际提高性能,他们测试了超长帧。一位用户谈道:“经过全面的测试后,我们得到的结论是:在使用现代的PC和千兆网卡时,性能提高得很少。超长帧在过去年代里的主要优势是减小高中断率对计算机的影响。但是,3-GHz CPU具有处理千兆流量的充足能力,网卡和驱动程序不再需要每一个数据包都中断一次。我们认为超长帧理论上看是一个不错的想法,但是在实际中它在千兆位时用处不大。10G以太网可能是另一个问题。


MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。

由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMACMAC地址48bit=6Bytes+Type2bytes14Bytes和帧尾CRC校验部分4Bytes那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU

PPPoE所谓PPPoE就是在以太网上面跑PPP协议,有人奇怪了,PPP协议和Ethernet不都是链路层协议吗?怎么一个链路层跑到另外一个链路层上面去了,难道升级成网络层协议了不成。其实这是个误区:就是某层协议只能承载更上一层协议。

为什么会产生这种奇怪的需求呢?这是因为随着宽带接入(这种宽带接入一般为Cable Modem或者xDSL或者以太网的接入),因为以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的.

PPPoE带来了好处,也带来了一些坏处,比如:二次封装耗费资源,降低了传输效能等等,这些坏处俺也不多说了,最大的坏处就是PPPoE导致MTU变小了以太网的MTU1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492

UDP 包的大小就应该是 1492 - IP(20) - UDP(8) = 1464(BYTES)
TCP 包的大小就应该是 1492 - IP(20) - TCP(20) = 1452(BYTES)

目前大多数的路由设备的MTU都为1500
我对上面的理解是:如果我们定义的TCP和UDP包小于1452,1464,那么我们的包在IP层就不用分包了,这样传输过程中就避免了在IP层组包发生的错误。如果使用UDP协议,如果IP层组包发生错误,那么包就会被丢弃,UDP不保证可靠传输。但是TCP发生组包错误时,该包会被重传,保证可靠传输。所以,我们在用Socket编程时,包的大小设定不一定非要小于1400,UDP协议要求包小于64K,TCP没有限定。


总结:

我们设定包的大小对于UDP和TCP协议是不同的,关键是看系统性能和网络性能,网络是状态很好的局域网,那么UDP包分大点,提高系统的性能。不好,就分小于1464,这样可以减低丢包率。对于TCP来说,这个就要靠经验了,因为,TCP丢包可以自动重传,分大了,系统性能提高了,分包和错误重组可能会耗费时间,使传送时间延长,分小了,系统性能又降低了。

由于以太网EthernetII最大的数据帧是1518Bytes,除去以太网帧的帧头(DMAC目的MAC地址 48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes (这个部份有时候大家也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes,这个值我们就把它称之为MTU。

这个MTU就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 )通过这段水管最大水量就要由中间最细的水管决定。

3. IP MTU

对于网络层的上层协议而言(我们以TCP/IP协议族为例),网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!有些高层因为某些原因就会要求我这个面包不能切片,我要完整地面包,所以会在IP数据包包头里面加上一个标签:DF(Donot Fragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包,然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路MTU都是等于1500或者大于1500。

对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求---不能分片(DF)。

4. MSS

MSS是最大传输大小的缩写,它是TCP协议里面的一个概念。如下图1-1所示:

图1-1 TCP头部

注:URG等参数指的是 ACK URG PSH SIN FIN RST等参数

在TCP报文中 MSS的位置就在选项的位置,根据RFC1323和RFC793规定,选项中内容有很多种,MSS是其中的一种,用kind=2表示;kind=1表示无操作,kind=4、5、6、7称为选择ACK及回显选项,但是由于回显选项已经被时间戳选项取代,同时,目前定义的选择ACK选项仍未定论,也没有包括在RFC1323中,所以具体代表什么含义还无定论。在实际网络数据传输,要求MSS+20TCP包头 +20 IP包头不大于MTU。MSS在TCP报文中是可选项,不是必选项,换句话说,MSS是可协商项,而且在协商过后,该选项内容可以改变,也可以没有;在协商MSS时,一般是建立TCP连结的两端发送Syn标志报文时互相通报,然后选取最小MSS作为双方的约定,如果双方都不通报或有一方不通报。

MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes),所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

5. 区别及联系

由前面的叙述可知:MTU是一个二层的概念,以太网最大的mtu就是1500(它是不包含二层头部的,加上头部应该为1518 bytes),当然这里说的是很常规的情况,也有些server,比如server 2008,出来的就是jumbo frame了,我们在这里讨论常规情况。IP MTU是一个三层概念,它包含了三层头部及所有载荷,根据下层为上层服务的,上层基于下层才能做进一步的扩展的原则,尽管IP MTU的变化范围很大(68-65535),但也不得不照顾以太网MTU的限制,说白了就是ip对以太网的妥协。MSS是TCP里面的一个概念,它是TCP数据包每次能够传输的最大数据分段,不包含包头部分,它与IP MTU满足如下关系:IP MTU=MSS+20bytes(IP包头)+20bytes(TCP包头)。当然,如果传输的时候还承载有其他协议,还要加些包头在前面,简言之,mtu就是总的最后发出去的报文大小,MSS就是需要发出去的数据大小,比如PPPoE,就是在以太网上承载PPP协议(点到点连接协议),它包括6bytes的PPPoE头部和2bytes的PPP协议ID号,此时,由于以太网的MTU值为1500,所以上层PPP负载数据不能超过1492字节,也就是相当于在PPPOE环境下的MTU是1492字节,MSS是1452字节。

6. MTU问题解决方法

通常情况下,MTU不匹配会表现为两种故障情况:

ping大包时不通无法访问某些站点

在这种情况下,通常有两种解决方法:

修改用户端MTU值(不推荐使用)修改传输路由所有设备MTU值,确保路径MTU值大于用户发送的IP报文的长度,以保证用户报文不会因为超过设备的MTU值被丢弃。主要要考虑下面几种情况:

· 对于纯IP网络,要保证:路径MTU值>最大用户报文长度

· 对于纯MPLS网络(没有VPN业务),要保证路径MTU值>最大用户报文+一层标签长度(4)

· 对于三层VPN业务,要保证:路径MTU值>最大用户报文+两层标签长度(8);

· 对于二层VPN业务,要保证:路由MTU值>最大用户报文长度+两处标签长度(8)+二层帧头长度(18)。

值得注意的是:fastethernet接口不能调整MTU,所以说在有些设备中,使用MTU命令不能解决问题的。此外,更改MTU后,如果IGP是OSPF的话,不同的MTU可能会造成OSPF 停留在INIT状态,此时需要将两端的MTU调整一致。





你可能感兴趣的:(网络知识)