|1.4 All IP 1.0的机遇:SDN与网络编程|
All IP 1.0时代存在的挑战不仅有IPv4和MPLS数据平面可扩展性和可编程能力不足,还有其他问题 [19]。
• 缺乏网络的全局视角,缺乏流量可视化功能,无法基于全局视角做出全局最优的网络决策,无法快速响应TE需求。
• 数据平面缺乏统一的抽象模型,控制平面无法基于数据平面API (Application Program Interface,应用程序接口)进行编程来支持网络新功能。
• 缺乏自动化工具,业务上线周期长。
• 设备的数据平面和控制平面紧密耦合,相互绑定销售;在演进上相互依赖,不同厂商设备的控制平面无法控制彼此的数据平面。
事实上,All IP 1.0时代的传统网络设备与20世纪60年代的IBM大型机类似,网络设备硬件、操作系统和网络应用3个部分紧密耦合在一起,组成一个封闭的系统。这3个部分相互依赖,每一部分的创新和演进都要求其余部分做出相应的升级。这样的架构阻碍了网络的创新进程 [19]。
但计算机终端的发展模式就截然不同。
计算机终端采用通用处理器,并基于通用处理器实现软件定义功能,因此计算机具有更加灵活的编程能力,使软件应用的种类出现了爆炸式的增长。此外,计算机软件的开源模式催生了大量的开源软件,加速了软件开发的进程,推动了整个计算机产业的快速发展,Linux 开源操作系统就是最好的证明。
借鉴计算机领域的通用硬件、软件定义和开源理念,美国斯坦福大学尼克·麦基翁(Nick McKeown)教授的团队提出了一个新的网络体系架构——SDN[4]。
在SDN架构中,网络的控制平面与数据平面相分离:数据平面变得更加通用化,与计算机通用硬件底层类似,不再需要实现各种网络协议的控制逻辑,只需要接收控制平面的操作指令并执行,比如OpenFlow[5]数据平面。网络设备的控制逻辑由SDN控制器和应用来定义,从而实现软件定义的网络功能。随着开源SDN控制器和开源SDN开放接口的出现,网络体系架构也拥有了通用底层硬件、支持软件定义和开源模式3个要素。从传统网络体系架构到SDN网络体系架构的演进关系如图1-6所示。
图1-6 传统网络体系架构向SDN网络体系架构的演进
SDN主要有以下3个特征 [18]。
• 网络开放可编程:SDN建立了新的网络抽象模型,为用户提供了一套完整的通用API。用户可以通过在控制器上编程,实现对网络的配置、控制和管理。
• 逻辑上的集中控制:主要是指对分布式网络状态的集中统一管理。逻辑上的集中控制为SDN提供了架构基础,也为网络自动化管理提供了可能。
• 控制平面与数据平面分离:此处的分离是指控制平面与数据平面的解耦,两者可以独立完成演进,只需遵循统一的开放接口进行通信。
符合以上3个特征的网络都可以被称为SDN。在这3个特征中,控制平面和数据平面分离为逻辑集中控制创造了条件,逻辑集中控制为网络开放可编程提供了架构基础,而网络开放可编程才是SDN的核心特征。
SDN只是一种网络架构,历史上出现过多种用于实现SDN的技术,比如OpenFlow、POF(Protocol Oblivious Forwarding,协议无关转发)[20]、P4 (Programming Protocol-independent Packet Processors,编程协议无关的包处理器)[21]和本书要介绍的Segment Routing[7]。
1. OpenFlow
2008年3月14日,尼克·麦基翁教授等提出了OpenFlow这种SDN控制平面和数据平面之间交互的通信协议。
如图1-7所示,在OpenFlow的协议架构中,OpenFlow交换机和OpenFlow控制器之间建立OpenFlow协议通道用于交互信息。控制器可以通过OpenFlow向OpenFlow交换机下发转发流表项。每一条流表项定义了一种流及其对应的转发动作,即在Match(匹配)成功的条件下,执行对应的Action(动作)来进行数据处理和转发。
图1-7 OpenFlow1.0架构
本质上,网络的转发行为就是“Match + Action”模式的查表转发,比如二层交换机通过查找目的MAC(Media Access Control,媒体访问控制)地址进行转发,三层路由器通过查找目的IP地址进行转发。OpenFlow的设计理念就是将匹配和转发动作抽象成固定的操作,然后通过控制器向交换机下发转发流表项,指导报文的转发。总体而言,OpenFlow是一种网络处理规则的抽象通用化,且支持集中编程的SDN技术。
OpenFlow支持匹配以太网、IPv4和IPv6等协议字段,也支持转发报文到指定端口、丢弃报文等动作。控制器可以基于OpenFlow协议对匹配规则进行编程,从而实现网络编程。例如,控制器向交换机A下发一条流表项,指示交换机A将目的IP地址为192.168.1.20的报文转发到出接口1。
OpenFlow的优点在于可以灵活编程转发规则,但问题也比较明显。
第一,OpenFlow的流表规格受限,导致OpenFlow交换机性能不足。OpenFlow目前更多地被部署在数据中心中,用于比较简单的数据交换,无法被部署在对流表项需求更多的环境中。
第二,OpenFlow交换机(被当作三层交换机或路由器使用)的优势在于不需要部署IGP(Interior Gateway Protocol,内部网关协议)等分布式路由协议就可以通过控制器收集的网络拓扑来完成路径计算,指导报文转发。但在实际部署中并没有运营商选择抛弃IGP等分布式路由协议,所以OpenFlow交换机上一般还需要集成IGP等协议。在这种情况下,由于IGP已经满足了基础的最短路径转发,OpenFlow的用途就只剩下对关键业务的流量调优,作用弱化了很多。所以OpenFlow交换机不仅没有简化已有的协议,还引入了OpenFlow的复杂度。
第三,OpenFlow只能在现有的转发逻辑上添加对应流表项来指导报文的转发,而无法对交换机的转发逻辑进行编程和修改。为OpenFlow添加新特性时,需要重写控制器和交换机两端的协议栈,甚至还需要重新设计交换机的芯片和其他硬件才能支持新特性。因此,每增加一个新的特性,都需要大量的开发工作,增加了支持新特性的成本。
第四,OpenFlow缺乏足够的能力去维持网络状态,所以OpenFlow交换机基本无法自主实现有状态的操作。过度依赖控制器给控制器带来了很大的压力,还带来了可扩展性和性能等方面的问题。
受限于以上问题,OpenFlow还没有被广泛部署。
2. POF
为了解决OpenFlow无法对交换机的转发逻辑进行编程和修改的问题,华为提出了POF。
POF架构与OpenFlow相似,可以分为控制平面的POF控制器和数据平面的POF转发元件两部分。在POF架构中,POF交换机并没有协议的概念,它仅在POF控制器的指导下通过{offset,length}来定位数据、匹配并执行对应的操作,从而完成数据处理。这种方式使得交换机可以在处理网络数据时不感知网络协议,在支持新协议时,也不需要对交换机的数据平面进行升级,仅升级控制平面即可。总体而言,POF是对网络处理流程完全抽象通用化(也即协议无关)、支持对转发逻辑和转发规则完全编程的SDN技术。图1-8展示了POF硬件交换机和POF软件交换机的架构。
图1-8 POF硬件交换机(左)和POF软件交换机(右)的架构
由于POF支持协议无关的转发,所以可以部署在任意的网络中,包括一些非以太网网络,例如NDN(Named Data Network,命名数据网络)和CCN (Content-Centric Network,以内容为中心的网络)这两种未来网络。此外, POF交换机支持状态机特性,可以实现更多的智能功能,可在网络安全等领域有所作为。
但与OpenFlow相比较,POF的控制流程就要复杂得多,为了实现POF,还需要定义一套通用指令集,实现复杂的指令调度,这也给转发性能带来了一定的影响。因此POF在商业上并没有太好的进展。
3. P4
面对OpenFlow存在的可编程能力不足的问题,除了华为提出的POF以外,尼克·麦基翁和珍妮弗·雷克斯福德(Jennifer Rexford)教授等人提出了P4 [21]。P4是一种高级编程语言,它定义了一系列的语法,支持对转发模型的协议解析过程和转发过程进行编程定义,实现了协议无关的可编程网络数据平面。
通过P4编程定义报文头格式、解析器、表项、动作和控制程序 [21]等组件实现对设备报文处理流程的编程,可以做到转发无中断的重配置,满足网络新业务对网络设备可编程的需求。一个P4程序可以应用到如图1-9所示的通用抽象转发模型中。
图1-9 通用抽象转发模型
P4支持对交换机转发处理逻辑进行编程定义,不需要购买新设备即可支持新特性,只需通过控制器编程并更新交换机的处理逻辑。这种创新解决了OpenFlow可编程能力不足的问题。此外,由于P4可以编程定义交换机处理逻辑,使得交换机可以转发任意协议,底层交换机更加通用化,适用范围更广,所以更容易降低设备采购成本。总体而言,P4是对网络处理流程完全抽象通用化(即协议无关)、支持对转发逻辑和转发规则完全编程的SDN技术,包含对应的编程语言及对应的转发平面等组件。
虽然P4在创新上具有一定的技术优势,可以满足网络创新的需求,但是在商业部署上,却进展不佳。一方面,网络的演进速度并不快,在很大的程度上,增加一个网络特性不是一家设备商的事情,它需要运营商和设备商等共同参与,由整个行业共同推动、共同制定标准来实现。这个标准的制定周期相对较长,所以在漫长的标准制定过程中,P4快速支持网络编程的能力就显得不那么重要了。另一方面,完全集中式的SDN在可靠性和响应速度等方面存在问题,且对控制器要求过高。而实际上现网并不需要通过推翻分布式路由协议架构来完全重新构建连接,而是需要在现有分布智能互联的基础上,提供增强的集中式全局优化的能力,实现全局优化和分布智能的结合。2019年6月11日,以P4商业化为主营业务的创业公司Barefoot被英特尔公司收购,截至目前, P4也没能被大规模商用。
4. Segment Routing
回顾OpenFlow、POF和P4等技术,其初衷都是为网络提供可编程能力。但为了实现网络可编程就必须要进行革命性的创新吗?答案是否定的。
2013年,由思科公司提出的Segment Routing协议就是在已有网络的基础上进行演进式的扩展,提供了网络编程能力。Segment Routing是一种源路由协议,支持在路径的起始点向报文中插入转发操作指令来指导报文在网络中的转发,从而支持网络可编程。Segment Routing的核心思想是将报文转发路径切割为不同的分段,并在路径的起始点往报文中插入分段信息指导报文转发。这样的路径分段被称为“Segment”,并通过SID(Segment Identifier,段标识符)来标识。目前Segment Routing支持MPLS和IPv6两种数据平面,基于MPLS数据平面的Segment Routing被称为SR-MPLS,其SID为MPLS标签;基于IPv6数据平面的Segment Routing被称为SRv6,其SID为IPv6地址。
Segment Routing的设计理念在现实生活中也屡见不鲜,如乘坐火车、飞机出行。下面举一个例子,来进一步解释Segment Routing的原理。
假设从海口到伦敦的飞机需要在广州和北京进行两次中转,飞行路线变为3段:海口→广州、广州→北京和北京→伦敦。我们只需要在海口买好从海口到广州、广州到北京、北京到伦敦的3张票,就可以从海口一站一站地中转飞到伦敦。
在海口,我们要乘坐HU7009航班飞往广州;当飞达广州时,根据机票,乘坐HU7808航班飞往北京;到了北京,再根据机票乘坐CA937航班飞往伦敦。就这样,我们靠着在海口拿到的3张机票,顺利换乘飞机逐段飞到了伦敦。
报文在Segment Routing网络中的转发过程也是类似的。如图1-10所示,报文从节点A进入Segment Routing网络,节点A经过匹配目的地址,知道报文需要经过节点B和节点C到达节点D,所以将节点B、节点C和节点D对应的SID插入报文头中,用于指导报文转发。节点B和节点C根据报文头中的SID信息,将报文一步步地转发到指定的目的节点D。
图1-10 Segment Routing示例
相比于RSVP-TE MPLS,SR-MPLS具有如下优势。
• 简化了控制平面。SR-MPLS不需要RSVP-TE等信令协议,只需对IGP(Interior Gateway Protocol,内部网关协议)和BGP(Border Gateway Protocol,边界网关协议)等协议进行扩展即可。
• 简化了网络的状态。在RSVP-TE MPLS网络中,中间节点需要为每个数据流维持转发状态。而在SR-MPLS网络中,仅需要在头节点维持逐流的转发状态,在中间节点和尾节点不需要维持逐流的转发状态。
在互通方面,由于SR-MPLS未对MPLS数据封装做任何修改,所以在数据平面可以很容易地与传统的MPLS网络互通。相比于OpenFlow等革命性的协议,SR-MPLS考虑了对现网的兼容,支持平滑演进,同时也提供了网络编程的能力。这种演进式的创新更容易得到业界的认可,也更容易落地。此外, Segment Routing保留了网络的分布式智能,并在此基础上引入SDN控制器的全局优化能力,结合了分布智能和全局最优的优势,因此应用的实际落地更具可操作性,也更有生命力。时至今日,Segment Routing已经成为事实上的SDN标准。
虽然基于MPLS数据平面的SR-MPLS可以提供很好的可编程能力,但是其受限于MPLS封装可扩展性不足等问题,无法很好地满足SFC和IOAM等一些需要携带元数据的业务的需求。而基于IPv6数据平面的SRv6不仅继承了SR-MPLS网络的所有优点,还拥有比SR-MPLS更好的可扩展性。