文章目录
- 一、介绍
- 1、简介
- 2、原理
- 3、案例
- 1)普通
- 2)负载均衡的例子
- 3)防火墙的例子
- 二、控制层面
- 1、特征
- 2、层次
一、介绍
1、简介
SDN的概念最初由斯坦福大学N.McKeown于2009年首先提出。当时还只是在学术界进行探讨的一种新的网络体系结构。但随后几年发展很快,不少企业相继采用。其中最成功的案例就是谷歌建于2010~2012年的数据中心网络B4。几年来网络B4运行的结果证明,基于SDN的专用广域网确实可以大大提高网络带宽利用率,网络运行更加稳定,管理更加高效简化,运行费用也明显降低了。目前,SDN已经引起人们的密切关注。
在 SDN 中,数据层面中的交换机是由控制层面进行控制的,下图表明这种控制是通过协议OpenFlow来实现的。。协议penFlow 是一个得到高度认可的标准,在讨论 SDN 时往往与 OpenFlow 一起讨论。因此,有人会误认为SDN就是 OpenFlow。其实这二者有着很大的区别。SDN不是协议,更不是一种产品。
SDN是一个体系结构,是一种设计、构建和管理网络的新方法或新概念,其要点就是把网络的控制层面和数据层面分离,而让控制层面利用软件来控制数据层面中的许多设备。
可以把协议penFow看成是在SDN体系结构中控制层面和数据层面之间的通信接口,它使得控制层面的控制器可以对数据层面中的物理设备或虚拟设备,进行直接访问和操纵。
这种控制在逻辑上是集中式的,是基于流的控制。
但请注意,SDN并未规定必须使用OpenFlow,只不过是大部分SDN 的产品采用了OpenFlow 作为其控制层面与数据层面的接口。
传统意义上的数据层面的任务就是根据转发表来转发分组。可以再把“转发”细分一下。实际上这里有两个步骤。第一个步骤是“匹配”,即查找转发表中的网络前缀,进行最长前缀匹配。第二个步骤是“动作”,即把分组从指明的接口转发出去。这种“匹配+动作”的转发方式在SDN 中得到了扩充,增加了新的内容,变成了广义的转发。这种广义的转发使得“匹配+动作”有了新的内容。
在 SDN 的广义转发中,“匹配”能够对不同层次(链路层、网络层、运输层)的首部中的字段进行匹配,而“动作”则不仅是转发分组,而且可以把具有同样目的地址的分组从不同的接口转发出去(为了负载均衡)。还可以重写IP首部(如同在NAT路由器中的地址转换),或者可以人为地阻挡或丢弃一些分组(如同在防火墙中一样)。请注意这里为了讨论问题的方便,在讨论SDN的问题时,不管在哪一层传送的数据单元,都称为分组。
这样,在SDN 的广义转发中,这种完成“匹配+动作”的设备,就不应当称为路由器了,而是叫作“分组交换机”或“OpenFlow 交换机”,或更简单些就称为“交换机”。这种交换机并不局限在网络层工作(例如,可使用L2/L3 交换机)。在SDN中,取代传统转发表的是“流表”(flow table)。因此,流表就是“匹配+动作”的转发表。
2、原理
下图强调了一个重要概念:OpenFlow 交换机中的流表是由远程控制器来管理的,而远程控制器通过一个安全信道(见7.6.2节),使用OpenFlow协议来管理 OpenFlow 交换机中的流表。这样,OpenFlow 就有了双重意义。一方面,OpenFlow是SDN远程控制器与网络设备之间的通信协议;另一方面,OpenFlow又是网络交换功能的逻辑结构的规约。我们还应注意到,尽管网络设备可以由不同厂商来生产,同时也可以使用在不同类型的网络中,但从SDN远程控制器看到的,则是统一的逻辑交换功能。
我们在之前介绍IPv6首部的流标号时,曾初步地提到“流”的概念。在 OpenFlow的各种文档中都没有“流”的定义。其实从OpenFlow交换机的角度来看,一个流就是穿过网络的一种分组序列,而在此序列中的分组都共享分组首部某些字段的值。例如,某个流可以是具有相同源卫P地址和目的地址的所有分组。
下图给出了OpenFlow 10版本的流表和分组的首部匹配字段(这是最简单的一个版本,便于用来讲解工作原理)[KURO17]。每个OpenFlow交换机必须有一个或一个以上的流表。每一个流表可以包括很多行,即多个流表项(low entry),它包括三个字段,即首部字段值(又称为匹配字段)、计数器和动作。下面解释这三个字段的意思。
- 首部字段值:这是一组字段,用来使入分组(incoming packet)的对应首部与之相匹配,因此又称为匹配字段。匹配不上的分组就被丢弃,或发送到远程控制器做更多的处理。上图所示的匹配字段有 11个项日涉及三个层次的首部。这就是说,OpenFlow 的匹配抽象与我们以前讲过的分层的原则明显不同。在 OpenFlow 交换机中,既可以处理链路层的帧,也可以处理网络层的IP分组和运输层的报文。
- 计数器:这是一组计数器,可包括已经与该表项匹配的分组数量,以及从该表项上次更新到现在经历的时间。
- 动作:这是一组动作,例如,当分组匹配某个流表项时把分组转发到指明的端口,或丢弃该分组,或把分组进行复制后再从多个端口转发出去,或重写分组的首部字段(第二、三和四层的首部字段)。
3、案例
1)普通
为了更好地理解流表的匹配与动作,我们讨论下面几个例子。下图给出的简单网络有6台主机(H1~H6),其IP地址标注在主机旁边,还有3台分组交换机(S1~S3)。每台交换机有4个端口(即接口,编号为1至4)。还有1台OpenFlow 控制器来控制这些分组交换机的“匹配+动作”。
我们设定的转发规则是:来自H5或H6发往H3或H4的分组。都先从S3转发到S1,然后再从 S1转发到 S2,但不通过 S3到S2的链路。根据这个转发规则,可以得出交换机S3的流表项是:
这里使用了通配符*。例如,地址 10.3.*.*,表明这样的地址将匹配前16位为10.3 的任何地址。“转发(3)”表明分组转发出去端口是交换机编号为3的端口。
交换机S1的流表项(这里和后面都省略了计数器字段)是:
和 S,的流表项相比,这里多了“入端口 =1”。表明“匹配”仅限于从编号1的端口进入交换机S1的分组。
交换机S2的流表项是:
2)负载均衡的例子
3)防火墙的例子
虽然上面举出的例子非常简单,但已经可以看出这种广义转发的多样性和灵活性。广义转发的优点是显而易见的。
二、控制层面
1、特征
从下图可以反映出 SDN 体系结构的四个关键特征:
- 基于流的转发。SDN 控制的交换机分布在数据层面中,而分组的转发可以基于网络层运输层和链路层协议数据单元中的首部字段值进行。这和传统的路由器仅仅根据IP分组的目的地址进行转发,有着很大的区别。SDN的转发规则都精确规定在交换机中的流表中。所有交换机中的流表项,都是由SDN 控制器进行计算、管理和安装的。
- 数据层面与控制层面分离。在许多英语文献中常使用“decouple”一词,相应的中文就是“去耦”。在传统的转发设备路由器中,其数据层面与控制层面都处在同一个设备中,因此二者耦合得非常紧密。但在SDN 中,则把这两个层面去耦合,使二者不在同一个设备中。这点在图 4-73中看得很清楚。数据层面有许多相对简单但快速的网络交换机。这些交换机在其流表中执行“匹配+动作”的规则。而控制层面则由若干服务器和相应的软件组成,这些服务器和软件决定并管理这些交换机中的流表。
- 位于数据层面交换机之外的网络控制功能。SDN 中的控制层面是用软件实现的,而且软件是处在不同的机器上,并且可能还远离这些网络交换机。从下图可以看出,SDN 控制层面包含两个构件,一个是SDN控制器(也就是网络操作系统),另一个由若干个网络控制应用程序组成。SDN 控制器维护准确的网络状态信息(例如,远程链路、交换机和主机的状态),把这些信息提供给运行在控制层面的各种控制应用程序,以及提供一些方法,使得这些应用程序能够对底层的许多网络设备进行监视、编程和控制。需要注意的是,在下图的SDN 控制器中只画了一个服务器,但这只是强调在逻辑上是集中控制的。实际上,在控制层面中总是使用多个分散的服务器协调地工作,以便实现可扩展性和高可用性。
- 可编程的网络。通过在控制层面的一些网络控制应用程序,使整个网络成为可编程的。这些应用程序相当于 SDN 控制层面中的“大脑”,SDN 控制器使用这些应用程序,在这些网络设备中指明和控制数据层面。例如,路由选择网络控制应用程序能够确定在源点和终点之间的端到端路径(这需要执行某种算法,也需要使用由SDN 控制器维护的节点状态和链路状态信息)。网络应用程序还可以进行接入控制,即决定哪些分组在进入某个交换机时就必须被阻挡住。此外,网络应用程序在转发分组时还可以执行负载均衡的措施。
2、层次
从以上的简单例子可以看出,SDN 把网络的许多功能都分散开了。数据层面的交换机SDN 控制器以及许多网络控制应用程序,这些都可以是分开的实体,并且可以由不同的厂商和机构来提供。这就和传统网络截然不同。在传统网络中,路由器或交换机是由单独的厂商提供的,其控制层面和数据层面以及协议的实现,都是垂直集成在一个机器里面的。目前出现的这种变化,有点像当初计算机的演变。早期的大型计算机,从硬件到软件以及应用程序,都是由一个单独的厂家生产完成的。但后来演变到现在的个人电脑,其硬件机身、操作系统以及上层的应用程序,可以由多个厂家分别生产和提供,这样的系统就变得更加开放,其功能也更加丰富了。SDN 也可能有这样的发展结果。
下图还给出了 SDN 控制器和下面数据层面的受控设备的通信接口,即南向API,以及 SDN 控制器和上面网络控制应用程序的接口,即北向API。SDN 控制器是最复杂的,它还可以划分为如下图所示的三个层次。
最下面的一层是通信层,其任务是完成SDN 控制器与受控的网络设备之间的通信。显然,要完成这样的通信,我们必须有一个协议,用来在SDN控制器与这些设备之间传送信息。此外,这些设备还必须能够向SDN控制器传送在本地观察到的事件(例如,用一个报文指示某条链路正常工作或出了故障断开了,或指示某个设备刚刚接入到网络中,或者某种信号突然出现可以表示某个设备已加电并可以工作)。这样就可保证 SDN 控制器掌握了网络状态的最新视图。在通信层的协议有前面已经提到过的OpenFlow,以及后面在第6章应用层要学习的协议 SNMP,等等。通信层与数据层面的接口叫作南向API接口。现有用SDN控制器概念制作的商品基本上(当然不是全部)都是采用协议openFlow。
在中间的一层是网络范围的状态管理层。SDN 控制层面若要做出任何最终的控制决定(例如,在所有的交换机中配置流表以便进行端到端的转发,或实现负载均衡,或实现某种特殊的防火墙能力),就需要让控制器掌握全网的主机、链路、交换机,以及其他受SDN 控制的设备。交换机的流表中包含有计数器,而网络应用程序需要使用这些计数器的值。因此这些计数器的值对网络应用程序来说也必须是可用的。由于控制层面的最终目的是确定各种被控设备的流表,因此控制器还需要维护这些流表的副本。所有上述这些信息构成由SDN控制器维护的网络范围状态。
最上面一层是到网络控制应用程序层的接口。SDN控制器与网络控制应用程序的交都要通过北接口。这个API接口允许网络控制应用程序对状态管理层里面的网络状态和流表进行读写操作。网络控制应用程序事先已进行了注册。当状态变化的事件出现时,网络控制应用程序把得到的网络事件进行通告,并采取相应的动作,例如,计算新的最低开销的路径。这一层可以提供不同类型的API。例如,REST风格的API目前使用得较多。图中的REST (REpresentational State Transfer)即表述性状态传递,是一种针对网络应用的设计和开发方法[W-REST]。图中的Intent 是对要进行的操作的一种抽象描述[W-INTENT],可用它在组件之间传递数据。
目前已经出现了一些开放源代码控制器,或简称为开源控制器(Open Source Controller),最有代表性的就是 OpenDaylight和ONOS。这里就不再进行讨论了。