一、SDN概述
1.1 SDN概念
SDN是一种将网络控制功能与转发功能分离、实现控制可编程的新兴网络架构。这种架构将从控制层从网络设备转移到外部计算设备,使得底层的基础设施对于应用和网络服务而言是透明的、抽象的,网络可被视为一个逻辑的或虚拟的实体。
1.2 SDN产生的原因
- 传统网络及其设备的只可配置、不可编程
- 网络的分布式控制与管理架构带来的制约
二、SDN架构
2.1 SDN的基本架构
SDN采用了集中式的控制平面和分布式的转发平面,两个平面相互分离,控制平面利用控制—转发通信接口对转发平面上的网络设备进行集中式控制,并提供灵活的可编程能力,具备以上特点的网络架构都可以被认为是一种广义的SDN。
在 SDN 架构中,控制平面通过控制—转发通信接口对网络设备进行集中控制,这部分控制信令的流量发生在控制器与网络设备之间,独立于终端间通信产生的数据流量,网络设备通过接收控制信令生成转发表,并据此决定数据流量的处理,不再需要使用复杂的分布式网络协议来进行数据转发,如下图所示。
SDN 并不是某一种具体的网络协议,而是一种网络体系框架,这种框架中可以包含多种接口协议。如使用OpenFlow等南向接口协议实现SDN 控制器与 SDN 交换机的交互,使用北向 API实现业务应用与 SDN 控制器的交互。这样就使得基于SDN的网络架构更加系统化,具备更好的感知与管控能力,从而推动网络向新的方向发展。
2.2 ONF定义的SDN架构
ONF定义的架构共由四个平面组成,即数据平面、控制平面、应用平面以及右侧的控制管理平面。各平面之间使用不同的接口协议进行交互。
1. 数据平面
由若干王元组成,每个网元可以包含一个或多个SDN Datapath。每个SDN Datapath是一个逻辑上的网络设备,它没有控制能力,只是单纯用来转发和处理数据,它在逻辑上代表全部或部分的物理资源。一个SDN Datapath包含控制数据平面接口代理、转发引擎表和处理功能三部分。
2. 控制平面
即所谓的SDN控制器。SDN控制器是一个逻辑上集中的实体,它主要负责两个任务,一是将SDN应用层请求转换到SDN Datapath,二是为SDN应用提供底层网络的抽象模型(可以是状态、事件)。一个SDN控制器包含北向接口代理、SDN控制逻辑以及控制数据平面接口驱动三部分。SDN控制器只是要求逻辑上完整,因此它可以由多个控制器实例组成,也可以是层级式的控制器集群;从地理位置上讲,既可以是所有控制器实例在同一位置,也可以是多个实例分散在不同的位置。
3. 应用平面
由若干SDN应用组成,SDN应用时用户关注的应用程序。它可以通过北向接口与SDN控制器进行交互,即这些应用能够通过可编程方式把需要请求的网络行为提交给控制器。一个SDN应用可以包含多个北向接口驱动(使用多种不同的北向API),同时SDN应用也可以对本身的功能进行抽象、封装来对外提供北向代理接口,封装后的接口就形成了更为高级的北向接口。
4. 管理平面
负责一系列静态的工作,这些工作比较适合在应用、控制、数据平面外实现,比如对网元进行配置、指定SDN Datapath的控制器,同时负责定义SDN控制器以及SDN应用能控制的范围。
5. SDN控制数据平面接口(CDPI)
SDN CDPI是控制平面和数据平面之间的接口,它提供的主要功能包括:对所有的转发行为进行控制、设备性能查询、统计报告、事件通知。SDN一个很重要的价值就体现在CDPI的实现上,它应该是一个开放的、与厂商无关的接口。
6. SDN北向接口(NBI)
SDN NBI是应用平面和控制平面之间的一系列接口。它主要负责提供抽象的网络视图,并使应用能直接控制网络的行为,其中包含从不同层对网络及功能进行的抽象,这个接口也应该是一个开放的、与厂商无关的接口。
三、SDN的核心概念
3.1 数据控制分离以实现逻辑集中式控制
从功能实现来说,控制平面的主要功能是建立本地的数据集合,该数据集合一般被称为路由信息库(RIB),RIB需要与网内其他控制平面实例的信息保持一致,这一点通常使用分布式路由协议(如 OSPF)来完成。接下来,控制平面需要基于RIB创建转发表,用于指导设备出入端口之间的数据流量转发。转发表通常被称为转发信息库(FIB), FIB 需要经常在设备的控制和数据平面之间进行镜像,以保证转发行为与路由决策一致,因此,FIB实际上是两个平面之间连接的纽带。数据平面的主要功能是,根据RIB创建的FIB进行数据的高速转发。另外,数据平面还可以根据需要处理一些其他的服务功能,如较短的事件侦测时间等,这是因为某些服务有非常严格的性能需求,需要放在数据平面以保证快速执行。
3.2 网络可编程以实现灵活可定义
网络可编程性最初是指网络管理人员可以通过命令行对设备进行配置,后来有了可编程路由器、NetFPGA等设备,这些设备的可编程性主要是对设备本身硬件电路级的可编程,即开发人员是通过编译代码直接控制这些硬件来实现自己的协议或者功能。这种可编程的能力是对某台设备而言的,是一种处于最底层的编程能力,相当于计算机中汇编等级的低级编程语言,不够灵活便捷。然而,SDN的网络可编程性是从另外一个角度来看的,传统网络设备需要通过命令行或者直接基于硬件的编译写入来对网络设备进行编程管理,现在管理者希望有更为高级的编程方式,相当于与Java等高级语言。管理者可以通过SDN中这种高级的编程能力实现与网络设备的双向交互,通过软件更加方便灵活地管理网络。这种可编程性是基于整个网络的,而不是基于某台设备的。它是对网络整体功能的抽象,使程序能通过这种抽象来为网络添加新的功能。例如,管理人员可能希望编写一个软件,这个软件能够根据实时的链路负载情况自动配置路由器的转发策略,这就是对网络设备编程能力的一种需求。SDN很好地满足了这种需求,并体现了网络的可编程性。