1、基于小型计算机的路由器(1969年至1990年代中期)
分组交换网络上的第一个路由器可能是1969年ARPANET上的接口消息处理器(IMP)。IMP论文中描述的IMP是在HoneywellDDP-516微型计算机上实现的。在今天的术语中,这种路由器被称为软件路由器,因为它是作为通用计算机之上的软件实现的。
在小型计算机之上实现路由器的这种方法足以满足当时所需的适度转发速率。例如,IMP论文报告说,IMP的最大吞吐量约为700kbit/s,足以在两个方向上服务于多条50kbit/s的线路。此类基于微型计算机的路由器也非常出色:可编程路由器的功能仅需升级微型计算机上的转发软件即可。
这种使用小型计算机构建生产路由器的方法一直持续到1990年代中期。1970年代著名的软件路由器例子是DavidMills的Fuzzball路由器。1980年代最著名的例子是NoelChiappa的C网关,这是MIT初创公司Proteon的基础,以及WilliamYeager的“夜间运货”多协议路由器,这是斯坦福初创公司思科系统公司的基础。
到1990年代中期,由于互联网和万维网的迅速采用,软件已无法满足对更高链接速度的需求。瞻博网络的M40路由器是1998年硬件路由器的早期示例。M40包含用于实现路由器的数据平面的专用芯片以及用于实现路由器的控制平面的控制处理器。正如我们在前面中所描述的那样,自1990年代中期以来,最快的路由器主要由专用硬件构成,因为硬件专业化是维持链路速度逐年提高的唯一方法。
图1:自1969年ARPANET上的第一台路由器以来,软件路由器的总容量。直到1990年代中期,软件路由器才够用。但是,从那时起,最快的路由器主要是固定功能的设备,这些设备是由专用的非可编程硬件构建而成的,与最好的软件路由器相比,这些路由器的性能提高了10-100倍。
2、主动网络(1990年代中期)
1990年代中期,有源网络得到了发展,这种方法提倡网络是可编程的或“有源的”,以允许在网络基础架构中部署新服务。主动网络至少有两种方法。首先,可编程路由器方法,它允许网络运营商以受限方式对路由器进行编程。其次,封装方法,其中最终主机会将程序作为封装嵌入到数据包中,然后由路由器执行。
主动网络主要与胶囊方法有关。但是胶囊方法引起了一些安全隐患。由于程序是由最终用户嵌入到数据包中的,因此恶意或错误的最终用户程序可能会破坏整个路由器。解决安全问题的一种方法是在隔离的应用程序级虚拟机(如Java虚拟机)中执行胶囊程序。但是,使用虚拟机进行隔离以降低转发性能为代价。
即使使用提供有效隔离的技术(例如SNAP),在通用处理器上执行数据包转发时,也会对性能造成重大影响。例如,SNAP在2001年报告的转发速率为100Mbit/s,比1998年开发的JuniperM4040Gbit/s硬件路由器慢了两个数量级。
胶囊方法可能是所有主动网络愿景中最雄心勃勃的方法,由于安全方面的考虑,它并未以最通用的形式出现。但是,最近的系统向终端主机公开了路由器功能的一个更为受限的子集(例如,终端主机读取路由器状态但不写入路由器状态的能力),这使人想起了封装方法。另一方面,可编程路由器方法已经以各种形式被采用:软件定义的网络和可编程路由器芯片都为网络运营商提供了不同种类的受限路由器可编程性。
3、软件路由器(1999年至今)
自1990年代后期以来,一种可编程性的方法就是使用通用基板来编写数据包处理程序,而固定功能路由器硬件则无法编程。多年来,通用基板已经发生了变化。例如,Click在2000年使用了单核CPU。在2000年代初期,英特尔推出了专门针对网络的一系列处理器,称为网络处理器,例如2000年的IXP1200和2000年的IXP2800。RouteBricks项目在2009年使用了多核处理器,PacketShader项目在2010年使用了GPU,而NetFPGA-SUME项目在2014年使用了FPGA。
已经发现软件路由器被用作对路由器进行编程的一种手段,但是却牺牲了性能。在链接速度较低但计算要求较高的情况下,它们特别有用。例如,该方法已被用于实现WiFi中的MAC层算法和无线物理层中的信号处理算法。
在开发软件路由器的同时,还开发了许多用于数据包处理的特定领域语言(DSL)。例如,单击使用C++在软件路由器上进行数据包处理。packetC和MicroengineC目标网络处理器。
4、软件定义的网络(2004年至今)
从2000年代初期开始,研究人员就主张将路由器的控制平面(运行分布式路由协议以计算其路由表的路由器部分)与路由器的数据平面(通过查看路由表的数据来转发数据包)分开。作为示例,链路状态路由协议的实现将是控制平面的一部分,而基于最长前缀的表查找的实现将是数据平面的一部分。
这种方法背后的思想,后来被称为软件定义网络(SDN),是网络运营商在管理大型网络(例如流量工程,访问控制,创建虚拟网络)时所需要的大部分灵活性。与控制平面有关,与数据平面无关。此外,与数据平面相比,控制平面执行的频率相对较低:每几毫秒一次,而不是每几纳秒一次。因此,虽然必须以硬件来实现数据平面以提高性能,但控制平面操作的相对少见的性质允许将其从路由器移出并移至商品通用处理器,在此可以更轻松地进行操作程序。
SDN还引入了集中控制的概念:通过将路由器控制平面从路由器移到通用处理器上,可以将整个网络控制平面集中在几个服务器上。这样一来,这几台服务器就可以利用全局网络可见性来计算整个网络的路由。SDN有效地用了更简单的集中图计算(例如,使用Dijkstra算法的最短路径)代替了易于出错的分布式路由计算协议。
一旦控制平面为每个路由器计算了路由,SDN还需要一种控制平面的机制来填充路由表的内容。在转发数据包时,数据平面将查询这些表。这些机制中最著名的是OpenFlowAPI,它公开了路由器硬件中路由表的最小接口。OpenFlow的目标是充当跨接口到不同路由器芯片中的路由表的最小公分母。这样一来,现有芯片就可以立即支持OpenFlowAPI。
尽管OpenFlowAPI使对网络的控制平面进行编程成为可能,但并不一定使它变得容易。因此,SDN的发展也导致了高级编程语言的发展,以对路由器的控制平面进行编程。尽管SDN在编程和验证丰富的控制平面策略方面进行了大量研究工作,但在启用数据平面中的可编程性方面却进行了很多工作。
5、网络功能虚拟化(2012年至今)
网络功能虚拟化(NFV)试图将更丰富的数据包处理功能(超出原始数据包转发功能)转移到商品通用处理器和云基础架构中。这种数据包处理功能包括深度数据包检查,负载平衡,入侵检测和WAN加速,通常统称为“中间盒”。出现了一些系统来对这种中间盒的数据和控制平面进行编程。
这种中间盒的一种常见用例是在网络的边缘(例如,在蜂窝基站处),其中,每当客户端访问因特网时,各种分组处理功能就在处理器集群上运行。由于NFV是在软件平台上执行数据包处理的,因此它也可以看作是链路速率要求相对较低的边缘上的软件路由器的实际用例。
6、基于边缘/终端主机的软件定义网络(2013年至今)
很快就清楚了,OpenFlowAPI不足以表达网络运营商的所有需求,因为它被设计为易于采用的通用最小分母API。OpenFlow缺乏表达能力,导致了基于边缘的软件定义网络方法。
通过这种方法,网络的路由器分为两类。边缘路由器位于网络的入口或边缘,并执行可编程的数据包处理。网络的核心是核心路由器,这些路由器简单地转发几乎没有可编程性的数据包。由于边缘路由器在空间上分布以服务于不同位置的客户端,因此每个边缘路由器只需要处理进出网络的总流量中的一小部分。
因此,相对于核心,边缘路由器对性能的要求要低得多,这使得它们可以在通用CPU上实现。使用通用CPU对边缘路由器进行编程可以使它们比受限的OpenFlowAPI更具可编程性。开放式虚拟交换机是边缘路由器的一个众所周知的示例。它在终端主机上的虚拟机管理程序中运行,并将单个终端主机上的多个虚拟机连接到网络。最近,边缘上不断增长的性能要求已导致在FPGA上实现此类虚拟交换机。
从逻辑上讲,边缘路由器可能是终端主机本身。因此,在讨论基于边缘的方法时,我们还包括一些近期的提案,这些提案使用最终主机来实现网络灵活性。例如,Eden通过仅对终端主机进行编程就可以使用商用路由器提供可编程数据平面。微型数据包程序(TPP)允许最终主机将小程序嵌入数据包头中,然后由路由器以类似于基于胶囊的活动网络的样式由路由器执行。TPP使用受限制的指令集来缓解活动网络的性能和安全问题。在测量和监视方面,许多系统仅从终端主机监视网络性能。
对于网络中不可用的应用程序上下文,基于边缘或基于最终主机的解决方案是必需的。例如,只有在终端主机上才能获得有关哪个应用程序使用了网络的知识(可能对监视有用)。同样,许多网络安全应用程序(例如,过滤垃圾邮件)最好在最终主机上运行,因为出于隐私原因,确定什么是垃圾邮件以及什么不是最好的信息留在最终主机上。此外,可以仅通过边缘可编程性来实现很多可编程网络功能(例如,网络虚拟化,访问控制,安全策略等)。
但是,基于边缘的方法不足以解决所有网络问题。例如,通过使用网络支持进行拥塞控制(例如,使用来自路由器的显式拥塞通知支持的DCTCP和使用来自路由器的拥塞程度的显式信息的XCP),性能有了显着提高。用于提高网络性能的许多其他最新提议依赖于网络核心内路由器的支持。与使用来自不同终端主机有利位置的网络测量结果“三角剖分”网络问题的根本原因相比,直接在网络中进行监视,网络可见性也有了显着提高。总而言之,缺少可编程网络核心会大大降低性能,并使网络调试复杂化。
有人可能会提出一种混合网络架构,该架构将基于边缘的可编程性与更智能但固定的核心路由器相结合。这样的体系结构仍然将所有可编程性置于边缘,但是通过少量固定功能扩展了核心路由器,以支持来自边缘的可编程性。这种方法的示例包括通用数据包调度和带内网络遥测,它们通过细粒度的优先级队列扩展了路由器,并且能够将队列大小信息导出到数据包中,但是保留了所有到边缘的可编程性。
如果存在一小部分功能,这些功能对于固定功能路由器就足够了,那么这种混合方法将是面向未来的通用方法。如果确实存在如此少的一组固定功能,则构建固定功能路由器而不是可编程路由器将是更好且更简单的方法。但是最近几十年来,路由器中不断增加的功能不断涌现。在这种不断变化的功能中,网络内的可编程性为网络运营商提供了未来的证明和安心:能够在需要时快速向路由器添加功能,而无需冗长的硬件迭代周期。
评论
查看更多