黑暗的一周,告别尤文10号,告别意大利~
前言
想到写关于网络设备 MTU MSS Jumboframe 的文章,源自于近期在 Wireshark 网络协议解析方面碰到的问题以及延伸带来的思考,计划从网络设备以及网络协议分析两个角度,分两篇文章简析一下。
本篇网络设备重点在 MTU、Jumboframe,下篇网络协议分析重点在 MTU、MSS。
概念
有关 MTU、MSS、Jumboframe 等概念,网络资料很多,以下根据网络设备的不同以及个人理解做一下相关基础总结。
MTU
MTU(Maximum Transmission Unit),The maximum sized datagram that can be transmitted through the next network is called the maximum transmission unit (MTU).
MTU 最大传输单元,一般来说是个二层(数据链路层)概念,所以有时会说是二层 MTU。大小通常指的是有效载荷 Payload 的长度,由于数据链路层类型的不同,其大小并不一样,但大多数都有一个上限,如以太网/802.3的最大值分别为 1500 和 1492 。
其中以太网 MTU 1500 字节,是不包含以太网帧头 14 字节以及尾部 FCS 4 字节的长度,根据不同的表示方式,最大数据帧长度为 1518 或者 1514(有的不提及 FCS )字节均是一个意思。而更大的 MTU 大小可以更有效地处理数据,以满足不同的应用需求。
以下内容均在以太网类型上展开。
既然强调了以太网 MTU 通常是有效载荷 Payload 的长度 1500 字节,这个通常意味着也有不同的例子,以下拿 Cisco IOS-XR 为例,MTU 是包含以太网帧头 14 字节的,即大小为 1514 字节。
综合以上,通用标准下的以太网 MTU 为 1500 字节。
IP MTU
说到二层 MTU ,自然也有三层 MTU 的说法,三层 MTU 是一个三层概念,它包含了三层头部及其载荷,譬如上图中所提到的 IPv4 MTU、IPv6 MTU、MPLS MTU 等等,而 IP MTU 多指 IPv4 MTU。
根据下层为上层服务的,上层基于下层才能做进一步的扩展的原则,IP MTU 的大小也就为 1500 字节,考虑标准的 IP 头部 20 字节,其载荷部分最大也就为 1480 字节。
IP MTU 1500 字节 = 20 字节(IP 首部)+ 1480 字节(Payload)
IP 分片,网络层 IP 协议会检查每个从上层协议下来的数据包的大小,并根据 Payload 的大小决定是否作分片处理。
MSS
MSS(Maximum Segment Size)是 TCP 协议的一个选项,用于在 TCP 连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。
同样基于下层网络层的限制,标准 IP MTU 的大小 1500 字节,算上 IP 头部 20 字节和 TCP 头部 20 字节,因此标准的 MSS 最大为 1460 字节。
IP MTU 1500 字节 = 20 字节(IP 首部)+ 20 字节(TCP 首部)+ 1460 字节(MSS)
TCP 分段,传输层 TCP 协议会检查每个从上层协议下来的数据包的大小,并根据 MSS 的大小决定是否做分段处理。
Jumbomtu
jumbomtu 的说法,主要来自于思科(其他各厂商的设备接触不多,不清楚是否也有类似的说法),个人理解它只是对应于 MTU 1500 标准大小,定义的一个 System Jumbo MTU 的说法。
以 Cisco Nexus 交换机举例,全局默认的 System Jumbo MTU 大小为 9216 字节,在一个二层接口上可以使用默认的标准 MTU 1500 字节大小,也可以使用 Jumbomtu 所定义的大小,二选一。如果在接口上使用 Jumbomtu 所定义的值,其值会根据全局 system jumbomtu size 所定义的大小变化而变化,默认为 9216 字节。
对应于 MTU ,Jumbomtu 默认的 9216 字节同样指的是有效载荷 Payload 的长度,也不包含以太网帧头 14 字节以及尾部 FCS 4 字节的长度。
Jumboframe
Jumboframe 巨型帧,基本各厂商都有这样的定义,包括网络、服务器和PC机等设备,一般说法是指大于 1522 字节的以太网帧,是一种具有不同厂商标准的超长帧格式。既然是指的数据帧,那么对应于以太网,它的大小就应该包括以太网帧头 14 字节、Payload 有效载荷部分以及尾部 FCS 4 字节。
各家厂商标准并不一样,有定义大于 1518 字节的以太网帧即为巨型帧的,同样巨型帧可支持的最大值一般也不一样。
巨型帧优点是小包变大包,减少分片,从而降低了包数量、帧开销和CPU利用率,增加吞吐量。缺点增加了传输时延,传输失败可能造成更长的重传时间,端到端包括中间所有设备都需要支持巨帧。所以一般应用于有特殊需求的应用场景,像是存储等。
正是由于各厂商的标准不一样,对应于不同大小的数据包,在网络设备的转发上以及服务器、PC机网卡的处理上,均有不同的逻辑。
设备
对于不同长度数据帧的处理上,各家厂商都有自己的标准,甚至说同一家厂商不同类型或型号的设备都会有所差异。以下以思科、华三、华为等主流的数据中心交换机,以及服务器等设备为例说明各自的处理逻辑。
注:同厂商不同型号设备也可能存在取值差异,具体以官方文档为准。
思科
基于 Cisco Nexus(NXOS) 交换机平台,举几个实例说明 MTU、IP MTU、Jumbomtu 等的处理逻辑。
二层转发
拓扑:
SW E1/1 和 E1/2 MTU 均为默认 1500,全局 System Jumbomtu 默认 9216 ;
Server 1 和 Server 2 同在 Vlan1 内,服务器网卡均开启巨型帧支持功能;
测试方法,Server1 ping Server2 , 改变 size 数据长度部分。
首先说明一个概念,二层 MTU 1500 意味着能处理的最大数据帧大小为 1518 字节, 需要注意的是所说的能处理,是包括接收和发送两个方向的。意味着如果在交换机二层接口上收到一个 2000 字节有效载荷的数据帧的话,是会做丢弃处理的。
针对接收和发送两个方向,部分资料也会提及有 MTU 和 MRU 两个概念,发送和接收方向。
实验:
SW E1/1 MTU 1500 收到 Server1 发送的包含 2000 字节有效载荷的数据帧,E1/1 做丢包处理,Ping 结果不通;
SW E1/1 MTU 改为 9216 ,E1/1 接收并转发至 E1/2, 但由于 E1/2 MTU 为 1500 ,仍然做丢包处理,Ping 结果不通;
SW E1/2 MTU 改为 9216,E1/2 正常转发,Server2 正常接收并回包,Ping 结果通。
结论:
MTU 接收和发送时均生效;
Jumbomtu 实际理解就只是一个更大的 MTU。
三层转发
拓扑:
SW E1/1 和 E1/2 MTU 均为默认 1500,SVI 1 和 SVI 2 的 IP MTU 均为默认 1500,全局 System Jumbomtu 默认 9216 ;
Server 1 在 Vlan1 ,Server 2 同在 Vlan2 内,网关均在 SW 上,服务器网卡均开启巨型帧支持功能;
测试方法,Server1 ping Server2 , 改变 size 数据长度部分。
实验:
SW E1/1 MTU 1500 收到 Server1 发送的包含 2000 字节有效载荷的数据帧,E1/1 做丢包处理,Ping 结果不通;
SW E1/1 MTU 改为 9216 ,此时的处理逻辑较为繁琐,首先是 SVI 1 的 IP MTU 1500 在入方向不做处理,之后交换机根据路由进行转发,下一跳出口为 SVI 2,会由于 SVI 2 的 IP MTU 1500 ,做 IP 分片处理,再到 E1/2 时,由于分片后的两个数据帧此时都满足 MTU 1500 要求,E1/2 会转发给 Server2 ,Server2 正常接收并回包,但由于回包仍是包含 2000 字节有效载荷的数据帧,所以在 E1/2 的入方向由于 MTU 1500 会做丢弃处理,Ping 结果不通;
SW E1/2 MTU 改为 9216,参照 2 的处理逻辑,Ping 结果通。
结论:
IP MTU 在接收端不处理,在发送时会根据数据帧大小,并参考 IP MTU 做是否分片处理。
硬件 MTU
拓扑:
SW1 和 SW2 所有端口 MTU 均为默认 1500,全局 System Jumbomtu 默认 9216 ;
Server 1 和 Server 2 同在 Vlan 1或2 内,服务器网卡均开启巨型帧支持功能;
测试方法,Server1 ping Server2 , 改变 size 数据长度部分。
首先说明一个结论,Nexus 平台上二层 MTU 1500 其实只是个软件 MTU 配置限制,实际上隐藏一个硬件 MTU 的说法,这个值为 1568 字节。
实验:
Server 1 和 Server 2 均在 Vlan1
此时 Server1 ping Server2,数据载荷部分可以到 1540 字节,这样 1540 + 8(icmp首部)+ 20(IP首部)= 1568 字节,经过交换机时,并不会产生丢包,ping 结果正常通。而数据载荷部分为 1541 字节时,会超过硬件 MTU 而产生丢包,ping 结果不通。
Server 1 和 Server 2 均在 Vlan2
此时 Server1 ping Server2,以数据载荷 1540 字节的时候仍然可以 ping 通,但实际和在 Vlan 1 里的情况稍有不同的是经过 Trunk 链路时,是会插入 802.1Q 字段(即 Vlan2 标签),意味着会多出 4 个字节,而增加的这4个字节仍然不会造成整个数据帧超过硬件 MTU 而丢包。个人理解,这说明了像是 Trunk VLAN 以及 QinQ ,对于所增加的 802.1Q 标签头部,交换机并不把它算到 MTU 的长度里,而像是 MPLS 、隧道类似等技术,所增加的各类头部,是会算到 MTU 长度里,也就是说会压缩真正数据载荷的大小。
Nexus MTU
Configuration | Packet Size | Incremented Counters | Traffic |
L2 port – without any MTU configuration | 6400 and 10000 | Jumbo, giant, and input error | Dropped |
L2 port – with jumbo MTU 9216 in network-qos configuration | 6400 | Jumbo | Forwarded |
L2 port – with jumbo MTU 9216 in network-qos configuration | 10000 | Jumbo, giant, and input error | Dropped |
Layer 3 port with default Layer 3 MTU and jumbo MTU 9216 in network-qos configuration | 6400 | Jumbo | Packets are punted to the CPU (subjected to CoPP configs), get fragmented, and then they are forwarded by the software. |
Layer 3 port with default Layer 3 MTU and jumbo MTU 9216 in network-qos configuration | 10000 | Jumbo, giant, and input error | Dropped |
Layer 3 port with jumbo Layer 3 MTU and jumbo MTU 9216 in network-qos configuration | 6400 | Jumbo | Forwarded without any fragmentation. |
Layer 3 port with jumbo Layer 3 MTU and jumbo MTU 9216 in network-qos configuration | 10000 | Jumbo, giant, and input error | Dropped |
Layer 3 port with jumbo Layer 3 MTU and default L2 MTU configuration | 6400 and 10000 | Jumbo, giant, and input error | Dropped |
华三
华三交换机二层接口上实际上已没有 MTU 的概念,对于接口上所能处理的数据帧大小的依据是 jumboframe 。以太网接口收到的长度如果大于 1536 字节的帧称为超长帧(巨型帧),缺省情况下,设备允许最大长度为 9416 字节的超长帧通过。
交换机对于超长帧的处理如下:
如果系统配置了禁止超长帧通过(通过 undo jumboframe enable 命令配置),会直接丢弃该帧不再进行处理。
如果系统允许超长帧通过,当接口收到长度在指定范围内的超长帧时,系统会继续处理;当接口收到长度超过指定最大长度的超长帧时,系统会直接丢弃该帧不再进行处理。
IP MTU,在三层接口下可以 mtu 命令配置 IP MTU 的大小,缺省情况下为 1500 字节。
二层接口下
jumboframe enable [ size ]
允许超长帧通过,缺省情况下,设备允许最大长度为 9416 字节的超长帧通过,取值 1536-9416 字节之间。
三层接口下
mtu [ size ]
缺省情况下,以太网接口的 MTU 为1500 字节,取值 128-9008 字节之间。
二层转发
在二层转发的情况下,数据帧在不超过 jumboframe 9416 字节的情况下,在入和出接口均能正常转发,也就是前面的说的没有二层 MTU 的说法。
三层转发
在三层转发的情况下,和思科不太一样,IP MTU 在接收发送端均不处理,而在本地发送时会根据数据帧大小,参考 IP MTU 做是否分片处理。
华为
华为交换机同华三交换机一样,在二层接口上也没有 MTU 的概念,对于接口上所能处理的数据帧大小的依据也是 jumboframe 。与华三交换机不一样的地方,以太网接口收到的长度如果大于 1518 字节的帧称为超长帧(巨型帧),缺省情况下,设备允许最大长度为 9216 字节的帧通过以太网接口,非 jumbo 帧长的最大值为 1518 字节,即小于等于 1518 字节时为非 jumbo 帧。
jumboframe enable 命令用来配置接口允许通过的最大帧长,以及非 jumbo 帧长的最大值。
IP MTU,在三层接口下可以 mtu 命令配置 IP MTU 的大小,缺省情况下为 1500 字节。
二层接口
jumboframe enable value1 [ value2 ]
value1 指定允许通过以太网接口的最大帧长。长度大于value1的帧被丢弃。
value2 指定非jumbo帧长的最大值。帧长小于等于value2的帧被统计为普通帧。
取值在 1518-12224 字节之间
三层接口
mtu [ mtu ]
指定以太网接口的MTU值,单位是字节,取值范围是 46-9216 字节之间。
二层转发
在二层转发的情况下,数据帧在不超过 jumboframe 9216 字节的情况下,在入和出接口均能正常转发,也就是前面的说的没有二层 MTU 的说法。
三层转发
在三层转发的情况下,和华三一样,IP MTU 在接收发送端均不处理,而在本地发送时会根据数据帧大小,参考 IP MTU 做是否分片处理。
服务器
包括 Windows 和 Linux 等服务器网卡上默认 MTU 均为 1500 字节,根据网卡功能的不同,可开启的 jumboframe 巨型帧支持大小不等,2K - 9K 甚至更大。同样 PC机、笔记本之类设备也类似。
此类设备网卡 MTU 处理逻辑和思科类似,能处理的最大数据帧大小为 1518 字节(MTU 1500字节), 同样需要注意的是所说的能处理,也是包括接收和发送两个方向的,意味着如果在未开启 jumboframe 的网卡上收到一个 2000 字节有效载荷的数据帧的话,是会做丢弃处理的。而在传输发送方向,系统内核协议栈根据不同层数据载荷的大小,判断是否做 TCP 分段或是 IP 分片等处理。
非服务器方向,理解如有错误,请指正,谢谢。
参考
https://www.cisco.com/c/en/us/support/docs/ios-nx-os-software/ios-xr-software/116350-trouble-ios-xr-mtu-00.html
https://www.cisco.com/c/en/us/td/docs/dcn/nx-os/nexus9000/102x/configuration/interfaces/cisco-nexus-9000-nx-os-interfaces-configuration-guide-102x/b-cisco-nexus-9000-nx-os-interfaces-configuration-guide-93x_chapter_0100.html
https://info.support.huawei.com/info-finder/encyclopedia/zh/MTU.html
https://support.huawei.com/enterprise/zh/doc/EDOC1000079855
https://support.huawei.com/enterprise/zh/doc/EDOC1100130741/6ec7b162
往期推荐
