什么是MTU(Maximum Transmission Unit)?

最大传输单元MTU(Maximum Transmission Unit,MTU),是指网络能够传输的最大数据包大小,以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。如果MTU超过了接收端所能够承受的最大值,或者是超过了发送路径上途经的某台设备所能够承受的最大值,就会造成报文分片甚至丢弃,加重网络传输的负担。如果太小,那实际传送的数据量就会过小,影响传输效率。

目录

  • 为什么需要MTU?

  • 为什么以太网MTU通常被设置为1500?

  • 超过MTU的报文如何进行分片?

  • Jumbo帧与MTU

  • TCP MSS与MTU

  • Path MTU与MTU

  • 如何设置MTU

【微|信|公|众|号:厦门微思网络】

【微思网络http://www.xmws.cn,成立于2002年,专业培训21年,思科、华为、红帽、ORACLE、VMware等厂商认证及考试,以及其他认证PMP、CISP、ITIL等】

为什么需要MTU?

网络中通常以数据包为单位进行信息传递,那么,一次传送多大的包合适、多大的包最高效就成为一个核心问题之一。如果包大小设置的很大,意味着报文中的有效数据也更多,通信效率更高,但传送一个数据包的延迟也越大,数据包中bit位发生错误的概率也越大。并且如果这个报文丢掉了,重传的代价也很大。如果包大小设置的过小,则意味传输相同的数据量,设备需要处理更多的报文,这样会极大的考验设备的线速转发能力。通过设置MTU来调节网络上数据包的大小,让不同的网络找到最适宜的MTU从而提高转发效率,这就是MTU的作用。 MTU是数据链路层的概念,指数据链路层对数据帧长度的限制。不同链路介质类型的网络有不同的默认MTU值,以下是一些常见网络的默认值:

网络默认MTU值 为什么以太网MTU通常被设置为1500? RFC标准定义以太网的默认MTU值为1500。那么这1500的取值是怎么来的呢? 早期的以太网使用共享链路的工作方式,为了保证CSMA/CD(载波多路复用/冲突检测)机制,所以规定了以太帧长度最小为64字节,最大为1518字节。最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节,虽然技术不断发展,但协议一直没有更改。 以太网最大的数据帧是1518字节,这样刨去帧头14字节和帧尾CRC校验部分4字节,那么剩下承载上层IP报文的地方最大就只有1500字节,这个值就是以太网的默认MTU值。这个MTU就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片,如果单个IP报文长度大于MTU,则会在发送出接口前被分片,被切割为小于或等于MTU长度的IP包。

MTU示意图 实际上,不同的厂商,甚至同一厂商的不同产品型号对MTU的定义也不尽相同,通常分为以下几种:

  • MTU用以指示整个IP报文的最大长度(IP头+三层Payload),MTU是一个三层的定义,即MTU = IP MTU。例如在Huawei CloudEngine系列交换机上,MTU是三层的定义,指IP MTU。

  • MTU的值等于IP报文与以太帧头的总和,即MTU = IP MTU + 14字节。例如在Cisco部分设备上,MTU是指IP MTU + 以太帧头。

  • MTU的值等于IP报文与以太帧头、CRC部分的总和,即MTU = IP MTU + 18字节。例如在Juniper部分设备上,MTU是指IP MTU + 以太帧头 + CRC部分。

在实际设置MTU值时,需要特别关注各厂商、产品对于MTU的定义。 超过MTU的报文如何进行分片? 以太网缺省MTU=1500字节,这是以太网接口对IP层的约束,如果IP层有<=1500字节需要发送,只需要一个IP包就可以完成发送任务;如果IP层有>1500字节数据需要发送,需要分片才能完成发送。 以主机发送一个数据载荷长度为2000字节的报文为例说明其分片的过程(假设出接口的MTU值为1500)。在网络层会对报文进行封装,其结构组成:IP头部20字节+数据载荷长度2000字节,报文封装后,整个报文长度为2020字节。在出接口进行转发的时候,发现IP报文的长度超过了MTU的值1500,因此要进行分片处理,详情见下图。

IP分片示意图 第一片报文,IP报文头固定20字节,数据载荷可以封装1480字节(MTU值1500字节-IP报文头20字节,数据载荷长度须是8的倍数); 第二片报文,复制第一片的IP头,IP报文头固定20字节,数据载荷为剩余的520字节(总数据载荷长度2000字节减去第一片中已封装的1480字节)。如果最后一片报文的长度不足46字节,会自动填充至46字节。 所有分片报文在发送至目的主机后,在目的主机进行分片重组,恢复为原报文。在进行重组时,通过IP标志位中的MF用来分辨这是不是最后一个分片,片偏移用来分辨这个分片相对原数据报的位置。通过这几个字段,可以准确的完成数据报的重组操作。 Jumbo帧与MTU 以太网经过几十年的发展,速度已经从最初的10M被提升到了上百G,速度提高了上万倍。在这样高速度的传输数据中,如果还是延续经典以太网的最大帧长不超过1518 字节的限制,那么在每秒中传输的数据包的个数将很大。由于每个数据包都需要网络设备来进行处理,由此带来的额外开销也将很大,而且这个开销随着网络速度的提高而愈加明显。 于是一些厂商提出了巨型帧(Jumbo Frame)的概念,把以太网的最大帧长扩展到了9K,相当于增强版的MTU,区别在于:

  • Jumbo帧是在数据链路层进行处理的。MTU涉及的分片通常是在网络层进行。

  • Jumbo帧长包括二层以太帧头及CRC部分。MTU一般不包括这部分,指的是三层IP报文部分的长度。在网络应用中,MTU最大值受限于Jumbo帧的最小值,MTU值至少要比Jumbo帧小18字节

加大帧长的好处在于,减少了网络中数据包的个数,减轻了网络设备处理包头的额外开销。大量减少的帧数目也带来了性能的提高。Jumbo帧是一种厂商标准的超长帧格式,目前还没有获得IEEE标准委员会的认可,但是大多数的设备厂商都已经开始支持。 TCP MSS与MTU TCP MSS(Maximum Segment Size)是指TCP协议所允许的从对方收到的最大报文长度,即TCP数据包每次能够传输的最大数据分段,只包含TCP Payload,不包含TCP Header和TCP Option。MSS是TCP用来限制application层最大的发送字节数。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往根据MTU值来计算(需要减去IP包头20字节和TCP包头20字节),所以通常MSS为1460=1500(MTU)- 20(IP Header) -20 (TCP Header)。

添加图片注释,不超过 140 字(可选)

TCP MSS与MTU示意图 Path MTU与MTU 顾名思义,Path MTU就是指传输路径的MTU,无需分片就能穿过某路径的数据包最大长度。在从发送端到接收端的传输路径上,如果网元的MTU设置不一致,则决定该路径可用MTU的,其实是整条路径上的最小MTU值。以Path MTU作为IP包长发送数据,既高效又能避免分片。

添加图片注释,不超过 140 字(可选)

Path MTU示意图 RFC 1191(IPv4)和RFC 1981(IPv6)定义了动态探测Path MTU值的技术,用于确定两个IP主机之间的Path MTU。首先源节点假设Path MTU就是其出接口的MTU,发出一个试探性的报文,并设置改报文不允许被分片。当转发路径上存在一个小于当前假设的Path MTU时,转发设备就会向源节点发送回应报文,并且携带自己的MTU值,此后源节点将Path MTU的假设值更改为新收到的MTU值继续发送报文。如此反复,直到报文到达目的地之后,源节点就能知道到达目的地的Path MTU了。

Path MTU探测 目前IPv4网络其实没有有效手段来发现PMTU 。主要原因是:

  • 某些运营商或网站考虑网络安全或其他需要,把ICMP探测报文过滤掉了。

  • Path MTU需要主机和互联网上的各种网络设备(交换机、路由器、防火墙等)的配合,但有些网络设备不遵从RFC 1191协议。

如何设置MTU 在网络中,由于不同厂商,甚至同一厂商不同型号的设备,对MTU的定义和MTU分片机制不尽相同,常出现MTU引起的网络问题,例如协议对接不成功、部分网站或链接打不开、游戏卡顿等。因此对MTU进行合理的规格、部署至关重要。 其最基本的原则:对接的两个三层设备以太网接口MTU配置需要保持一致。

两端MTU保持一致 同时还需要考虑多种场景下各种封装标签对报文大小的影响,例如封装MPLS标签,每层标签会增加4字节,增加MPLS标签后,报文长度也可能超过链路层允许发送的范围,导致报文无法转发。 骨干网、城域网络、接入网络MTU的配置建议 为保证骨干网络、城域网络、接入网络的完美工作,MTU的数值一定要远大于以太网标准的基本要求1500字节。通常现有的大型路由器、交换机设备,都可以支持到9000以上的大数据报文,但缺省配置各厂商并不相同,很多厂商设备的缺省MTU配置仍然是1500字节。并且因为网络中很可能运行OSPF、ISIS等需要协商MTU的路由协议,所以互相对接的不同厂商的设备的MTU也要调整为相同。 因此,在满足网络和运营商规范且各个厂商都支持的情况下,尽量将MTU配置的大一些。 数据中心等局域网络MTU的配置建议 在目前大规模建设的数据中心等网络中,通常没有对MTU进行统一调整。随着新技术的应用,MTU的问题会逐步暴露出来。比如为进行大二层扩展进行的各类隧道技术的使用,VPLS、VXLAN等。这些技术无一例外的都使用了额外的封装,形成了超大报文,例如VXLAN会在原始报文基础上增加50字节。如不统一进行MTU的规划,会导致传输效率低下,或者业务中断。 因此,在数据中心等网络的建设中,也需要确定MTU的配置规范,在各个厂商都支持的情况下,尽量将MTU配置的大一些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/103481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年09月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 Python编程(1~6级)全部真题・点这里 第1题:红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 时间限…

[42000][923] ORA-00923: 未找到要求的 FROM 关键字

在oracle数据库写分页查询&#xff0c;使用 rownum时候出错&#xff0c; 代码&#xff1a; SELECT *FROM (SELECT *, ROWNUM AS rnumFROM test t ) WHERE rnum BETWEEN 1 AND 5; 报错&#xff1a; [42000][923] ORA-00923: 未找到要求的 FROM 关键字 Position: 31 问题原因…

vue3前端开发系列 - electron开发桌面程序(2023-10月最新版)

文章目录 1. 说明2. 创建项目3. 创建文件夹electron3.1 编写脚本electron.js3.2 编写脚本proload.js 4. 修改package.json4.1 删除type4.2 修改scripts4.3 完整的配置如下 5. 修改App.vue6. 修改vite.config.ts7. 启动8. 打包安装9. 项目公开地址 1. 说明 本次安装使用的环境版…

kantts docker化

kan-tts docker本地化 环境安装 下载docker镜像(python3.8的) registry.cn-hangzhou.aliyuncs.com/modelscope-repo/modelscope:ubuntu20.04-cuda11.8.0-py38-torch2.0.1-tf2.13.0-1.9.2 安装基础模型 pip install modelscope 安装语音模型 pip install "modelscope…

RunnerGo测试平台,无代码玩转UI自动化测试

首先需要进入官网&#xff0c;RunnerGo支持开源&#xff0c;可以自行下载安装&#xff0c;也可以点击右上角体验企业版按钮快速体验 点击体验企业版进入工作台后可以点击页面上方的UI自动化 进入到测试页面 创建元素 我们可以在元素管理中创建我们测试时需要的元素 这里我们以…

Xcode升级到15.0 解决DT_TOOLCHAIN_DIR问题

根据个人开发遇到的问题做的总结&#xff0c;公司要求Xcode 14.2 &#xff0c;Swift 5.7开发&#xff0c;由于升级了Mac 14.0系统后&#xff0c;Xcode 14.2不能使用&#xff0c;解决方案目前有2个 一、在原来Xcode 14.2 的显示包内容&#xff0c;如图 二、升级到Xcode的15.0后…

CentOS系统/root根目录扩容(扩展逻辑卷)

具体操作步骤 1、查看本机磁盘环境挂载情况 2、添加磁盘分区 3、开始扩容 4、同步到文件系统 1、查看本机磁盘环境挂载情况 [rooticon ~]# df -lh 可以看到/dev/mapper/centos-root 路径下容量为50G&#xff0c;我们要给这个路径下的容量扩容&#xff1a;[rooticon ~]# lsblk…

【Jenkins】调用API构建并钉钉通知

文章目录 Jenkins API介绍提交作业带参数的作业API 令牌 Shell调用代码 Jenkins API介绍 Jenkins 提供了远程访问 API。目前它有三种格式&#xff1a; XML JSON Python 远程访问 API 形式为"…/api/" 例如&#xff0c; Jenkins 安装位于https://ci.jenkins.io&a…

协同育人|电巢携手武汉软件工程职业学院项目实训顺利开班!

为深化校企合作&#xff0c;产教融合助力新工科建设&#xff0c;提升学生工程实践能力&#xff0c;电巢工程能力实训班按照不同岗位类别&#xff0c;匹配对应的企业岗位任职能力要求对学生开展分级培养&#xff0c;以产业需求为导向&#xff0c;培养创新型、应用型人才。 10月…

vscode中注释多行bash脚本

选择你要注释的行&#xff0c;右击所选的行&#xff0c;从命令调色板中选择添加行注释。 选择后&#xff0c;所选的行将被注释为#&#xff0c;如下图所示。 选择你想取消注释的行&#xff0c;在所选行上点击右键&#xff0c;从命令调色板中选择删除区块注释&#xff0c;就可以从…

无人值守配电室变电所运维解决方案

随着电力系统数字化、智能化的不断发展&#xff0c;无人值守配电室变电所已经成为一种趋势。为了确保变电所的安全稳定运行&#xff0c;本文提出了一种无人值守配电室变电所运维解决方案。 一、背景介绍 力安科技电易云无人值守配电室变电所是指通过远程监控和智能化电力数…

如何在一个传统的html中,引入vueJs并使用vue复制组件?

如何在一个传统的html中&#xff0c;引入vueJs并使用vue复制组件&#xff1f; 1.1 引言1.2 背景1.3 解决方案1.3.1 解决方案一&#xff1a;直接使用clipboard(不推荐仅供参考学习)1.3.2 解决方案二&#xff1a;封装指令js库后使用 (推荐) 1.1 引言 这篇博文主要分享如何在一个…

【AUTOSAR中断管理】TC3XX中断系统介绍

摘要 这段文本主要介绍了AURIX TC3XX的中断系统(Interrupt Router,简称IR)以及中断注册的过程以及举例说明中断机制。 AURIX TC3XX 中断系统(Interrupt Router)介绍 流程图描述中断路由器(IR)处理服务请求并与服务提供者交互。 中断系统的作用是将service request进行…

【ivX】低调且强大的低代码平台

目录 前言 一、低代码那么多 为什么选择iVX&#xff1f; 二、“拼”出来的低代码平台&#xff0c;真的好用吗&#xff1f; 前言 首先我们应该明白自动编程突破可能是&#xff1a;领域内Mini LLM 现在的思路都是搞LLM&#xff0c;几乎像“大跃进”一样全民都在修炼“大模型”…

UE4和C++ 开发-C++绑定widget的方式和初始化UI

C绑定widget的方式有两种&#xff0c;一种是使用meta (BindWidget)&#xff0c;一种是使用GetWidgetFromName(TEXT("")),两种方式都可以。一、meta BindWidget方式 注意这种绑定的方式UMG里面的空间名称需要与C里面声明的变量名称相同 Btn_StartU 二、GetWidge…

java学习笔记001

java基础 java语言特点 面向对象&#xff0c;强类型&#xff0c;跨平台&#xff0c;解释型 基本概念&#xff08;JVM、JRE、JDK&#xff09; JVM java虚拟机 作用&#xff1a;加载.class文件 JRE Java运行环境 JREJVMJava系统类库 JDK Java开发工具包 JDKJRE编译&a…

后端:推荐 2 个 .NET 操作的 Redis 客户端类库

目录 Redis特点 Redis场景 1. StackExchange.Redis 2. FreeRedis &#x1f680; 快速入门 &#x1f3a3; Master-Slave (读写分离) &#x1f4bb; Pipeline (管道)示例 &#x1f30c; Redis Cluster (集群) Redis &#xff0c;是一个高性能(NOSQL)的key-value数据库,Re…

docker安装sql-server数据库,使用navicat实现备份数据库导入

docker安装sql-server&#xff0c;使用navicat实现备份数据库导入 1、docker安装sql-server数据库2、使用navicat连接sql-server3、使用navicat导入备份数据库1、第一步&#xff1a;选择需要备份的数据源2、第二步 &#xff08;选择备份计划&#xff0c;设置还原文件位置信息&a…

『Linux小程序』进度条

文章目录 缓冲区问题回车与换行的区别进度条小程序 缓冲区问题 假设有一段代码为: #include<iostream> #include<unistd.h> int main() …