FlowNet:经济高效的高性能网络

作者:Erann Gat

我们一直在使用 Linux 开发一种新的高速网络,我们称之为 FlowNet。这个项目一直是一个“虚拟车库”式的运作,只涉及两个人,一个在加利福尼亚,另一个(在不同时期)在马萨诸塞州、宾夕法尼亚州和印第安纳州。我们通过互联网传输设计和代码,并通过 Federal Express 运送硬件。最终成果是一个独特的网络,它将当今现有标准的最佳特性结合到一个单一的设计中。FlowNet 目前是世界上最快的计算机网络,能够在 100 米的标准 5 类铜缆上运行。FlowNet 的软件是开发出来的,目前仅在 Linux 下运行。

要了解 FlowNet 的工作原理,重要的是要了解一些关于网络硬件的细节,因此我们将从当前网络技术发展水平的简要教程开始。

网络背景

当今局域网的主流硬件标准是以太网,它有几十种变体。所有形式的以太网唯一共同的特征是其帧格式;也就是以太网硬件直接处理的数据格式。以太网帧是一个可变大小的帧,范围从 64 字节到 1514 字节,带有 14 字节的头部。头部仅包含三个字段:帧发送者的地址、接收者的地址和帧类型。

共享介质以太网

以太网设计有两种主要变体,称为共享介质和交换式。在共享介质以太网中,所有网络节点都连接到一根电线上,因此任何时候只能有一个节点传输数据。以太网使用一种称为载波侦听多路访问/冲突检测 (CSMA/CD) 的协议来选择在任何给定时间允许哪个节点进行传输。CSMA/CD 是一种非确定性协议,不保证公平访问。事实上,在网络严重拥塞的情况下,CSMA/CD 倾向于偏袒单个节点,排斥其他节点,这种现象被称为捕获效应。处于捕获效应的劣势是网络连接可能会长时间丢失的一种方式。

CSMA/CD 协议不允许节点在电线被另一个节点使用时开始传输(这就是载波侦听部分)。然而,两个节点有可能几乎在同一时间开始传输。结果是两个传输相互干扰,并且两个传输都无法被正确接收。可能发生冲突的时期是从节点开始传输到信号实际到达电线上所有其他节点的时间。这个时间取决于电线上最远节点之间的物理距离。如果这个距离太长,节点可能在帧到达电线上所有节点之前完成传输。这将使发送节点未检测到的冲突成为可能。为了防止这种情况发生,共享介质以太网网络的物理跨度是有限制的。这个距离被称为冲突直径;它是传输最短可能以太网帧(64 字节)所需时间的函数。传统 10Mbps 以太网的冲突直径约为两公里,这对于大多数局域网来说已经足够了。然而,冲突直径在更快的数据速率下会缩小,因为传输帧所需的时间更少。以 100Mbps 运行的快速以太网的冲突直径为 200 米——这个限制在大型建筑物中可能会受到限制。(千兆以太网的冲突直径将为 20 米,但由于这个距离太短,千兆以太网不使用 CSMA/CD。)

交换式以太网

绕过共享介质以太网限制的方法是使用一种称为交换机的设备。交换机有许多连接或端口,每个端口都可以与其他端口同时接收帧。因此,在交换网络中,多个节点可以同时传输。在纯粹的交换网络中,每个节点都有自己的交换机端口,并且不会发生冲突。然而,仍然可能存在资源争用,因为现在两个节点可能同时传输目标为单个节点的帧,而该节点一次仍然只能接收一个帧。因此,交换机必须决定首先交付哪个帧,以及在等待时如何处理另一个帧。交换机通常包括一些缓冲,以便这种类型的争用不一定会导致数据丢失,但在大量使用的情况下,所有交换网络最终都将被迫丢弃一些帧。

交换机如何决定丢弃哪些帧?大多数交换机只是以先进先出的方式运行。也就是说,当它们被迫丢弃帧时,它们会丢弃最近接收到的帧。没有提供太多的替代方案,因为以太网头部中没有信息指示哪些帧不太重要并且应该首先丢弃。因此,当大多数交换机变得拥塞时,它们基本上是随机丢弃帧。

这种行为造成了一个严重的问题。包括 TCP/IP 在内的大多数网络协议对丢弃帧的响应是重新传输丢弃的帧。因此,网络拥塞导致随机丢弃帧,这导致重新传输,这导致更多的网络拥塞,这导致更多的随机丢弃帧。当这种情况发生时,许多网络,特别是互联网,通常会戛然而止。

服务质量

解决这个问题的唯一方法是在帧中添加信息,以便为交换机提供关于如何处理单个帧的指导。例如,如果一个帧被标记为电子邮件消息的一部分,交换机就会知道延迟这个帧是完全可以接受的,但它可能也不应该被丢弃。另一方面,如果这个帧是视频流的一部分,那么交换机就会知道,如果这个帧不能立即传输,它应该被丢弃,从而导致视频中的小故障。关于在拥塞网络中应如何处理帧的信息被称为服务质量信息或 QoS。

QoS 信息可以通过三种方式提供。第一种是从头开始完全重新设计网络。这是异步传输模式 (ATM) 网络设计使用的方法。ATM 是一种电路交换网络,而不是分组交换网络。在像以太网这样的分组交换网络中,每个数据帧在其头部都包含其目标地址。将帧传递到其目标的过程类似于传递信件的过程。在每个交换机上,目标地址都会在表中查找,以查看它应该去哪里。像 ATM 这样的电路交换网络仅在一个帧中放入目标地址,称为流设置帧或流设置信元。流设置信元建立通过网络的路由,很像拨打电话一样。后续帧会自动通过此预先建立的连接路由。流设置过程允许 ATM 网络提前分配网络资源,以便提供服务质量保证。

ATM 的电路交换设计从根本上与以太网的分组交换设计不兼容。ATM 在帧大小方面也与以太网不同。以太网使用可变大小的帧,而 ATM 使用固定大小的 53 字节帧或信元,其中五个字节是头部,每个帧 48 字节是有效负载数据。这导致了一个严重的问题:信元必须路由的速度太快了,以至于只能使用定制硬件才能完成,这使得 ATM 非常昂贵。

提供 QoS 信息的第二种方法是将其放入以太网帧的数据部分。这是以太网社区正在通过 RSVP 等协议采取的方法。这种方法的优点是它向后兼容现有硬件,这很重要,因为已经安装了庞大的以太网基础设施。ATM 可以通过称为 LAN 仿真 (LANE) 的技术与以太网互操作,但这既困难又效率低下。

使用现有以太网帧格式实现 QoS 的问题是,大多数现有硬件将无法识别与 QoS 关联的新协议。这可能会通过将未正确标记的帧注入网络或未正确处理标记的帧来破坏 QoS 机制。因此,虽然这种方法向后兼容现有硬件,但除非更换大部分现有基础设施,否则它可能不可靠。

第三种方法是将 QoS 信息添加到以太网头部。这是一个非向后兼容的更改,但不如 ATM 那样彻底的重新设计,并且可以以一种使其易于将新网络与现有硬件互操作的方式完成。这就是我们在 FlowNet 设计中采用的方法。

FlowNet: An Inexpensive High-Performance Network

图 1. FlowNet 原型完全由现成的组件构建,并且像以太网卡一样安装在标准的 PCI 插槽中。在生产中,该板可以简化为仅两个或三个芯片。

FlowNet 架构

与 ATM 一样,FlowNet 是一个基于固定大小信元的交换网络。与 ATM 不同,FlowNet 信元很大——800 字节而不是 53 字节。这为 14 字节的以太网头部加上额外的 QoS 扩展留出了空间。QoS 扩展头部为 18 字节,使完整的 FlowNet 头部为 32 字节长。剩余的 768 字节(=256+512)是数据有效负载。

FlowNet 通过一个简单的桥接设备与以太网互操作。要将 FlowNet 信元转换为以太网帧,桥接器只需剥离 QoS 扩展。要反过来,它会生成带有默认值或用户配置值的 QoS 扩展。例如,可以对桥接器进行编程,以便为来自某些工作站的帧提供高优先级,而来自其他工作站的帧接收低优先级。

FlowNet: An Inexpensive High-Performance Network

图 2. FlowNet 原型的图表,显示了主要组件的位置。

分布式交换

FlowNet 架构在帧结构之外的方面也具有创新性。FlowNet 网络接口卡 (NIC) 非常简单,由发射器、接收器、一些内存和一个微处理器组成。NIC 在逻辑上以菊花链方式连接在一起以形成一个环路。在物理上,FlowNet 使用星型拓扑结构,带有集线器,就像以太网一样。当节点发送信元时,信元会被发射器和接收器之间的每个节点接收和重新传输,这种 arrangement 被称为存储转发环路。为了减少延迟,FlowNet 使用一种称为直通路由的技术,该技术允许在接收到头部后立即重新传输信元。

由此产生的网络是一个交换网络,具有一个独特的特性:它不需要交换机。相反,每个 NIC 都像一个小型的双端口交换机,一个端口在网络上,另一个端口在主机接口上。交换功能分布在环路上的所有节点之间。信元路由决策由板载微处理器在软件中制定,这提供了复杂的服务质量,而无需昂贵的定制硬件。

由于 FlowNet 的大信元大小,可以在软件中制定信元交换决策。信元交换决策是基于每个信元做出的。对于给定的数据速率,较大的信元意味着更少的信元,这意味着需要做出的信元交换决策更少。当前的 FlowNet 原型可以使用 Intel i960 微处理器以 250Mbps 全双工(总数据速率为 500Mbps)的速度交换数据。

开发

FlowNet 是一种最先进的网络。除了是可在 100 米铜缆上运行的最快网络之外,它还是唯一可提供服务质量并与以太网高效互操作的网络。FlowNet 是作者在业余时间独自工作,在非常有限的预算(大约 20,000 美元,用于十几个原型)下开发的。

开源软件,包括 Linux 和 Intel 的 gnu960 开发工具,对于实现这一点至关重要。Linux 用于开发板载固件和 FlowNet 的设备驱动程序。Linux 的几个功能对于我们实现目标至关重要。第一个是设备驱动程序的模型代码的可用性。由于 FlowNet 的接口与以太网非常相似,我们能够使用 Donald Becker 的 Tulip 驱动程序作为模型,并将其调整为 FlowNet,而不是从头开始。

Linux 的第二个非常有帮助的功能是内核模块。由于设备驱动程序代码是内核代码,因此无法将其作为应用程序运行。如果没有模块,设备驱动程序必须通过将它们编译到内核中并重新启动来测试。这增加了开发周期的时间。借助内核模块,内核代码可以动态链接和取消链接,从而将测试周期缩短到不到一分钟。我们为 FlowNet 构建了一个内核模块,该模块在初始化期间通过 PCI 总线加载卡的固件。这使得可以使用单个 make 命令重新编译和重新启动所有 FlowNet 软件。因此,FlowNet 的所有软件都在不到三个月的时间内开发完成。

唯一需要重新启动的时间是当驱动程序代码中的错误导致内核崩溃时。有时这会导致机器崩溃,但并非总是如此。在整个开发过程中,我们从未因内核崩溃而丢失任何数据,尽管事实上我们有时会用随机位覆盖关键的内核数据结构。Linux 真是出奇地健壮。

结论

如果没有 Linux 作为开发平台,FlowNet 就不会诞生。硬件成本将我们微薄的预算拉到了极限。为商业操作系统开发 FlowNet 所需的开发工具将扼杀这个项目。

FlowNet 最初是在 1993 年构思出来的。尽管快速以太网(以及即将到来的千兆以太网)似乎正在占领世界,但 FlowNet 在提供千兆性能和服务质量方面仍然是独一无二的,而无需光纤布线或丢弃以太网基础设施。Linux 使 FlowNet 作为私人开发项目成为可能——几乎可以肯定,它不可能以其他任何方式发生。FlowNet 目前尚未投入生产;有关更多信息,请联系作者 (http://www.flownet.com/)。

FlowNet: An Inexpensive High-Performance Network
Erann Gat (gat@flownet.com) 是加利福尼亚州帕萨迪纳市喷气推进实验室的技术人员高级成员。

FlowNet: An Inexpensive High-Performance Network
Mike Ciholas (mikec@flownet.com) 是印第安纳州纽堡市 Cedar Technologies 硬件设计咨询公司的所有者。
加载 Disqus 评论