2024年1月15日发(作者:)
实验说明MTU到底是什么
1 说明
初学者一般都对MTU的概念有些迷糊,这里通过实验给大家理一理。
MTU中文名是最大传输单元,指一个单元数据的最大长度,单位是字节。看上去好像很好理解,其实它却暗藏玄机。
先跟大家简单地说明一下,第二层和第三层都是有MTU的概念的,另外第四层的TCP协议也有个类似的名词,叫MSS,即最大分段尺寸(第四层的PDU叫数据段,由于实验不好模拟TCP数据,今天我们就先不讨论它)。我们通过实验来看看它们到底有什么不同。
2 实验拓扑
这是实验拓扑,非常简单:
3 实验一:二层MTU
本实验通过以太网进行,其它协议道理一样,只是帧头大小、默认MTU值不同而已。
查看接口的二层MTU,可以看到以太网的默认MTU是1500字节(地球人都知道)。
从R1上向R2发起PING测试,将报文设置为超过1500字节,如1600,发现还可以通。在R1的F0/0口上抓包发现超过1500字节的包都被分片了。
上图的“More Fragment”标志设为了1,证明包被分片了。
如果我们在PING的时候将DF位设置为1,即不允许这个包被分片,结果无法PING通了,而且R1的F0/0口也无法抓到包,证明这些包根本没有被R1发出来,因为R1的二层MTU是默认的1500字节,超过了就得分片,而我们在IP头里设置了DF位不允许这个IP包被分片,所以以太网只能把它丢掉了。
我们修改一下二层MTU值,把R2的改成1000,让两边的MTU
值不对称,再在R1上用超过1000字节的报文向R2发起PING,发现不能通。
在R1的F0/0上抓到了ICMP包,证明包已经被R1发出。上图的MF位没有被设置,证明包没有被分片,我们还可以在Total Length字段看到该报文的总长度为1200字节。
反过来我们从R2向R1发起1200字节的PING,这时发现也不通。抓包发现R2的echo request包已经到R1了,并被分片,而且R1也有回包。可是R1回包给R2时没有分片,返回的包太大,R2没能力接收,所以丢了。
如果我们用小于1000字节的包来PING,两边都是可以通的,并且不会被分片。
结论:接收方要求发送方的所发送的单位数据尺寸等于或小于自己接口的二层MTU值,否则将丢弃数据。货车的尺寸如果大于车站的入口,那么货车也是无法进站的。
4 实验二:三层MTU
我们用三层的代表性协议IP来进行实验。(废话)
先把接口恢复成原来的值。
先问个问题,请问IP的MTU默认是多少?1500字节?对不对我先不回答,我们先来看一下吧。
注意下面的命令和上面的命令是不同的,int前面多了个ip。
这不就是1500字节吗?先别着急,我们来把接口的二层MTU改一下看看,注意,是改二层MTU。
我们发现,在更改了二层MTU后,IP的MTU也跟着变了。这说
明IP的MTU默认情况下是直接继承的二层MTU值。我们现在把IP
MTU修改成1200字节,把二层MTU还原成1500字节。
这时我们发现两个MTU值不一样了。
我们一做一下测试,在R1向R2发起超过1200但小于1500字节的PING,再抓包看看:
我们发现完全可以PING通,而且据包被分片了。这说明IP包只要超过了IP MTU给定的值,就会被分片。而且从返回的数据来看,由于R2返回的包是1300字节,而且R2的IP MTU是1500,所以返回的包并不会被分片,但是R1的接口(IP MTU为1200字节,小于1300)也能正常接收。这说明IP MTU不影响接收数据。
如果在PING时打上DF位,那么包就发不出了,Wireshark也无法抓到包,因为数据不允许分片,而IP MTU只有1200字节,无法装
载1300的数据,所以只能丢包。
如果IP MTU大于二层MTU,比如二层MTU为1200, IP MTU为1500,然后再试图从R1向R2用大于1200字节但小于或等于1500字节的PING来测试,比如1300,那么即使不加上DF位,也是不能通的。因为数据包认为自己只有1300字节,没有超出IP MTU的值1500,所以不用分片。可是由于不分片导致单个数据包大于二层MTU,二层无法封帧,所以在二层丢包。当然这只是理论,因为思科不允许在接口上把IP MTU的值设置为大于二层MTU的值。
结论:IP MTU的作用是供IP报文参考是否需要被分片。IP MTU两边不一致一般不影响通信,但有一些特殊应用需要IP MTU一致,比如OSPF在exstart状态时进行主从选举,这时会对比IP MTU,这超出了本文的内容。
5 总结
二层MTU是指接口帧的容量,也就是说接口只能接收或者发送这么大的数据;而三层MTU(比如IP MTU)则是供三层数据向下封装时是否分片的一个参考值。
发布评论