MTU和Fragment详解

1. 基础知识

我们知道, 数据在网络上传输时, 要经过一段一段的链路。当数据从某一段链路的一端传到另一端的过程中, 需要考虑的是数据链路层协议, 在这一层, 我们观察到的数据包(PDU: Packet Data Unit)称为MAC帧(MAC Frame), 不同的数据链路层协议, MAC Frame的格式也不同, 但大致都会有目标MAC地址、源MAC地址、长度/类型、数据(有效载荷: Payload)这几个字段。 对以太网而言, 采用的是数据链路层协议是基于IEEE 802.2/802.3, 但与IEEE 802.2/802.3略有区别.

查一下802.3协议中MAC帧格式部分, 就会发现上面提到的MAC帧中的数据(有效)字段的长度范围是46-1500个字节. 那么, 当链路层的上一层-IP层所要传输的IP数据包(包括IP Header)大小超过这个长度范围时, IP数据包就必须分成多片传输, 这个过程就是分片(Fragmentating), 其中分割出来的每一个片断就是一个Fragment.

2. MTU与Fragment

上述链路层这种对超过其协议定义的最大数据字段长度时就进行分片的特性, 就称为MTU(Maximum Transmission Unit). 不同链路层协议, MTU值也不同, 我们已经知道, 对以太网, MTU是1500字节, 而对令牌环(Token Ring)网, MTU是4482字节.

3. IP数据包中与分片相关的字段

IP数据包在封装时, 在IP头的第8-9个字节(16bit)中, 存放关于分片的信息. 其中前3个bit表示分片的状态, 后13个bit表示当前片断在分片之前的整块待封装的数据包中的偏移量(因为IP数据包的最大可能长度为16bit, 而这13bit无法表示16bit的范围, 故实际使用时, 偏移量的计算是用这13bit的值乘8(3bit), 以实现表示16bit的范围).

3.1 不分片标记(Don't Fragment Flag)

IP头第8-9字节从左往右的第2bit表示当前IP数据包是(1)否(0)不分片, 缺省值为0, 就是不不分片, 即允许分片. 因为默认允许分片, 所以我们平常使用Ping命令时, 加参数-l 65500 Ping一台机器也不会有问题.

'

3.2 是否有后续分片标记(More Fragments Flag)

IP头第8-9字节从左往右的第3bit表示当前数据包里的数据是否为某块数据的最后一个分片, 若为0, 则说明当前数据包内的数据没有分片或者是最后一个分片, 若为1, 则表示后面还有属于同一块数据的分片.

4. 说了半天感觉太抽象, 我们来些看得见摸得着的东西.

4.1 用Ping测试MTU(在以太网环境中)开个命令行窗口, 输入命令:

ping 192.168.0.1 -l 2000 -f

出现提示:

Pinging 192.168.0.1 with 2000 bytes of data:

Packet needs to be fragmented but DF set.

Packet needs to be fragmented but DF set.

Packet needs to be fragmented but DF set.

Packet needs to be fragmented but DF set.

也就是在将IP头里的"Don't Fragment Flag"位设置为1, 也就是不允许分片, 但是我们又用Ping命令的-l参数指定了发送的数据包的大小为2000字节, 显然超过了以太网的MTU-1500字节. 所以数据包不能通过, 并且返回了上述错误信息: 数据包需要分片但是DF(Don't Fragment)标记被设置了.

再输入命令:

ping 192.168.0.1 -l 1500 -f

Pinging 192.168.0.1 with 1500 bytes of data

Packet needs to be fragmented but DF set

lPacket needs to be fragmented but DF set

Packet needs to be fragmented but DF set.

Packet needs to be fragmented but DF set.

奇怪, 已经把发送数据包的大小改为MTU值1500, 怎么还不能通过?

减小参数值, 重输命令:

ping 192.168.0.1 -l 1400 -f

Pinging 192.168.0.1 with 1400 bytes of data:

Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128

Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128

Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128

Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128

好, 这次可以通过了.

反复调整参数值, 看看可以通过的最大Ping命令-l 参数值是多少. 经过反复试验, 最后发现, 最大可以通过的Ping命令的-l参数的数值是1472. 这个1472是和预期的MTU值1500差了28个字节. 这28个字节是怎么来的呢?

4.2 协议分层封装

我们知道, 在MAC帧的数据(Payload)字段, 封装(存放)的是上层(IP层)的IP数据包, 而IP数据包的格式是IP Header + IP Data(Payload). 在我们用Ping命令的这个例子中, IP数据包内的IP Data字段内封装的是ICMP协议数据.

我们来回顾一下MTU的含义: MAC帧内的数据(Payload)字段的最大长度, 也就是说它所封装的IP Header + IP Data两者长度之和最大为1500字节, 而IP Header的最小长度为20字节, 所以IP Data的最大长度就是1500-20=1480字节, 离我们试验的1472字节已经比较接近了.

再查查ICMP协议数据的具体格式, 发现在Ping命令用到的ICMP Echo Request/Replay报文中, 在ICMP Data之前, 有几个字段共占用了8个字节, 分别为: Type(1byte), Code(1byte), Checksum(2byte), Identifier(2byte), Sequence Number(2byte), 这几个字段我们可以称之为ICMP Header. 好了, 1480-8=1472, 和我们的试验结果对上了.

可以发现, 我们使用Ping命令时, -l参数所指定的数据包大小, 是指的ICMP报文中的ICMP Data字段的长度, 不包括ICMP Header, 更不包括IP Header.

mac mtu测试_一个关于MTU的现象,请兄弟们看看是不是确实是这样。 - 网络管理论坛 - 51CTO技术论坛_中国领先的IT技术社区...相关推荐

  1. GPU 编程 CPU 异同点_一个顶俩 十一代酷睿用上Xe架构GPU:笔记本还要独显吗?_...

    2020年10月21日 21:20 作者:黄页 编辑:黄页 2020年笔记本电脑变得比以往更加重要,生产力愈发强大. 原因也不复杂,就是今年的疫情导致远程办公成为刚需,笔记本电脑几乎是上班族人手一台, ...

  2. 电路串联和并联图解_一个关于交流电路谐振现象的仿真实验

    对于一个具有电阻.电感.电容的交流电路中,交流电源两端的电压一般不和它输出的电流同相位.如果调节电路的参数或者电源频率使它们同相位,这时电路就发生了谐振现象.按照发生谐振现象的电路不同,可以分为串联谐 ...

  3. mysql查询每门功课成绩最好的前两名_用一个SQL查询语句得出每门功课成绩最好的前两名 - SQL Server论坛 - 51CTO技术论坛_中国领先的IT技术社区...

    有一个学生表,里面有  学号 功课编号 学生成绩三个字段. 用一个SQL查询语句得出每门功课成绩最好的前两名 学号  功课编号     学生成绩 1          1             99 ...

  4. 由于oracle错误1400而拒绝行,请教各位大神一个在工作中遇到的问题。到现在还没有解决。 - Oracle论坛 - 51CTO技术论坛_中国领先的IT技术社区...

    是这样的,小弟今天在一个2003服务器上面导出Oracle数据,在导出时一切正常. 然后此服务器重新安装2008R2系统,硬件加内存升级. 然后开始导入数据时报错了,错误信息如下: 连接到: Orac ...

  5. 删除vlan 华为s5720_小白一个!向大神请教华为S5720S配置问题(已解决) - 网络管理论坛 - 51CTO技术论坛_中国领先的IT技术社区...

    发表于 2018-7-14 12:31 | 来自 51CTO网页 引用:原帖由 semivowels 于 2018-7-14 02:04 发表 HUAWEI> system-view [HUAW ...

  6. 服务器2012不能复制文件夹,windows2012标准版 目录SYSVOL和Netlogon共享和文件同步问题 - 服务器论坛 - 51CTO技术论坛_中国领先的IT技术社区...

    我的环境是这样的:ESXi5.1 虚拟化 安装了windows2012标准版 三台域控DC01(PDC),DC02,DC03三台都安装了DNS,后两台还安装了DHCP服务.不知什么原因,也不知什么时候 ...

  7. 域控服务器错误事件解决方法,求大神帮忙,域控总有事件报错,事件ID:1864 - winServer论坛 - 51CTO技术论坛_中国领先的IT技术社区...

    AD一直有错,事件ID:1864试了dcdiag测试有好多没通过,请大神给支个招 环境是:Win2008R2 单域,两台服务器,DC-01,DC--02,还有一几台小的成员功能服务器,应该不影响,分别 ...

  8. 未查询到服务器角色信息,dcdiag结果如果排查:拥有 PDC 角色的服务器已关闭。无法找到时间服务器。 - 网络管理论坛 - 51CTO技术论坛_中国领先的IT技术社区...

    目录服务器诊断 正在执行初始化设置: 正在尝试查找主服务器... * 正在验证本地计算机 HTTDC01 是否为目录服务器. 主服务器 = HTTDC01 * 正在连接到服务器 HTTDC01 上的目 ...

  9. oracle 12 c盘已共享,求助,12c使用iscsi作为共享存储的问题,数据不同步 - Oracle论坛 - 51CTO技术论坛_中国领先的IT技术社区...

    发表于 2020-7-16 17:35 | 来自 51CTO网页 2020,7月.8月.9月,全球历史最大崩盘,终于到来了 !! 2020,7月.8月.9月,全球历卝史最大崩卝盘,终于到来了 !! 作 ...

最新文章

  1. java——逻辑运算符与(和)或(|和||)
  2. 为清理助手制作便利工具的技术实现
  3. 谷歌开源机器学习可视化工具 Facets:从全新角度观察数据
  4. ora-01033:oracle initializationg or shutdown in progress
  5. 亿级用户下的新浪微博平台架构阅读心得
  6. Compiling Fortran
  7. 网络爬虫--11.XPath和lxml
  8. 大白话5分钟带你走进人工智能-第31节集成学习之最通俗理解GBDT原理和过程
  9. https的博客作业
  10. mysql 5.7 plugin 安装_mysql5.7以上版本安装
  11. 【iOS】Swift3 报错:Value of type 'AppDelegate' has no member 'managedObjectContext',UIApplication has no
  12. 利用ggseqlogo绘制seqlogo图
  13. 用Java来解析torrent文件
  14. Python eval() 函数看这里就够了
  15. jQuery酷炫的文字动画效果代码
  16. 数据库中的视图理解和优点介绍
  17. 小文本——Cookies
  18. goldendict使用 添加 .blg 添加字典
  19. Android 调用系统中的相机应用及静默拍照
  20. confirm确认对话框 弹出确定 提交 取消

热门文章

  1. [Codeforces50C]Happy Farm 5 凸包
  2. Java数据结构--有序表
  3. Redhat 6.3 yum 本地源配置
  4. ado.net操作数据库常用方法集锦
  5. RAC安装时需要执行4个脚本及意义
  6. (转)对微软那棵TreeView进行试用,主要是对CheckBox进行操作
  7. appium学习【二】:用try捕获异常后,用例的执行结果为pass
  8. inline-block间隙原因和解决方法(web前端问题)
  9. SpringBoot2.0 整合 JWT 框架,解决Token跨域验证问题
  10. HttpClient 大量连接等待异常的处理