昨天的文章中提到了MTU,最大传输单元,今天我们也来了解一下。
首先看一下什么是MTU?
MTU 译为最大传输单元,表示的是某种类型的链路传输数据报文时,允许通过的最大数据包的长度,单位是Byte,这个通常和物理链路类型有关,比如最常见的Ethernet链路,MTU是1500Byte。注意,这里的1500指的是IP部分的长度,没有包含报文的二层头的长度。
为什么需要设置MTU呢?
我们知道MTU越大,则单个报文可以承载的数据内容越多,一次传输的数据越多,传输相同的内容,需要的数据报文个数越少,通信效率也就越高。既然如此,那我们就直接用尽量大的报文传输不是很好吗?为啥还要设置MTU限制报文大小呢。其实这里就是一个权衡取舍的问题。因为当MTU设置越大的时候,也会导致报文在网络中传输的时间越长,这称为延时,报文越大的时候,延时就会越大。延时也是衡量网络质量好坏的一个非常非常重要的指标,因为有很多数据(比如音频和视频,尤其是视频)对延时是非常敏感的。另外,报文变大之后,一次承载的内容变多,传输过程中发生传输错误的概率也会随之变大,这样一旦传输出错,可能会导致数据错误,或者报文重传等一系列后果,反而会适得其反。当然,也可能还有其他一些原因。
如果报文大小超过MTU怎么办?
如果报文的大小超过了链路的MTU,昨天我们讲到过,有两种选择:丢弃或者分片传输。对于如何分片,这个我们举个简单的例子来看一下。假定现在有一个比较大的报文,长度是3500(含IP头)Byte,发送到一个MTU是1500的网络,需要进行分片,我们看一下分片是如何发生的:
由于每个分片都需要额外增加一个ip头,而MTU是1500,所以实际可以分给每个分片的数据最大长度是1500-20=1480Byte
考虑到传输效率和延迟的平衡,分片通常采用尽量大的方式来进行,简单说就是按照最大长度来分片。
这样我们看一下:3500=1480+1480+540,所以这个报文可以被分为3片,长度分别是1500 1500 560字节,这样一个报文被分解为3个,就可以正常被传输了。
路径MTU发现?
虽然IP实现了分片传输的机制,当报文超过MTU之后,可以通过分片来传输。但是分片其实会带来很多其他问题,最直观的,每个分片额外要增加20Byte的报文头,这会额外占据传输带宽;更为严重的是,对于报文的分片以及重新组装的过程,会消耗大量的CPU资源,这会给系统带来沉重的负担,所以分片是我们不愿意看到的。
但是网络中有很多设备,报文的传输路径上,不同链路的MTU可能是不同的,如何能够正常传输又能避免分片呢?其实我们只要能够找到传输路径上最小的MTU,在发送端按照这个最小MTU来封装报文,这个问题就解决了。那么,如何找到这个最小MTU呢?这里提供了一种机制,叫做路径MTU发现。
路径MTU发现的基本原理,就是使用了IP报文头中DF字段以及ICMP协议来实现(不知道DF和ICMP的同学可以参考上两篇文章,有详细解释)。简单原理如下,假定路径上最小的mtu是500,发送端发送探测报文,DF设置为1,不允许分片,报文长度逐渐增加,当报文长度达到501时,由于超过了链路的mtu,报文会被丢弃,并返回icmp通告报文,这样发送端就知道最大可以传输的报文长度是500,发送报文的时候按照这个长度来发送,就不会被分片了,这个就是路径MTU发现机制。
常见的MTU有哪些?
Ethernet:1500字节 PPPoE:1492字节 P2P:4470字节
本文暂时没有评论,来添加一个吧(●'◡'●)