计算机网络那些事之 MTU 篇
哈喽大家好,我是咸鱼
今天我们来聊聊计算机网络中的 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 呢?
IP 层(网络层)问数据链路层数据最大传输单元( MTU )是多少
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 篇的更多相关文章
- mysql那些事之索引篇
mysql那些事之索引篇 上一篇博客已经简单从广的方面介绍了一下mysql整体架构以及物理结构的内容. 本篇博客的内容是mysql的索引,索引无论是在面试还是我们日常工作中都是非常的重要一环. 索引是 ...
- 你所不知道的html5与html中的那些事第三篇
文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...
- Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)
1.同步动态扫描 多个数码管的显示采用的是同步动态扫描方法,同步动态扫描指的是:行信号和列信号同步扫描,是一种并行操作. 2.数码管驱动电路实现思路 如果要求数码管显示我们想要的数字,首先需 ...
- 移动前端工作的那些事---前端制作篇之meta标签篇
移动端前端制作有些地方不同于互联网,这篇主要讨论的是meta标签.meta标签位于head标签之间.是主要辅助HTML结构层的.meta标签不管在互联网前端还是在移动端都起了很重要的作用.这里只讨论移 ...
- Verilog HDL那些事_建模篇笔记(实验九:VGA驱动)
1.了解VGA协议 VGA协议有5个输入信号,列同步信号(HSYNC Signal),行同步信号(VSYNC Signal),红-绿-蓝,颜色信号(RGB Signal). 一帧屏幕的显示是由行从上至 ...
- Verilog HDL那些事_建模篇笔记(实验八:键盘解码)
1.PS2接口与协议时序图 对于PS2的接口来说,需要额外关注的是PIN5与PIN1,一个是时钟,一个是数据.PS2协议对数据的移位是“CLOCK下降沿”有效,其CLOCK的频率通常在10KHz左右. ...
- Verilog HDL那些事_建模篇笔记(实验三:按键消抖)
实验三:按键消抖 首先将按键消抖功能分成了两个模块,电平检查模块和10ms延迟模块.电平检测模块用来检测按键信号的变化(是否被按下),10ms延迟模块用来稳定电平检查模块的输入,进而稳定按键信号,防止 ...
- 关于TP3.2微信开发那点事(基础篇)
许久没有为博客更新内容,今天我将过去一周做的微信服务号的相关心得体会在此分享,具体如何申请成为服务号的相关流程文档都有,可根据要求完成: 开发第一步:开发前配置: AppID-->微信号的&qu ...
- Verilog HDL那些事_建模篇笔记(实验一,实验二)
实验一:永远的流水灯 扫描频率配置为100Hz,即是说扫描周期为10ms.这里需要注意的是扫描周期的概念.流水灯嘛,顾名思义,扫描周期指的是流水灯扫一轮所需要的时间.听到说周期,就应该想到在建模的时候 ...
- 聊聊HTTP请求那一些事_HttpWebRequest_一篇就够了
最近工作比较忙,很久没有写东西了,今天抽点时间整体一下最近工作的一个知识点小结.http请求对我们来说一点都不模式,程序员的我们有可能天天就是和这一些打交道.无论是BS架构的程序,前后端的数据交互, ...
随机推荐
- flask-wtfwkfom使用
我们在使用flask框架来搭建自己的博客,只要是设涉及到表单相关,必然会想起Flask-WTF与WTForms.对于flask初学者来说,比较容易混淆两者.今天想来一一解释两者的用法. Flask-W ...
- [数据库/Linux]CentOS7安装MySQL Percona版(RPM方式)
OS: CentOS7 (x86_64) MySQL: MySQL Percona 5.7.31-34 0 前置条件 已配置完成YUM源 已卸载先前可能安装的MySQL rpm -qa | grep ...
- 如何使用Redis做缓存
如何使用Redis做缓存 我们都知道Redis作为NoSql数据库的代表之一,通常会用来作为缓存使用.也是我在工作中通常使用的缓存之一. 1.我们什么时候缓存需要用到Redis? 我认为,缓存可以分为 ...
- MySQL(十三)MySQL性能分析工具:慢查询日志与PROFILE查询成本
性能分析工具SLOW QUERY LOG.PROFILE的使用 数据库调优的目标就是响应速度更快,吞吐量更大.利用宏观的监控工具和微观的日志分析可以帮助我们找到调优的思路和方式. 数据库调优的步骤 ...
- [Pytorch框架] 2.1.3 神经网络包nn和优化器optm
文章目录 PyTorch 基础 : 神经网络包nn和优化器optm 定义一个网络 损失函数 优化器 PyTorch 基础 : 神经网络包nn和优化器optm torch.nn是专门为神经网络设计的模块 ...
- PTA 4-6次总结
(1)前言: 04:这次题目集主要学习了:使用LinkedHashSet删除arraylist中的重复数据,封装,了解Scanner类中nextLine()等方法.String类中split()等方法 ...
- vivo积分任务体系的架构演进-平台产品系列05
作者:vivo 互联网平台产品研发团队- Mu JunFeng 积分体系作为一种常见营销工具,几乎是每一家企业会员营销的必备功能之一,在生活中随处可见,随着vivo互联网业务发展,vivo积分体系的能 ...
- ad-hoc实战
ad-hoc实战 要求:利用Ansible搭建一个简易的作业网站,web端文件上传目录共享至nfs端,nfs的数据同步至backup 环境准备 主机名 主机角色 外网IP 内网IP m01 ansib ...
- ersync 实时同步
ersync 实时同步 目录 ersync 实时同步 实时同步概述 结合sersync+rsync实时同步实战 环境准备 部署sersync(客户端) 实时同步概述 什么是实时同步 实时同步是一种只要 ...
- 金三银四好像消失了,IT行业何时复苏!
疫情时候不敢离职,以为熬过来疫情了,行情会好一些,可是疫情结束了,反而行情更差了, 这是要哪样 我心中不由一万个 草泥 路过 我心中不惊有了很多疑惑和感叹 接着上一篇 一个28岁程序员入行自述和感受 ...