[
背景知识
] 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" />
|
|
|
转载于:https://blog.51cto.com/luoyuehansong/68086