热门标签 | 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,那么该节点会对报文进行切片后再转发到下一个路由节点。


推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
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社区 版权所有