哈喽大家好,我是咸鱼

今天我们来聊聊计算机网络中的 MTU (Maximum Transmission Unit)

什么是 MTU ?

MTU(Maximum Transmission Unit)是指数据链路层中的最大传输单元

通俗点来讲,MTU 是指数据链路层能够传输的最大数据帧的大小(以字节为单位)

以 CentOS 7 为例,可以通过 ifconfig 命令来查看 MTU 值

为什么需要 MTU ?

我们知道,数据在数据链路层中通常是以数据帧(Frame)的形式来传输

因为传输的 Frame 不可能无限大(传小的可以),那么一次传多大的 Frame 最合适、最高效就成了一个需要考虑的问题

所以说我们要设定一个值(也就是 MTU),这个值用来限制 Frame 的大小

维基百科有这么一段话

Larger MTU is associated with reduced overhead. Smaller MTU values can reduce network delay.

由上面的话可以得出:

  • MTU越大,开销越小

这句话是很容易理解的,更大的 Frame 意味着包含的有效数据也就更多

我一次能传更多的数据了,那么传输次数就少了,在网络上的开销就变小了

  • 较小的MTU值可以减少网络延迟

这句话容易让人引起困惑,为什么 MTU 值小能够减少网络延迟呢?

如果 MTU 设置的很大,意味着一次能传更大的数据了,那占据链路的时间就会更长,所以总体上网络延迟就会变大

而且如果一大段数据里面有一个 bit 出错了,这一大段就会整个重传,重传的代价是很大的

那么 MTU 设置成多少合适呢?

为什么 MTU 的值是 1500?

RFC 标准定义以太网的默认 MTU 值为 1500,为什么是 1500 ?

这是一个历史遗留问题

早期的以太网使用共享链路的工作方式,为了保证 CSMA/CD(载波多路复用/冲突检测)机制,规定了以太帧长度最小为 64 字节,最大为 1518 字节

  • 最小 64 字节是为了保证最极端的冲突能被检测到,64 字节是能被检测到的最小值

  • 最大不超过 1518 字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞

所以说数据帧的最大长度被限制为 1518 字节(包括帧头、帧尾和CRC校验)

 

18 字节用于帧头和帧尾,其中 CRC 校验占据 4 字节,剩下的 1500 字节就是最大数据载荷(Payload)

因此,1500 字节被定义为以太网数据帧中数据部分的最大长度(MTU)

虽然技术不断发展,但这个规定一直没有更改

以太网经过几十年的发展,速度已经从最初的10M被提升到了上百G,速度提高了上万倍

在这样高速度的传输数据中,如果还是延续经典以太网的最大帧长不超过1518 字节的限制,那么在每秒中传输的数据包的个数将很大

于是一些厂商提出了巨型帧(Jumbo Frame)的概念,把以太网的最大帧长扩展到了9K

目前还没有获得 IEEE 标准委员会的认可,但是大多数的设备厂商都已经开始支持

发送数据大小超过 MTU 怎么办?

以太网的 MTU 默认值是 1500,如果发送 Frame 小于 MTU(例如 1000 字节),直接传输就行

如果大于 MTU(4000 字节),那就需要进行分片(Fragment)

即第一次发送 1500 字节(IP header 20 字节 + Payload 1480 字节)

第二次发送 1500 字节(IP header 20 字节 + Payload 1480 字节)

第三次 1000 字节(IP header 20 字节 + Payload 980 字节)

可能有小伙伴问,那我传的数据大小不够数据帧规定的最小 64 字节怎么办?

答案是:在实际数据内容后面添加填充数据,使得数据包总长度达到最小长度要求。填充数据可以是任意无意义的字节,例如全 0 或全 1 的数据

如何保证发送的数据不超过 MTU ?

前面我们知道,如果发送的数据大于 MTU,则就会进行分片操作

要让最终传给数据链路层的 Frame 数据大小不超过 1500 bytes,就要保证上层中的每一层的数据都没有超过这个大小

如果 MTU 是 1500,那么 IP 层就要保证 IP 层的 Packet 数据不超过 1480 bytes (1500 bytes – 20 bytes IP header),

对于 TCP 来说,它要保证每一个 Segment 数据大小不超过 1460 bytes (1460 bytes – 20 TCP header)

以 TCP 层(传输层)为例子, TCP 层是怎么知道发送的数据不会超过 MTU 呢?

  1. IP 层(网络层)问数据链路层数据最大传输单元( MTU )是多少

  2. TCP 层会问 IP 层数据最大传输大小(Maximum packet size)是多少

这样 TCP 层就会知道自己的最大传输数据大小,叫做 MSS(Maximum segment size)

在 TCP 的握手阶段,MSS(Maximum Segment Size)是用于指定TCP报文段中数据部分的最大长度

对于 TCP 来说,知道自己的 MSS 没有什么用

例如作为接收端来说,收到的包大小取决于发送端,得让发送端知道自己的 MSS 才行

所以在建立 TCP 连接时,双方需要协商一个合适的 MSS 值,以便在数据传输过程中进行分片和重组

什么是 TSO

前面我们介绍了什么是 MTU、MSS

如果你去抓一下包看看,你可能会遇到下面这种情况

明明协商了 MSS 为 1460 字节,为什么数据居然有一万多字节?

在建立 TCP 连接时,双方需要协商一个合适的 MSS 值,以便在数据传输过程中进行分片

但是这个分片过程往往是简单重复而且计算量比较大的,需要占用较多的 CPU 资源

所以网卡就会对内核说:哥这种小事我来干就好了,不需要麻烦您

然后内核就会把大包发给网卡,网卡来负责分片

这个叫做 TSO(TCP Segment Offload)

TSO(TCP Segmentation Offload)是一种网络传输卸载技术,用于减轻主机的网络数据包分段负担,提高网络传输性能

我们在抓包的时候看到是还在内核里的包,后面网卡拆包的过程是看不到的

网卡不但能对发送的包进行 offload,也可以对接收的包进行 onload,简单来说就是网卡会先把一些小的包积攒下来,然后合起来发送给内核

# 查看网卡上面是否开启 TSO 功能
# on 表示开启
[root@root~]# ethtool -k <网卡名称>
tcp-segmentation-offload: on
      tx-tcp-segmentation: on
      tx-tcp-ecn-segmentation: on
      tx-tcp6-segmentation: on
      tx-tcp-mangleid-segmentation: off

最后总结一下:

    • MTU 是指数据链路层能够传输的最大数据帧的大小(以字节为单位)。由于历史原因,MTU 的值最小为 64 字节,最大为 1518 字节(Payload 则是 46~1500 字节)

    • 如果发送的数据大于 MTU,则就会进行分片操作;如果小于 MTU,就会在实际数据内容后面添加填充数据,使得数据包总长度达到最小长度要求

    • MSS(Maximum Segment Size)是用于指定 TCP 报文段中数据部分的最大长度。在建立 TCP 连接时,双方需要协商一个合适的 MSS 值以便在数据传输过程中进行分片和重组

    • TSO(TCP Segmentation Offload)是一种网络传输卸载技术。TSO 技术将分片过程从 CPU 转移到网卡上的专用硬件,网卡负责将应用程序的大块数据分段为适当大小的数据包,并添加 TCP 首部,然后直接发送到网络上

计算机网络那些事之 MTU 篇的更多相关文章

  1. mysql那些事之索引篇

    mysql那些事之索引篇 上一篇博客已经简单从广的方面介绍了一下mysql整体架构以及物理结构的内容. 本篇博客的内容是mysql的索引,索引无论是在面试还是我们日常工作中都是非常的重要一环. 索引是 ...

  2. 你所不知道的html5与html中的那些事第三篇

    文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...

  3. Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)

    1.同步动态扫描 多个数码管的显示采用的是同步动态扫描方法,同步动态扫描指的是:行信号和列信号同步扫描,是一种并行操作. 2.数码管驱动电路实现思路      如果要求数码管显示我们想要的数字,首先需 ...

  4. 移动前端工作的那些事---前端制作篇之meta标签篇

    移动端前端制作有些地方不同于互联网,这篇主要讨论的是meta标签.meta标签位于head标签之间.是主要辅助HTML结构层的.meta标签不管在互联网前端还是在移动端都起了很重要的作用.这里只讨论移 ...

  5. Verilog HDL那些事_建模篇笔记(实验九:VGA驱动)

    1.了解VGA协议 VGA协议有5个输入信号,列同步信号(HSYNC Signal),行同步信号(VSYNC Signal),红-绿-蓝,颜色信号(RGB Signal). 一帧屏幕的显示是由行从上至 ...

  6. Verilog HDL那些事_建模篇笔记(实验八:键盘解码)

    1.PS2接口与协议时序图 对于PS2的接口来说,需要额外关注的是PIN5与PIN1,一个是时钟,一个是数据.PS2协议对数据的移位是“CLOCK下降沿”有效,其CLOCK的频率通常在10KHz左右. ...

  7. Verilog HDL那些事_建模篇笔记(实验三:按键消抖)

    实验三:按键消抖 首先将按键消抖功能分成了两个模块,电平检查模块和10ms延迟模块.电平检测模块用来检测按键信号的变化(是否被按下),10ms延迟模块用来稳定电平检查模块的输入,进而稳定按键信号,防止 ...

  8. 关于TP3.2微信开发那点事(基础篇)

    许久没有为博客更新内容,今天我将过去一周做的微信服务号的相关心得体会在此分享,具体如何申请成为服务号的相关流程文档都有,可根据要求完成: 开发第一步:开发前配置: AppID-->微信号的&qu ...

  9. Verilog HDL那些事_建模篇笔记(实验一,实验二)

    实验一:永远的流水灯 扫描频率配置为100Hz,即是说扫描周期为10ms.这里需要注意的是扫描周期的概念.流水灯嘛,顾名思义,扫描周期指的是流水灯扫一轮所需要的时间.听到说周期,就应该想到在建模的时候 ...

  10. 聊聊HTTP请求那一些事_HttpWebRequest_一篇就够了

    ​最近工作比较忙,很久没有写东西了,今天抽点时间整体一下最近工作的一个知识点小结.http请求对我们来说一点都不模式,程序员的我们有可能天天就是和这一些打交道.无论是BS架构的程序,前后端的数据交互, ...

随机推荐

  1. Python多线程与GIL锁

    Python多线程与GIL锁 python多线程 Python的多线程编程可以在单个进程内创建多个线程来同时执行多个任务,从而提高程序的效率和性能.Python的多线程实现依赖于操作系统的线程调度器, ...

  2. 随手记:linux校准时间

    记录一下校准时间操作的执行步骤: 首先使用 date 查看当前时间是否准确 校准时间命令 ntpdate cn.pool.ntp.org 如果没有权限: sudo -i 会出现输入密码,直接输入密码即 ...

  3. Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?

    系列文章 Terraform 系列文章 前言 最近在使用 Terraform Cloud 来置备 OCI 的 Always Free Tier, 发现它非常好用,相比 Terraform OSS, 用 ...

  4. 企业应用可观测性利器!华为云CodeArts APM发布

    摘要:近日,华为云全链路应用性能管理服务CodeArts APM全新上线,提供端到端的全链路性能管理服务,涵盖前端监控.应用性能监控,全面拥抱开源生态. 本文分享自华为云社区<企业应用可观测性利 ...

  5. YOLO1论文中文版

    文章目录 YOLO1中文版 摘要 1. 引言 2. 统一检测 2.1 网络设计 2.2 训练 2.3 推断 2.4 YOLO的限制 3. 与其它检测系统的比较 4. 实验 4. 1 与其它实时系统的比 ...

  6. 【机器学习与深度学习理论要点】11.什么是L1、L2正则化?

    机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作 L1-norm 和L2-norm,中文称作 L1正则化 和 L2正则化,或者 L1范数 和 L2范数.L1正 ...

  7. ChatGPT Plugin 插件开发:基于 ASP.NET Core Minimal API

    前言 这是一篇ChatGPT插件开发教程,描述如何使用 ASP.NET Core Minimal API 开发 ChatGPT 插件,以最简单的 Todo List 指导示例作为入门教程. 这个Tod ...

  8. 2022-11-16:给你一个数组 nums,我们可以将它按一个非负整数 k 进行轮调, 例如,数组为 nums = [2,4,1,3,0], 我们按 k = 2 进行轮调后,它将变成 [1,3,0,

    2022-11-16:给你一个数组 nums,我们可以将它按一个非负整数 k 进行轮调, 例如,数组为 nums = [2,4,1,3,0], 我们按 k = 2 进行轮调后,它将变成 [1,3,0, ...

  9. Grafana系列-统一展示-8-ElasticSearch日志快速搜索仪表板

    系列文章 Grafana 系列文章 概述 我们是基于这篇文章: Grafana 系列文章(十二):如何使用 Loki 创建一个用于搜索日志的 Grafana 仪表板, 创建一个类似的, 但是基于 El ...

  10. vue核心

    VUE简介 vue--一套用于构建用户界面的渐进式JavaScript框架 vue特点 采用组件化模式--提高代码复用率--让代码更好维护 声明式编程--让编码人员无需直接操作DOM--提高开发效率 ...