什么是以太网中的巨型帧

时间:2020-03-21 11:48:44  来源:igfitidea点击:

以太网是一项核心技术,它使我们能够通过互联网进行的大多数通信和数据传输成为可能。
它是用于高性能网络的廉价技术。

当应用程序(无论是什么,可以是Web浏览器,下载客户端等)启动与远程服务器的连接时,该应用程序的工作就是将要发送的数据/请求传输到网络协议堆栈。

协议栈的工作是将数据分解为较小的块,并用所需的信息包装,以通过导线发送。
软件包在数据块上的此信息使数据能够被正确的接收器接收,并以正确的顺序重新组装数据块。

一旦数据由应用程序传递到操作系统的网络堆栈,网络堆栈就会将每个数据块传递到以太网硬件。
大多数情况下,这种以太网硬件是连接到发件人计算机上的网络接口卡。

硬件添加到每个数据块的标头称为以太网标头。
这些以太网头有助于数据包到达正确的目的地。

举例来说,如果我们正在将数据传输到远程计算机,则NIC卡将向每个数据块添加其自己的标头,并将其发送到网关。
网关(无论是路由器,Linux机器还是其他设备)都将剥离其获得的报头,并读取IP数据包中的正确目的地,然后将添加自己的以太网报头,然后传输以太网数据包到下一跳(无论是Linux系统,交换机还是路由器还是其他设备)

每个跃点(位于发送方和接收方之间的机器/设备)将剥离其获取的标头,以读取正确的目的地,并在转发之前添加自己的标头。
我有一个以太网帧图,我在另一篇有关VLAN的文章中使用了它(如下所示)。

阅读:什么是VLAN,以及如何在Linux中进行配置?

我们可以放心地忽略上图中的VLAN INFO部分(仅用于VLAN)。

每个以太网帧都以目标地址,源地址和帧末尾的帧检查序列(称为FCS)开头。

众所周知,IEEE是定义协议标准的组织。
最初的以太网标准称为IEEE 802.3,其以太网帧大小在64到1518字节之间。

由于15字节的以太网标头(如源mac,目标mac等),其值为1518.
标准以太网帧的主要有效载荷(协议栈中其他层提供的数据)范围为46到1500字节。
这称为最大传输单位(MTU)。
如果有效载荷大于网络可以支持的最大载荷,则需要通过第3层(网络层)将该数据包分解为较小的片段,以便MTU可以容纳它。

但是随着需求和用例的增加,有必要对原始以太网标准进行修改。
下面提到对以太网标准的某些更改,这些更改会导致帧大小增加

  • 以太网标头中的VLAN信息将帧大小从1518增加到1522. 这是因为VLAN标头在标头中需要另外的4个字节(如上图所示)。支持VLAN信息的以太网标准称为IEEE 802.1Q
  • 另一个称为802.1ad的规范在原始帧大小1518的基础上增加了8个字节。因此,它变为1526字节。 802.1ad是一种用于在单个帧中包含多个VLAN信息的规范(阅读:关于802.1ad的Wikipedia文章)
  • 现在,由于添加了多个新标头而导致的帧大小不断增加,IEEE决定将整体帧大小增加到2000字节。阅读:IEEE 802.3as规范文章
  • 然后,FCOE(以太网光纤通道)需要更高的传输速率,因此他们提出了2500字节的MTU大小。

正如我之前说的,MTU只是IP数据包可以包含的最大数据量,可以通过一个帧(网络支持)发送该数据而不会造成碎片。
如果IP数据包(由网络层提供的数据)超出了网络支持的最大帧大小,则需要对其进行分段处理。

最近,我正在阅读CISCO的有关其Catalyst系列产品上的Jumbo Frames支持的文档(请参阅:http://www.cisco.com/image/gif/paws/29805/175.pdf)。

并根据该文件...

大小为1600字节的以太网帧称为婴儿巨型帧,范围在1600到9216字节之间的帧都可以称为巨型帧。

我之所以讨论该cisco文章,是因为不同的供应商对于巨型帧是什么有不同的看法。
.目前,巨型帧没有在任何IEEE以太网规范中定义(我相信有些东西还在他们的草案中,但尚未在任何规范下) )。

因此,不同的供应商可能支持不同的框架尺寸(并且不同供应商的巨型框架将具有不同的尺寸)。
但是,是的,我们可以有一个中间立场,就像思科文章所说的那样,将巨型帧视为介于1600到9216字节之间的任何帧。

使用巨型框架的优点

在讨论巨型帧时,我想到的第一件也是最重要的事情是更高的数据传输效率。

考虑与巨型帧相关的效率是非常合乎逻辑的,因为我们每帧传输的数据更多。
可以真正从巨型帧中受益的一些用例是:

    1. NFS(网络文件系统)。由于此协议主要用于通过网络共享文件,因此较大的帧可以显着提高其性能。
  • ISCSI SAN或者FCOE:这些协议处理以太网上的存储,并要求更高的有线传输速率。为他们提供巨型框架可以提高其性能。

相关:网络文件系统教程

相关:性能调整NFS

相关:了解存储区域网络

让我们举一个例子来了解巨型帧如何显着改善网络性能。
假设我想将大小为6Kb(6144字节)的文件发送到我的目标服务器之一。
标准MTU大小为1500字节(不包括帧头)。

现在,需要将6kb的数据切片为1500字节的较小块(因为我的MTU是1500字节)。
这意味着我需要将大约4到5帧发送到我的目标服务器,以完成传输。

但是,如果我的MTU大小约为9000(如果我的网卡和网络设备支持巨型帧),我可以在单个帧中将该6Kb文件发送到目的地。
看到不同?
因此,如果没有巨型帧支持和非常低的延迟网络,我们可以说我们没有充分利用网络容量进行传输。
因此,在没有巨型帧支持的情况下,发送机必须将数据分段成较小的块,以便它可以容纳在受支持的MTU大小内。

不要忘记,接收机器还必须重新组装1500字节的较小块以形成我发送的数据。

因此,如果我们使用的是巨型帧,则发送方和接收方的计算机必须经过较少的CPU周期,因为它只需要发送一帧而不会分段就可以到达目标。
更少的CPU使用率意味着更高的吞吐量。
因此,作为脚注,我们可以说以下。

一个9000字节的巨型帧能够替换6个1500字节的标准以太网帧。
并且还可以节省50%的CPU。

除了上述优点之外,由于通过有线而不是6的单帧发送,因此CPU使用量更少,传输速率更高,巨型帧实际上可以减少通过有线发送的字节数。
为了理解这一说法,让我们再次以6kb文件为例。
因此,如果要通过标准以太网MTU大小发送该6kb文件,则第3层必须将其分段为4个不同的块。
所有这4个不同的ip数据包块都将具有自己的ip标头。
这意味着我们将发送相同的TCP/IP标头4次,以将该单个6kb文件发送到我们的目的地。
在9000字节MTU的情况下,我们仅一次发送这些TCP/IP标头。
因此,我们通过网络发送的字节数更少。

大多数情况下,任何操作系统在单个帧中通过电线发送的实际数据通常为1460个字节。
这是因为20个字节用于IP标头,另外20个字节用于TCP标头。
因此,单个帧中的IP数据有效载荷约为1460个字节(1500个20个字节20个字节)

巨型帧的理想用例

不应使用巨型帧,因为它可以提高数据传输速率。
有时,它可能会对网络通信产生怪异的影响。
当我们的需求到今天为止还不那么庞大时,最初的MTU大小1500已标准化。
那时全是10兆位,或者最大是100兆位以太网。

但是后来出现了千兆以太网,现在我们的大多数服务器上都有10千兆以太网。
但是标准组(IEEE)需要向后兼容,因此标准MTU大小保持为1500个字节。

仅当满足以下基本要求时,才应配置巨型帧。

  • 我们有完整的千兆网络
  • 即将到来的所有网络设备(从源到目标)都支持巨型帧
  • 所有服务器主机均安装了具有巨型帧支持的NIC卡及其驱动程序。

由于最初的TCP 3方式握手,TCP可以设法在变化的MTU大小的网络中工作。
最初的3种握手方式协商MSS(最大段大小)。

最大段大小不过是TCP/IP数据包可以承载的最大数据量(不包括tcp/ip标头)。
在源和目标之间建立TCP连接时进行协商。
我们在每个帧上发送的1460字节的实际数据(不包括20字节的tcp和20字节的ip标头)是MSS。

由于UDP没有初始握手,因此在变化的MTU大小的网络上,UDP可能会出现奇怪的问题。
不建议在具有不同MTU大小的单个网络上运行多个主机。

因此,如果我们希望网络支持9000字节的MTU大小,则途中的所有交换机和主机都应配置为接受至少9000字节的MTU。

如何在Linux中配置MTU 9000或者巨型帧

在Linux系统上配置9000的MTU之前,请仔细检查是否已配置它。
参见下面的输出,我们应该从ifconfig命令输出中看到MTU值。

eth0      Link encap:Ethernet  HWaddr 0A:65:38:CA:63:1E
          inet addr:10.1.130.195  Bcast:10.1.130.255  Mask:255.255.255.128
          inet6 addr: fe80::865:30ff:feca:631e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:3501576178 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3621233432 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:4833044650833 (4.3 TiB)  TX bytes:4930864397824 (4.4 TiB)
          Interrupt:44

如果ifconfig输出中没有值9000,则可以使用以下命令对其进行配置。

# ifconfig eth0 mtu 9000

或者,我们也可以替代地编辑接口配置文件,并在该位置添加MTU大小值以使其永久不变,然后重新启动网络服务。
在基于Red Hat的系统中,编辑文件/etc/sysconfig/network-script/ifcfg-eth0,其值(添加)为MTU = 9000。
在基于ubuntu/debian的系统中,编辑文件/etc/network/interfaces并在末尾添加MTU 9000。

如何检查巨型帧是否正常工作?

我们可以使用简单的ping命令检查已配置的巨型帧是否正常工作。
PING命令具有一个选项,用于指定要发送的数据包大小。
尝试通过ping发送8000个字节,然后查看是否从目标主机获得了答复,如下所示。

[ec2-user@myserver ~]$ping -M do -s 8000 10.1.130.195
PING 10.1.130.195 (10.1.130.195) 8000(8028) bytes of data.
8008 bytes from 10.1.130.195: icmp_seq=1 ttl=64 time=0.832 ms
8008 bytes from 10.1.130.195: icmp_seq=2 ttl=64 time=0.805 ms
8008 bytes from 10.1.130.195: icmp_seq=3 ttl=64 time=0.816 ms

如果目标服务器不支持巨型帧,那么我们将收到如下所示的答复。

[ec2-user@myserver ~]$ping -M do -s 8000 10.2.0.71
PING 10.2.0.71 (10.2.0.71) 8000(8028) bytes of data.
lowest rates for payday loans
From 10.1.130.25 icmp_seq=1 Frag needed and DF set (mtu = 1500)
From 10.1.130.25 icmp_seq=1 Frag needed and DF set (mtu = 1500)
From 10.1.130.25 icmp_seq=1 Frag needed and DF set (mtu = 1500)
From 10.1.130.25 icmp_seq=1 Frag needed and DF set (mtu = 1500)
From 10.1.130.25 icmp_seq=1 Frag needed and DF set (mtu = 1500)
From 10.1.130.25 icmp_seq=1 Frag needed and DF set (mtu = 1500)
From 10.1.130.25 icmp_seq=1 Frag needed and DF set (mtu = 1500)

输出清楚地表明需要分段。

巨型帧的利弊

  • 导线上的较大框架往往会增加延迟,因此不适用于要求延迟非常短的应用。像VOiP或者聊天应用程序等。
  • 为了有效使用巨型帧,我们需要确保源和目标之间出现的所有希望都支持我们所需的MTU大小。基本上只在已知的网络和设备上使用它。
  • 有时,不支持巨型帧的交换机会丢弃数据包。