为什么以太网无法接收大于1500字节的数据包

均衡信道利用率和信道状况的折中方法,帧长太小信道利用低,帧长太大,出错重传效率又会降低,折中以后取了个综合最优值1500

简言之:

1、数据包越大,越容易出错。

2、出错了就要重发,大的数据包重发花费的时间多,从而导致网速下降。

3:则是时延的问题,校验是对整个frame(包)做的,只有收到整个数据包才能做校验,确认收到的bit都正确。如果frame太大,等一个完整的frame时间长,包就不能及时交给上层

4:所有用户共享一个公共节点的资源,每个用户的每个资源切片一定要有所限制,不然其他人就只能干等着。这个切片规定多大要考虑效率问题 。

5:最初以太网是在共享介质上面而且是半双工的所有机器共享10Mbps的带宽,如果发送的帧太长,就会占用太久的网络,不仅会影响其他机器的通信,而且会让更多的机器等待到这一帧发送结束之后一齐发送,造成更多的冲突。现在其实已经没有这个限制了,许多交换机都支持更大的MTU,不过单纯提高MTU也不能提高性能。


6:就是交换机的成本和造价。单个数据块越大,交换机就需要越大的缓存。为什么这么说呢?交换机的设计,并不是像应用程序一样,数据包多大就申请多大的缓存。他一般是硬件加速的方法,为每个数据块分配固定长度的缓存。不论你发送的数据块多大,100或1500,交换机都按1500去为每个数据包分配相同大小的缓存。这样的实现有3个好处:一个是快,相同的操作执行速度高;二是内存无碎片,不规则的内存申请释放,最后会留下很多内存碎片,不需要复杂的内存管理;三是防止错误和攻击。如果根据数据内容的“长度”去申请内存,如果长度域出错怎么办,如果有人故意把长度域设置非常大攻击怎么办,如果有人故意把长度域设置小但是数据块却故意设置大怎么办
 

以太网帧长度上下限

标准以太网帧长度下限为:64 字节

标准以太网帧长度上限为:1518 字节

最早的以太网工作方式:载波多路复用/冲突检测CSMA/CD,因为网络是共享的,即任何一个节点发送数据之前,先要侦听线路上是否有数据在传输,如果有,需要等待,如果线路可用,才可以发送。

假设A发出第一个bit位,到达B,而B也正在传输第一个bit位,于是产生冲突,冲突信号得让A在完成最后一个bit位之前到达A,这个一来一回的时间间隙slot time是57.6μs.


在10Mbps的网络中,在57.6μs的时间内,能够传输576个bit,所以要求以太网帧最小长度为576个bits,从而让最极端的碰撞都能够被检测到。这个576bit换算一下就是72个字节,去掉8个字节的前导符和帧开始符,以太网帧的最小长度为64字节。

 

如果说以太网帧的最小长度64byte是由CSMA/CD限制所致,那最大长度1500byte又是处于什么考虑的呢?

IP头total length为两个byte,理论上IP packet可以有65535 byte,加上Ethernet Frame头和尾,可以有65535 +14 + 4 = 65553 byte。如果在10Mbps以太网上,将会占用共享链路长达50ms,这将严重影响其它主机的通信,特别是对延迟敏感的应用是无法接受的。

由于线路质量差而引起的丢包,发生在大包的概率也比小包概率大得多,所以大包在丢包率较高的线路上不是一个好的选择。

但是如果选择一个比较小的长度,传输效率又不高,拿TCP应用来说,如果选择以太网长度为218byte,TCP payload = 218 - Ethernet Header -IP Header - TCP Header=218-18 - 20 -20= 160 byte

那有效传输效率=160/218= 73%

而如果以太网长度为1518,那有效传输效率=1460/1518=96%

通过比较,选择较大的帧长度,有效传输效率更高,而更大的帧长度同时也会造成上述的问题,于是最终选择一个折衷的长度:1518 byte ! 对应的IP packet 就是 1500 byte,这就是最大传输单元MTU的由来。

Jumbo Frame

最早的以太网是通过Hub或集线器来工作的,在任意时刻只能有一台主机发送,这种共享方式发送效率很低,而现代高速交换机则让每个连接交换机的主机工作在独占模式,带宽独享,可以同时收发,而且现在早已不是早期的10Mbps的带宽,而是1000M、10000M,即使发送大包也不会影响别的主机,影响的只是交换机的接收和发送队列,既然发送大包效率要比小包效率搞,而且特定的应用也有发大包的需求,比如NFS文件系统,那为什么不把接口MTU提高一些,再高一些呢?这是一个好主意,于是网卡、交换机、路由器网络接口可以实现更大的MTU,可以达到>9000字节的大小,我们称这种远大于标准以太帧尺寸的帧为巨型帧Jumbo Frame 。

于是网络接口提供可以修改MTU的配置命令,比如缺省为1500,可以修改为1508以支持QinQ,或者1512以支持802.1q Mpls label,这样既可以支持终端用户标准1500 字节IP packet,又可以避免分片。

有一点需要说明,二层交换机的接口,我们可以看成一块普通的网卡,网卡工作在数据链路层,所以分片不是它的职责,如果一个帧需要从交换机一个接口发送出去,而帧的长度>接口MTU,怎么办?丢弃!会发什么消息告诉源主机吧?不会的,默默地丢,当什么否没有发生,这种情况最难以排查,如果traceroute可以看到端对端使通的,而发送数据就是会失败。所以切记,一台交换机要保证接口MTU的一致性。如果在一个VLAN上、或整个交换机都采用同样的MTU,就不会发生上述情况。而如果入接口是9000字节,而出接口是1500,就会发生上述问题。

如果一条物理链路的两端MTU不一致,则会发生什么情况,比如一侧是1500,一侧是9000,1500一侧发出来的数据肯定没有问题,但是如果从9000侧发给1500呢?数据也背默默地丢了。为什么呢?我们来谈另外一个很少提及的词汇:MRU,最大接收单元。

最大接收单元MRU

我们一直谈的最大传输单元MTU是关于出方向的流量处理,而MRU恰恰相反,是关于入方向的流量处理。

一般情况下MTU = MRU,比如9000侧的数据到达1500,由于9000>MRU ,所以直接默默丢弃。

所以在配置链路时,要确保两侧的设备MTU要匹配,无论各家厂商对MTU理解如何、实现如何,一定要保证两端匹配,即各自允许在以太网线上发送、接收的数据流,即以太网帧的最大长度一样

因为最初以太网是在共享介质上面而且是半双工的所有机器共享10Mbps的带宽,如果发送的帧太长,就会占用太久的网络,不仅会影响其他机器的通信,而且会让更多的机器等待到这一帧发送结束之后一齐发送,造成更多的冲突。现在其实已经没有这个限制了,许多交换机都支持更大的MTU,不过单纯提高MTU也不能提高性能。

  还有一个出错重传的问题。对于物理层容易出错的网络,资源片要尽量小,出错了一个比特,重传的整个数据块不需要太大。对于物理层不容易出错的网络,资源片可以大一些,这样错一个bit重传整个数据块很大,但是人家不容易出错,不容易发生重传啊。

第三个考虑,则是时延的问题。以太协议格式中,校验是对整个frame(包)做的,只有收到整个数据包才能做校验,确认收到的bit都正确。如果frame太大,等一个完整的frame时间长,包就不能及时交给上层。举个例子,比如你正在看视频,视频打包了一个大包发出去,每个节点都要缓存-校验-转发,造成的结果就是视频卡顿。当然,我这里说的视频是直接承载在以太上的,这是一个比方,并不是说应用层很烂的设计啊。这里都是为了说明时延的作用

 
另外一个“小”问题,就是交换机的成本和造价。单个数据块越大,交换机就需要越大的缓存。为什么这么说呢?交换机的设计,并不是像应用程序一样,数据包多大就申请多大的缓存。他一般是硬件加速的方法,为每个数据块分配固定长度的缓存。不论你发送的数据块多大,100或1500,交换机都按1500去为每个数据包分配相同大小的缓存。这样的实现有3个好处:一个是快,相同的操作执行速度高;二是内存无碎片,不规则的内存申请释放,最后会留下很多内存碎片,不需要复杂的内存管理;三是防止错误和攻击。如果根据数据内容的“长度”去申请内存,如果长度域出错怎么办,如果有人故意把长度域设置非常大攻击怎么办,如果有人故意把长度域设置小但是数据块却故意设置大怎么办
 



  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值