热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于MTU,这里也许有你不知道的地方

MTU(MaximumTransmissionUnit)大小指的是一个以太帧(EthernetFrame)能携带的最大数据部分(payload)的大小,当MTU值设置为9000By

MTU(Maximum Transmission Unit) 大小指的是一个以太帧(Ethernet Frame)能携带的最大数据部分(payload)的大小, 当MTU值设置为9000 Bytes的时候也叫做巨型帧(Jumbo Frame):

以太帧(Ethernet Frame)
《关于MTU,这里也许有你不知道的地方》

一般情况下网卡的MTU大小是1500(最大可配置到9000),然后为了在高性能的网络环境下调数据的传输效率,可以通过增加MTU只来实现,换句话说通过MTU的增加,每帧(Frame)传输的数据量就会更大。 这就好比用面包车运输对比用大货车运输的区别。

然而要实现大MTU需要网络里的每个设备都必须支持巨型帧,包括发送主机,目标主机以及网络中的路由器等。

本文主要是记录如何探测网络中的MTU设置已经错误配置MTU带来的影响。

为了探测两个不同实验室的机器之间的网络是否支持Jumbo Frame, 我从实验室A的Centos主机(client) 发送ping命令到实验室B的服务器(server), 首先检查client的MTU配置:

[root@centos ~]# ifconfig eno16777736
eno16777736: flags=4163 mtu 1500

可以看到默认的MTU值为1500, 此时我们发送一个大小为100B的ICMP数据包到目标server.

[root@centos ~]# ping -s 100 -c 1 10.245.194.61
PING 10.245.194.61 (10.245.194.61) 100(128) bytes of data.
108 bytes from 10.245.194.61: icmp_seq=1 ttl=50 time=23.0 ms

可以看到小于MTU的数据包(128 = 100 + 20(ip header) + 8(icmp header))成功地发出并得到服务器回应, 接着我们增大包的大小到2000,超过了1500的MTU值, 同样数据ping成功ping发送并得到回应:

[root@centos ~]# ping -s 2000 -c 1 10.245.194.61
PING 10.245.194.61 (10.245.194.61) 2000(2028) bytes of data.
2008 bytes from 10.245.194.61: icmp_seq=1 ttl=50 time=24.2 ms

或许这里会有疑问,不是说最大只能发送1500字节的包吗? 为何2000字节也能成功发出?为了解答这个问题,我们通过wireshark抓个包来看看怎么回事

[root@centos ~]# tcpdump -i eno16777736 -s 50 -w mtu_1500.pcap
[root@centos ~]# tshark -t ud -P -O icmp,ip -Y "ip.addr==10.245.194.61" -r mtu_1500.pcap000>>mtu_1500.txt

打开mtu_1500.txt,找到ICMP包:
icmp 帧
《关于MTU,这里也许有你不知道的地方》

可以看到,即使我们指定的数据包大小是2000字节,但是IP层会根据当前MTU的设置对超过的ICMP数据进行分片(Fragmentation),以满足发送方的MTU设置要求。那么接收方是如何判定当前IP包是否被分片过?可以通过More Fragments 标志位(上图93行)和Flags字段(上图第90行)的值来判断,, 当接收方的IP层收到最后一个切片后(More Fragments: Not set),就会组装收到的所有切片包然后交给上层协议, 这里我们停下来想一想,IP层如何保证切片重组的顺序?其实很简单,IP包里有个Fragment offset属性,接收方可根据此属性的顺序重组切片, 此列中,理论上应当只有两个切片(1500 + 500 =2000), 所以接下来的一个Frame就是最后一个IP 切片:

第二个Fragment
《关于MTU,这里也许有你不知道的地方》

上图第二个切边也是最后一个,其IP包的大小为548字节,也就是着总的数据传输量为2048(1500+548)字节,其中1个icmp头(8B), 2个ip头(20B+20B)和icmp的数据部分(2000). 所以可以看到,即便发送数据量超过了MTU的值,在IP层也会进行切片来适配所设置的MTU大小。
那么将发送发的MTU设置为9000字节启用巨型帧的话,会出现什么结果呢?

[root@centos ~]# ifconfig eno16777736 mtu 9000 up
[root@centos ~]# ifconfig eno16777736
eno16777736: flags=4163 mtu 9000

设置好巨型帧以后,再来ping一个大数据包看看这次结果有什么不一样。

[root@centos ~]# ping -s 2000 -c 1 10.245.194.61
PING 10.245.194.61 (10.245.194.61) 2000(2028) bytes of data.
--- 10.245.194.61 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

额。。。 增大了MTU之后,反而ping不成功!这是怎么回事??? 在看看网络包:

ping with jumbo frame
《关于MTU,这里也许有你不知道的地方》

嗯,没问题,MTU设置应该是成功的,这次IP层没有分片,发送的数据也是2000字节,但是为什么服务器没有回应呢?

其实,这恰恰说明了此网络是不支持巨型帧的,只有网络里有一个转发节点的MTU值不是9000B并且发送方要求不分片(第170行, DF: Set)的情况下,转发节点会丢弃该报文。这也就是为什么会返回超时丢包的错误了。
简单来说,当一个转发点收到一个IP报文以后,先检查该报文的大小是否超过自己的MTU值,如果超过,再检查是否设置了DF标志(Don’t Fragment), 如果设置,此报文将会被直接丢弃,如果没有设置Don’t Fragment,那么该节点会对报文进行切片后再转发到下一个路由节点。


推荐阅读
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文详细解释了华为ENSP模拟器中常用的命令,涵盖用户模式、系统模式、接口模式和地址池视图模式下的操作。这些命令对于进行计算机网络实验至关重要,帮助用户更好地理解和配置路由器及PC机的通信。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 深入解析 HDFS Federation:多命名空间架构详解
    HDFS Federation 是一种扩展 HDFS 架构的方式,通过引入多个独立的 NameNode 来解决单点故障和性能瓶颈问题。本文将详细探讨 HDFS Federation 的工作原理、优势以及潜在挑战。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
author-avatar
泽旺多吉外_680
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有