什么是MTU

Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元

这是哪一层网络的概念?

从下面这个表格中可以看到,在7层网络协议中,MTU是数据链路层的概念。MTU限制的是数据链路层的payload,也就是上层协议的大小,例如IP,ICMP等。

OSI中的层 功能 TCP/IP协议族
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层 数据格式化,代码转换,数据加密 没有协议
会话层 解除或建立与别的接点的联系 没有协议
传输层 提供端对端的接口 TCP,UDP
网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2

MTU有什么用?

举一个最简单的场景,你在家用自己的笔记本上网,用的是路由器,路由器连接电信网络,然后访问了www.baidu.com,从你的笔记本出发的一个以太网数据帧总共经过了以下路径:

笔记本 -> 路由器 -> 电信机房 -> 服务器

其中,每个节点都有一个MTU值,如下:

1500     1500                 1500
笔记本 -> 路由器 -> 电信机房  -> 服务器

假设现在我把笔记本的MTU最大值设置成了1700,然后发送了一个超大的ip数据包(2000),这时候在以外网传输的时候会被拆成2个包,一个1700,一个300,然后加上头信息进行传输。

1700     1500                1500
笔记本 -> 路由器 -> 电信机房 -> 服务器

路由器接收到了一个1700的帧,发现大于自己设置的最大值:1500,如果IP包DF标志位为1,也就是不允许分包,那么路由器直接就把这个包丢弃了,根本就不会到达电信机房,也就到不了服务器了,所以,到这里我们就会发现,MTU其实就是在每一个节点的管控值,只要是大于这个值的数据帧,要么选择分片,要么直接丢弃。

为什么是1500?

其实一个标准的以太网数据帧大小是:1518,头信息有14字节,尾部校验和FCS占了4字节,所以真正留给上层协议传输数据的大小就是:1518 - 14 - 4 = 1500,那么,1518这个值又是从哪里来的呢?

假设取一个更大的值

假设MTU值和IP数据包大小一致,一个IP数据包的大小是:65535,那么加上以太网帧头和为,一个以太网帧的大小就是:65535 + 14 + 4 = 65553,看起来似乎很完美,发送方也不需要拆包,接收方也不需要重组。

那么假设我们现在的带宽是:100Mbps,因为以太网帧是传输中的最小可识别单元,再往下就是0101所对应的光信号了,所以我们的一条带宽同时只能发送一个以太网帧。如果同时发送多个,那么对端就无法重组成一个以太网帧了,在100Mbps的带宽中(假设中间没有损耗),我们计算一下发送这一帧需要的时间:

( 65553 * 8 ) / ( 100 * 1024 * 1024 ) ≈ 0.005(s)

在100M网络下传输一帧就需要5ms,也就是说这5ms其他进程发送不了任何数据。如果是早先的电话拨号,网速只有2M的情况下:

( 65553 * 8 ) / ( 2 * 1024 * 1024 ) ≈ 0.100(s)

100ms,这简直是噩梦。其实这就像红绿灯,时间要设置合理,交替通行,不然同一个方向如果一直是绿灯,那么另一个方向就要堵成翔了。

既然大了不行,那设置小一点可以么?

假设MTU值设置为100,那么单个帧传输的时间,在2Mbps带宽下需要:

( 100 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 ≈ 5(ms)

时间上已经能接受了,问题在于,不管MTU设置为多少,以太网头帧尾大小是固定的,都是14 + 4,所以在MTU为100的时候,一个以太网帧的传输效率为:

( 100 - 14 - 4 ) / 100 = 82%

写成公式就是:( T - 14 - 4 ) / T,当T趋于无穷大的时候,效率接近100%,也就是MTU的值越大,传输效率最高,但是基于上一点传输时间的问题,来个折中的选择吧,既然头加尾是18,那就凑个整来个1500,总大小就是1518,传输效率:

1500 / 1518 =  98.8%

100Mbps传输时间:

( 1518 * 8 ) / ( 100 * 1024 * 1024 ) * 1000 = 0.11(ms)

2Mbps传输时间:

( 1518 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 = 5.79(ms)

总体上时间都还能接受

为什么是64呢?

这个其实和以太网帧在半双工下的碰撞有关,感兴趣的同学可以自行去搜索。


在我玩游戏的时候,为什么把MTU改成1480就不卡了?

路由器默认值大多都是1500,理论上是没有问题的,那为什么我玩游戏的时候改成1480才能流畅呢?原因在于当时我使用的是ADSL上网的方式,ADSL使用的PPPoE协议。

PPPoE

PPPoE协议介于以太网和IP之间,协议分为两部分,PPP( Point to Point Protocol )和oE( over Ethernet ),也就是以太网上的PPP协议,而PPPoE协议头信息为:

| VER(4bit) | TYPE(4bit) | CODE(8bit) | SESSION-ID(16bit) | LENGTH(16bit) |

这里总共是48位,也就是6个字节,那么另外2个字节是什么呢?答案是PPP协议的ID号,占用两个字节,所以在PPPoE环境下,最佳MTU值应该是:1500 - 4 - 2 = 1492。

我的上网方式

当时我的上网路径如下:

PC -> 路由器 -> 电信

我在路由器进行拨号,然后PC连接路由器进行上网。

最根本原因

问题就出在路由器拨号,如果是PC拨号,那么PC会进行PPPoE的封装,会按照MTU:1492来进行以太网帧的封装,即使通过路由器,路由器这时候也只是转发而已,不会进行拆包。

而当用路由器拨号时,PC并不知道路由器的通信方式,会以网卡的设置,默认1500的MTU来进行以太网帧的封装,到达路由器时,由于路由器需要进行PPPoE协议的封装,加上8字节的头信息,这样一来,就必须进行拆包,路由器把这一帧的内容拆成两帧发送,一帧是1492,一帧是8,然后分别加上PPPoE的头进行发送。

平时玩游戏不卡,是因为数据量路由器还处理得过来,而当进行群怪AOE的时候,由于短时间数据量过大,路由器处理不过来,就会发生丢包卡顿的情况,也就掉线了。

帖子里面提到的1480,猜测可能是尽量设小一点,避免二次拨号带来的又一次PPPoE的封装,因为时间久远,没办法回到当时的场景再去抓包了。

结论

1518这个值是考虑到传输效率以及传输时间而折中选择的一个值,并且由于目前网络链路中的节点太多,其中某个节点的MTU值如果和别的节点不一样,就很容易带来拆包重组的问题,甚至会导致无法发送。

什么是MTU?为什么MTU值普遍都是1500?相关推荐

  1. donotage标记、MTU及MTU不匹配问题、OSPF邻居状态记录

    目录 一. donotage标记 二.MTU详解 (1)-- MTU简介 (2)--图解 (3)--!!!邻居关系起不来原因: (4)-- 解决: 三.两种特殊的邻居关系: 四.OSPF邻居状态的记录 ...

  2. 12、MTU的概念,什么是路径MTU? MTU发现机制,TraceRoute(了解)

    1.MTU的概念 MTU即Maximum Transmission Unit 最大传输单元.它是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位). 2.路径MTU 路径MTU是指一条 ...

  3. MTU的概念,什么是路径MTU? MTU发现机制,TraceRoute(了解)

    1.MTU的概念 MTU即Maximum Transmission Unit 最大传输单元.它是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位). 2.路径MTU      路径MT ...

  4. [html] link标签的属性media有哪些值?都有什么作用?

    [html] link标签的属性media有哪些值?都有什么作用? 根据w3c的介绍,media属性表示link的链接文档会应用于何种媒介(设备)上.用于为不同的媒介类型规定不同的样式.常用的值为sc ...

  5. Mybatis 查询 返回值中只有id有值,其他都是null;

    最近在重温mybatis, 但是在做练习的时候发现一个问题; 查询,简单的查询,返回之后发现结果中,只有id被映射了值,其他属性都是null; 很纳闷,为什么一个简单的测试会出现这种问题; 一开始以为 ...

  6. Java验证对象的属性值是否都为空

    package com.hzrc.apply.utils;import com.hzrc.entity.user.ApplyTemplate;import java.lang.reflect.Fiel ...

  7. redis的key都变成了backup,值也都不见了,这是为什么呢?

    我不会提问,只有这种方式来问问题,下午我查看redis时突然发现我的redis的key都变成了backup,值也都不见了,这是为什么呢?求知道的大佬指教,

  8. 判断两个对象的值是否都相等

    对象不可以直接==判断是否相等,由于对象是由键值对构成的,那要判断对象相等,只要判断两个对象的键.值是否都相同,如果相同就代表它们相等,反之不相等.     思路: 使用Object.getOwnPr ...

  9. TCP/IP协议:最大传输单元MTU 路径MTU

    最大传输单元MTU 以太网和8 0 2 . 3对数据帧的长度都有一个限制,其最大值分别是1 5 0 0和1 4 9 2字节.链路层的这个特性称作M T U,最大传输单元.不同类型的网络大多数都有一个上 ...

  10. 错误 未找到引用源_你不理解的EXCEL函数中常见的错误值,都在这里

    今天我们来聊聊EXCEL函数中常见的错误值 使用EXCEL一定会用到函数公式,,使用函数公式计算分析数据,不免会遇到出错的情况, 但是出错后不知道错误原因,为什么会返回错误值,所以你的函数还不能自己优 ...

最新文章

  1. InnoDB与Myisam比较
  2. mysql 从零开始_MySQL从零开始:01 数据库简介
  3. 【每天一个Linux命令】12. Linux中which命令的用法
  4. 批处理详细教程(三)
  5. 调整linux的时钟
  6. 企业关系网络分析,大数据时代淘金利器
  7. ScrollView的学习
  8. EJB3.0学习笔记---MDBbean--区分P2P模式和Pub/Sub模式的示例
  9. js中定义变量的符号
  10. 国家标准的台式计算机,GBT 9813.1-2016 计算机通用规范 第1部分:台式微型计算机国家标准...
  11. word2016页码怎么设置从任意指定页开始
  12. Fedora 9在用VMware 5.5、6.5虚拟机安装和硬盘安装中遇见的几点问题
  13. RGB转CMY最简单的方法
  14. 树莓派采集MPU9250运行AHRS进行姿态解算
  15. android用户中心头像选择功能的方法实现
  16. 添加网络计算机后打印乱码,Windows7系统打印机无法打印出现乱码的解决方法
  17. html5 拉弓,瞄准 拉弓 射出梦想
  18. 自己动手做一个PLC 软PLC
  19. 电脑怎么查看处理器CPU型号、属性以及显卡型号
  20. 获取当天的0点0分0秒的日期和23点59分59秒的日期

热门文章

  1. 其实创业做生意想成功,本质就两条:流量、变现
  2. 夜神模拟器与MAC之间传文件
  3. excel取末尾数字_excel表格中数字末尾的0不显示怎么设置
  4. 使用usb有线网卡u-boot无法ping通虚拟机
  5. C# 删除注册表信息
  6. CSS实现折角效果:
  7. Vue 实现 Chrome 小恐龙游戏
  8. chrome离线小恐龙改造版
  9. VTN416多通道振弦采集仪多功能
  10. python简单的构建爬虫ip代理池