[ 背景知识 ]
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 来解决。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />