诞生

在传统网络中,网络控制面分散在不同设备中,数据包的传递需要经过层层包装与分解,这并不是一目了然的。传统网络架构通常使用TCP/IP协议栈,TCP/IP协议是四层协议

对于网络管理人员来说,网络具体情况如同黑匣子一样令人捉摸不透;对于开发人员来说,应用程序使用网络协议栈的底层代码都是封装在操作系统里的,重新定义的门槛很高,其成本也很高;对于网络运营商来说,每次升级设备、优化运营定价都需要对所有网络设备进行更新换代,非常不方便。传统网络的臃肿诟病已久,虽然有弹性计算、虚拟网络技术在一定程度上弥补了传统网络的缺陷,但是却大大增加了网络的复杂程度,给网络管理人员带来极大的不便。传统网络变得越来越庞大,严重缺乏灵活性,面对移动富媒体时代的海量流量已经捉襟见肘。

2008年,来自斯坦福大学的Nick McKeown等人发表了《OpenFlow: enabling innovation in campus networks》,详细介绍OpenFlow协议在校园网里的应用创新,OpenFlow通过解耦传统网络设备的数据转发层和网络控制层,极大地促进网络资源的利用率。OpenFlow的概念提出后,Nick教授及其团队进一步推广了软件定义网络的概念。参考操作系统的设计理念,SDN将整个网络抽象成一个网络操作系统,将不同的网络设备看作不同的资源,就像操作系统可以掩盖底层硬件的细节,网络操作系统也可以掩盖底层网络设备的细节,同时,还把一些常用功能封装成了统一的接口提供给上层用户。这样,开发者就可以像编写软件一样对开发网络应用,对网络资源的编排与管理变得触手可及,网络管理员即使不知道网络设备的底层细节,也能进行简单方便的网络运维操作。

下图是典型的SDN架构示意图,基础设施层主要由OpenFlow交换机等网络设备构成,中间的控制层负责网络状态管理,通过南向接口获取底层网络设备的信息,同时还为应用层的应用程序提供可扩展的、可编程的北向接口API

SDN Architecture

SDN解决了什么问题?

在某种程度上,传统互联网架构的控制平面是二层和三层控制平面的组合。SDN通过解耦控制平面与转发平面,为解决多平面的稳定性与规模问题带来新的希望。在过去的传统网络中,网络运维人员得靠升级硬件的方法来解决控制平面扩展或者处理器性能相关的问题。现在,只需要升级软件即可,网络运维变得方便快捷,这样能带来另一个一个显著的好处——降低成本。此外,传统网络的复杂性会导致网络遇到问题时无法及时恢复。

SDN decouple

SDN的一大特点是具有全局视野,即网络状态信息是逻辑集中的,这就能为网络创新与网络运维管理带来极大的灵活性。SDN控制器就是这个逻辑集中的信息管理者,一般来说,SDN控制器是一个多软件的集合,由测量模块、路由模块、转发模块等组成。SDN控制器在SDN网络中扮演着“大脑”的角色:

  1. 网络状态管理:传统网络中的网络状态信息一般存储于路由器中,比如路由表等等,而控制器通过安全通道与全网OpenFlow交换机连接通信,可以实时采集到各链路的数据,做到信息集中化管理。
  2. 安全的会话控制:控制器通过安全通道与底层网络设备建立安全的会话机制,并且对网络开发人员透明。
  3. 网络功能扩展:SDN控制器在北向接口上可以暴露API给开发者,一般使用现代化的RESTful(Representational State Transfer) 的API,从而使得网络开发人员可以根据实际业务去自定义网络功能。
  4. 设备、拓扑、服务发现机制:网络设备与控制器以标准协议(通常是OpenFlow协议)进行周期性通信,以此发现新接入的网络设备、更新网络拓扑。

传统网络的可编程性往往受到很大的局限,并且时延与收敛不可预估。比如,在传统路由器配置一条新的路由规则,首先需要给传统接口进行预编程,这一过程需要遵守路由器厂商特有的协议规范,因为路由器不知道网络拓扑,所以路由器不能即时学习,需要等真实数据包转发传递后才能验证路由规则。而SDN极大地解放了可编程性,无论是物理设备还是虚拟设备都可以很方便地配置与管理。对于网络应用开发者来说,SDN中的网络可编程性主要体现在两个方面:一个是控制器为应用程序开发者提供的北向接口,一般使用程序友好型的RESTful接口,这些接口通常使用现代方法如JSON(JavaScript Object Notation,JavaScript对象表示法)来定义。JSON是一种轻量级的数据交换格式,可轻易内嵌到各种高级编程语言中,非常符合程序员的编码习惯。二是SDN控制器大多是开源的,比如使用Python语言编写的、基于组件化的开源SDN控制器Ryu,因为代码开源,开发者可以自由修改与定制控制器本身的功能,对已有功能模块进行扩展。