[背景知识]
MTU: Maxitum Transmission Unit 最大传输单元
MSS: Maxitum Segment Size 最大分段大小(偶是直译,翻译的很差,不要打
俺PP)
PPPoE: PPP Over Ethernet(在以太网上承载PPP协议)
[分析过程]
先说说这MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,让咱们先仔细回忆一下EthernetII帧的结构DMAC+SMAC+Type+Data+CRC
因为以太网传输电气方面的限制,每一个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧咱们均可以视之为错误的数据帧,通常的以太网转发设备会丢弃这些数据帧。
(注:小于64Bytes的数据帧通常是因为以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于1518Bytes的数据帧咱们通常把它叫作Giant帧,这种通常是因为线路干扰或者坏的以太网口产生)
因为以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes(这个部门有时候你们也把它叫作FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值咱们就把它称之为MTU。这个就是网络层协议很是关心的地方,由于网络层协议好比IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就比如一个盒子无法装下一大块面包,咱们须要把面包切成片,装在多个盒子里面同样的道理。
当两台远程PC互联的时候,它们的数据须要穿过不少的路由器和各类各样的网络媒介才能到达对端,网络中不一样媒介的MTU各不相同,就比如一长段的水管,由不一样粗细的水管组成(MTU不一样 )经过这段水管最大水量就要由中间最细的水管决定。
对于网络层的上层协议而言(咱们以TCP/IP协议族为例)它们对水管粗细不在乎它们认为这个是网络层的事情。网络层IP协议会检查每一个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否做“分片”处理。分片最大的坏处就是
下降了传输性能,原本一次能够搞定的事情,分红屡次搞定,因此在网络层更高一层(就是传输层)的实现中每每会对此加以注意!有些高层由于某些缘由就会要求我这个面包不能切片,我要完整地面包,因此会在IP数据包包头里面加上一
个标签:DF(Donot Fragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,若是遇到MTU小于IP数据包的状况,转发设备就会根据要求丢弃这个数据包。而后返回一个错误信息给发送者。这样每每会形成某些通信上的问题,不过幸运的是大部分网络链路都是MTU1500或者大于1500。
对于UDP协议而言,这个协议自己是无链接的协议,对数据包的到达顺序以及是否正确到达不甚关心,因此通常UDP应用对分片没有特殊要求。
对于TCP协议而言就不同了,这个协议是面向链接的协议,对于TCP协议而言它很是在乎数据包的到达顺序以及是否传输中有错误发生。因此有些TCP应用对分片有要求---不能分片(DF)。
花开两朵,各表一枝,说完MTU的故事咱们该讲讲今天的第二个猪脚---PPPoE所谓PPPoE就是在以太网上面跑PPP协议,有人奇怪了,PPP协议和Ethernet不都是链路层协议吗?怎么一个链路层跑到另一个链路层上面去了,难道升级成网络层协议了不成。其实这是个误区:就是某层协议只能承载更上一层协议。
为何会产生这种奇怪的需求呢?这是由于随着宽带接入(这种宽带接入通常为Cable Modem或者xDSL或者以太网的接入)因为以太网缺少认证计费机制而传统运营商是经过PPP协议来对拨号等接入服务进行认证计费的,因此就出了这么一个怪胎:PPPoE。(有关PPPoE的详细介绍参见V大以及本站其余成员的一些介绍文章,我就不啰里啰唆的了)
PPPoE带来了好处,也带来了一些坏处,好比:二次封装耗费资源,下降了传输效能等等,这些坏处俺也很少说了,最大的坏处就是PPPoE致使MTU变小了以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492。
若是两台主机之间的某段网络使用了PPPoE那么就会致使某些不能分片的应用没法通信。
这个时候就须要咱们调整一下主机的MTU,经过下降主机的MTU,这样咱们就可以顺利地进行通信了。
固然对于TCP应用而言还有另外的解决方案。
立刻请出今天第三位猪脚:MSS。
MSS最大传输大小的缩写,是TCP协议里面的一个概念。
MSS就是TCP数据包每次可以传输的最大数据分段。为了达到最佳的传输效能TCP协议在创建链接的时候一般要协商双方的MSS值,这个值TCP协议在实现的时候每每用MTU值代替(须要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)因此每每MSS为1460。通信双方会根据双方提供的MSS值得最小值肯定为此次链接的最大MSS值。
介绍完这三位猪脚s
咱们回过头来看前言里面的那个问题,咱们试想一下,若是咱们在中间路由器上把每次TCP链接的最大MSS进行调整这样使得经过PPPoE链路的最大MSS值加上数据包头包尾不会超过PPPoE的MTU大小1492这样就不会形成没法通信的问题.因此上面的问题能够经过ip tcp adjust-mss 1452来解决。
固然问题也能够经过修改PC机的MTU来解决。网络