哈喽大家好,我是咸鱼

今天我们来聊聊计算机网络中的 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. pysimplegui之画布,图形,表格和树结构元素

    画布元素 在我看来,tkinter Canvas 小部件是 tkinter 小部件中功能最强大的.虽然我尽我所能将用户与任何与 tkinter 相关的东西完全隔离,但 Canvas 元素是一个例外.它 ...

  2. [大数据]Hadoop常用命令合集

    hadoop 查看hadoop版本 # hadoop version SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found ...

  3. BISS-C 8通道采集renishaw传感器及其CRC校验

    背景 BISS-C 是常见的位置编码器传输协议,相对于传统的协议,支持更快的传输速度,电器接口为电压差分RS422或者485,抗干扰能力较强,在精密位置传输中应用广泛. 下述信息源自雷尼绍 典型的请求 ...

  4. CSS6大种选择器

    一.常用的css基本选择器(4种) 1.标签选择器 结构: 标签名{css属性名:属性值}作用:通过标签名,找到页面中所有的这类标签,设置样式 注意:1.标签选择器选择的是一类标签,而不是单独的一个2 ...

  5. Consistency Models终结扩散模型

    最近看到一篇论文,觉得特别有意思,并且在学术界引起了不小的动静,他就是一致性模型,据说图像生成效果快.质量高,并且还可以实现零样本图像编辑,即不进行一些视觉任务训练,可以实现图像超分.修复.上色等功能 ...

  6. RTSP Server(LIVE555)源码分析(二)-服务器创建

    一. 设置RTSP服务器配置 步骤1.5:rtspServer_Init--->BasicTaskScheduler::createNew()时序图如下: 1)步骤1.54,BasicTaskS ...

  7. Python-faker的简单使用

    前言: faker是一个开源的python库,安装完成后只需要调用Faker库,就可以帮助我们创建需要的数据. 一.安装 1.执行如下命令安装 pip3 install faker 2.进入File ...

  8. RocketMQ消费者是如何负载均衡的

    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting ). 本文分享自华为云社区<一文讲透RocketMQ消费者是如何负载均衡的& ...

  9. 【Linux】Linux 基础入门

    Linux 发行版(发行版之间的联系与区别) 红帽公司开发的RedHat Enterprise Linux,它是全世界内使用最广泛的Linux系统,具有极强的性能与稳定性,并且在全球范围内拥有完善的技 ...

  10. phpstudy-sqlilabs-less-11

    题目:POST - Error Based - Single quotes- String 基于错误的单引号post型字符变形的注入 看到有个账密输入口第一反应尝试post注入 打开post data ...