本篇主要讲解:网络通信-最大传输单元-MTU
参考链接1


文章目录

  • MTU 引用
  • MTU 介绍
    • 定义
    • MTU 与 VLAN Tag
    • VLAN Tag 处理方式
  • IP分片
  • 可靠传输
  • MTU 之 PMTUD
    • PMTUD介绍
    • IP头的DF分片位
      • DF = 0 可以分片
      • DF = 1 不可以分片
  • 注意事项

MTU 引用

以太网最初对报文长度没有限制,网络层最大可以接收65535个字节,但是以太网对于长报文无法可靠地传输,而且丢失后重传也会占用大量的网络资源,而将报文限制在一定的长度,以太网可以将报文大概率传输到目的地,于是就有了MTU


MTU 介绍

定义

Maximum Transmission Unit,即最大传输单元,以太网的数据链路层对网络层数据包的长度会有一个限制,其最大值默认是1500字节,链路层的这个特性称为MTU,由硬件网卡设置,是 数据链路层对网络层硬性限制
MTU表示网络层必须将发给网卡API的包 <= 1500byte,否则调用失败, 这个1500字节数据长度是针对网络层的,不包含链路层的头部和尾部

MTU 与 VLAN Tag

如果有的以太网网卡配置了VLAN Tag ,通过此网卡的数据帧会携带VLAN Tag,VLAN Tag要算在链路层的Payload里, MTU = 1500里包含802.1Q的头部VLAN Tag (如下图)

当网卡配置VLAN Tag时, VLAN Tag + Data <= MTU ,有时VLAN Tag不只有一个,可能是双标签,那这个VLAN Tag就是8个字节。这时候的MTU如果还是1500,链路层的Payload就不可能是1500了

VLAN Tag 处理方式

可以把添加802.1Q的接口设置MTU=1504或1508(网卡设置,硬件操作)


IP分片

既然链路层的Payload有MTU限制,就意味着 网络层下发到链路层的数据不能超过MTU,如果超过了MTU,就需要在网络层分片 ,切成<=MTU的IP数据包

网络层如果发现链路层的MTU小于IP包的大小(网络层可以调用函数获取链路层信息),也并不会立刻开始分片,还需要看IP包的是否允许分片位DF(Don’t Fragment)(在下方内容PMTUD处详述,如果允许分片,就会 分成多个ID一样的IP包


可靠传输

对于UDP包,如果MTU = 1500,那么udp Payload最大值是多少,才可以不用分片?

MTU(1500) = IPHeader(20) + UDPHeader(8) + Payload
Payload = 1500 -20 - 8 = 1472

如果UDP包的Data <= 1472个字节,UDP包(UDPHeader+Data)在网络层不用分片,直接封装上IPHeader发往链路层,如果UDP包的Data > 1472,那么UDP包(UDPHeader + Data)需要在网络层分片 ,如何分片?

网络层并不会在每个分片里复制一次UDP头,它是把完整的UDP包切开,加上IP头发送出去,除了第一个分片有UDP头,后面的分片都不包含UDP头

目的主机的网络层接收到多个UDP分片包后,网络层必须重组才能交给上层,为什么?

因为多个分片包只有第一个是有UDP头的,它可以根据UDP头里的端口号通知相应的应用取走,但是后面的分片包由于没有UDP头,传输层无法把分片包交给正确的应用程序。所以UDP分片包必须在 网络层重组成一个完整的UDP包,交给传输层处理IP分片会分成多个ID一样的IP包,根据ID重组)。

  • 不可靠传输

UDP如果某些分片包没有被目的主机的网络层接收到,UDP包重组失败,接收方会丢弃整个数据包,这是UDP不可靠传输的一个表现。
对于UDP来说,一般选择576个字节通信

  • 可靠传输

TCP包重组失败,该包会被重传,保证可靠传输


MTU 之 PMTUD

PMTUD介绍

PMTUD:Path MTU Discovery

收发双方在TCP协议通信时,根据取较小MSS的原则理论上避免了发送方在网络层分片,接收方在网卡由于超过MTU而无法接收的情况
但是,以太网通信不是只有两台主机,它们通信的途中还有路由器和交换机,路由器和交换机都有自己的MTU,主机的网络层可以分片,路由器的网络层也可以分片
就像木桶理论一样,木桶能装多少水取决于最短的那块, 网络通信的路径上决定IP包大小的,取决于源主机、目的主机、路由器中MTU最小的那个这就是PMTUD

路由器和交换机都有自己的MTU,如果数据帧超过了它们的MTU,在从出口发出去时,需要进行分片网络层能否分片IP包,需要根据IP头的DF分片位决定

IP头的DF分片位

DF = 0,表示可以分片
DF = 1,表示不可以分片

DF = 0 可以分片

下图设定 ,设定左右两台主机在TCP握手阶段,确定了MSS = 1480 - 20 - 20 = 1440,设定发送的IP包就是1440 + 20 + 20 = 1480,如果是直连,这样的IP包在发出去的时候不会分片,而接收端也可以接收到。

但是当IP包到达路由器时,需要从另一个接口发出,而接口MTU为1450,必须分片才能发送,这时候 路由器就会检查IP包的DF位,以确定这个IP包是否支持分片

发现DF位是0,表示可以分片,就把这个IP包分成两份,1450和30,由于第一份1450是有IP头的,可以直接下发到链路层发出,而第二份30是没有IP头的,需要加上IP头20个字节,形成一份新的IP包,最终大小是50个字节,同样下发到链路层发出

DF = 1 不可以分片

如下图,与上面DF = 0的情况不同的是,路由器发现IP包需要分片,然后查看IP包的DF位,发现值为1,显示不能分片,此时路由器只能丢弃此IP包,同时给源主机回复一个ICMP目的不可达的消息,Type = 3,code = 4

  • 上图中code = 4的含义

同时,在ICMP消息里还会携带路由器的MTU的大小,告知源主机这个路由器的MTU是多少,这样源主机就可以继续调整自己的MSS值如果有多个路由器,多个路由器都会这样操作,最终确定一个这条路径上的最小MTU,这就是PMTUD

另外,ICMP目的不可达消息,还会把丢弃的IP包的各层报头也放在里面(如下图)

注意事项

路由器的MTU只针对网络通信数据出口,接收数据不受限制
PMTUD只有TCP支持,UDP并不支持


网络通信-最大传输单元-MTU相关推荐

  1. 【Windows MTU】Windows上最大传输单元MTU值的查看和设置

    Win11 22000.120 IPv6 MTU 值怎么是 1472,Win10 中却是 1500 ? 以管理员 cmd 输入: netsh interface ipv4 show subinterf ...

  2. 【网络】什么是最大传输单元 ( MTU)|MTU 优化

    目录 最大传输单元MTU 最大传输单元 (MTU) IP 分段(IP Fragmentation) Path MTU Discovery 关于网络编程中MTU.TCP.UDP优化配置的一些总结 TCP ...

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

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

  4. 数据链路层——封装成帧、透明传输、差错检测、最大传输单元MTU、以太网协议

    OSI模型中的数据链路层与物理层,在TCP/IP协议中同属于网络接口层. 数据链路层为物理连接之间提供了可靠的数据传输.数据链路层主要解决3个问题:封装成帧.透明传输.差错检测. 封装成帧 " ...

  5. 最大传输单元(MTU)

    最大传输单元 维基百科,自由的百科全书 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个 ...

  6. 最大可传输单元 MTU 对 UDP/TCP 包的大小限制

    目录 一.MTU 简述 - 分包后数据包最大长度 1.定义 2.网络中 MTU 值的由来: 1>.最大值: 2>.最佳值的推导: 3>.最佳值: 4>.最小值: 5>.碎 ...

  7. 最大传输单元MTU详解

    MTU(Maximum Transmission Unit,最大传输单元) MTU由TCP/IP协议栈中的IP协议定义,网络层的IP将MTU设置为1500字节. 简单点理解就是:IP规定每一个单独的数 ...

  8. centos 设置mtu_Linux系统下修改最大传输单元MTU的方法

    最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据报大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接口卡.串口 ...

  9. 【网络】什么是MTU|MTU 优化|最大传输单元

    目录 最大传输单元MTU 最大传输单元 (MTU) IP 分段(IP Fragmentation) Path MTU Discovery 关于网络编程中MTU.TCP.UDP优化配置的一些总结 TCP ...

最新文章

  1. javascript的词法作用域
  2. SAP SD基础知识之订单中装运相关的功能 I
  3. numpy.dstack详解
  4. 图形变换动画的小Demo
  5. Y2K Accounting Bug(poj2586)
  6. jquery-入门-基本使用-选择器-转移
  7. border属性 php,如何通过CSS的border属性为图片设置边框效果
  8. php判断同一天,PHP判断两个时间戳是否在同一周同一月等 - YangJunwei
  9. 使用hutool发送QQ邮件在windows正常,linux发送报错。
  10. 机械制图符号_?《机械制图》课程 试题库(中专)
  11. 在windows server 2003下如何了启动远程管理(html)
  12. UGUI的Canvas
  13. 【操作系统内存管理(基本概念)】
  14. Android如何进行反编译
  15. 移动流量转赠给好友_中国移动怎么才能转赠手机流量
  16. 3. 'PipelinedRDD' object has no attribute '_jdf'
  17. 社会调查报告包括哪几个部分?
  18. 画以载道:艺术演变的动力与社会思潮的嬗变
  19. python base_Python base(一)
  20. html添加微信号,html代码点击复制微信号并自动打开微信添加好友

热门文章

  1. PostgreSQL安装流程
  2. 使用c语言操作sql server数据库
  3. 为什么会出现雷粉?他们为什么会流失?怎样维护和粉丝之间的关系?
  4. 大数据程序员的工作职责是什么?
  5. 互联网缔造全球脑时代
  6. TCP心跳时间的设置
  7. Java使用redis实现虚拟游戏商店功能
  8. 字母打字练习--键盘事件onkeydown--keycode - css
  9. 可扩展的web单页应用程序架构
  10. Ueditor高亮插件SyntaxHighlighter显示时Bug修复