一、SDN 重构网络
1.1 SDN 是什么
SDN 的三个特征:
- 网络开放可编程
- 控制平面与数据平面的分离
- 逻辑上的集中控制
只要符合以上三个特征的网络都可以称之为软件定义网络。
控制平面和数据平面的分离为逻辑集中控制创造了条件,逻辑集中控制为开放可编程控制提供了架构基础,而网络开放可编程才是 SDN 的核心特征。
SDN 包括五部分:
- SDN 网络应用:实现对应的网络功能应用。这些应用通过调用北向接口,实现对网络数据平面的配置,管理和控制。
- 北向接口:是 SDN 控制器和网络应用之间的开放接口,将数据平面和状态信息抽象成统一的开放编程接口。
- SDN 控制器:也称为网络操作系统。通过北向接口对上层的网络应用提供不同层次的编程能力,还通过南向接口对 SDN 数据平面进行统一配置,管理和控制。
- 南向接口:是 SDN 控制器和数据平面之间的开放接口。SDN 控制器通过南向接口对数据平面进行编程控制,实现数据平面的转发等网络行为。
- SDN 数据平面:包括基于软件实现的和基于硬件实现的数据平面设备。接收南向接口的指令并完成特定的网络数据处理,同时还可以通过南向接口给控制器反馈网络配置和运行时的状态信息。
南向接口相当于汇编语言;北向接口相当于高级编程语言。控制器相当于编译器或 IDE,数据平面相当于操作系统。
1.2 为什么需要 SDN
我们需要拥有更多可编程能力的网络,来支持快速增长的网络业务需求。
传统网络设备:网络设备硬件+操作系统+网络应用三部分紧密耦合成一个封闭的系统,三部分相互依赖,需要同步升级,阻碍了网络创新进程的开展。而计算机产业:通用硬件底层+软件定义功能+开源模式,获得了更快的创新速度。如果网络设备采用同等架构,势必取得计算机产业那样的空前发展。其中数据平面相当于通用硬件,SDN 控制器相当于操作系统,基于开发 SDN 应用,从而形成了类似计算机架构的 SDN 体系架构。
“为了让系统更好地工作,早期需要管理复杂性而后期需要提取简单性”,现在网络架构仍处于
管理复杂性
的阶段,SDN 将使其迈向提取简单性
。以计算机软件为例,早期程序员需要处理所有的底层硬件细节,编程处于管理复杂性
的阶段,而高级编程语言对底层的硬件细节进行了抽象,使得编程完成了到提取简单性
的转变。
1.3 网络可编程探索之路
通过人工配置网络的方式显然无法满足业务发展的要求,网络还需要更多的可编程能力,从而实现快速的自动化业务部署,满足当下日新月异的网络新需求。
数控分离的好处:
- 控制平面和数据平面不再相互依赖,双方只需要遵循统一的开放接口,就可以独立完成体系结构的演进;
- 控制平面可以建立更高级别的抽象编程模型,可以摆脱传统网络控制平面的堆砌方式,摆脱了多解决一个问题就需要多一个网络协议的尴尬;
- 数据平面可以更加通用化,实现网络数据平面功能的软件定义,从而为用户提供更多的网络可编程能力。
数控分离是实现网络完全开放可编程的前提。而对开放接口的抽象,就相当于从汇编语言到高级编程语言的华丽转变。
OpenFlow 的出现,打开了传统网络设备这个相对封闭的黑盒子,标志着控制平面与数据平面分离的真正实现。
1.4 SDN 重构网络
用户对网络可编程能力的持续追求,促使了 SDN 的诞生,而 SDN 也反过来大大地促进了网络可编程的发展,极大地提升了网络可编程能力。
二、南向协议
在 SDN 架构中,网络的控制平面和数据平面相互分离,并通过南向协议进行通信,使得逻辑集中的控制器可以对分布式的数据平面进行编程控制。南向协议提供的可编程能力是当下 SDN 可编程能力的决定因素。
- 狭义南向协议:指导数据平面设备的转发操作等网络行为。
- 完全可编程协议:可以实现对数据平面协议解析过程和数据处理过程两部分的软件定义,拥有数据平面编程能力,支持协议无关的转发。
- 广义南向协议:
- 仅具有对数据平面配置能力。
- 具有部分可编程能力。
- 独立于 SDN 存在,不限于应用在 SDN 控制平面和数据平面之间传输控制信令的协议。
2.1 狭义南向协议(OpenFlow)
OpenFlow 结构:
- 流表:存放流表项。匹配到同一条流表项的数据包被称为数据流。
- 安全通道:流表和控制器通信的安全连接。
- 控制器:下发流表项来指导交换机处理匹配流表项的数据包。
- 组表:定义一组可以被多条流表项共同使用的动作,从而实现组播、负载均衡、容灾备份和聚合等功能。
- Meter 表:面向流的计量和限速。
OpenFlow 通道中转发的三种消息/报文:
- Controller-to-switch:由控制器初始化并下发给交换机的报文类型,其可能会要求交换机回复对应的报文。
- Asynchronous:由交换机异步发送给控制器的报文,用于告知数据包的达到和交换机状态的改变,无须等待控制器请求。
- Symmetric:由控制器和交换机任意一方发送,无须得到对方许可或者邀请。
OpenFlow 通信流程
- 交换机和控制器建立 Socket 通信,相互发送 Hello 报文。
- 控制器下发 Features Request 报文,交换机回复 Features Replay 报文;控制器根据交换机支持的特性,完成交换机的配置后,进入正常通信状态。
- 当数据包匹配流表项失败或者匹配到 Table-Miss 时,交换机将其 Packet-in 到控制器,控制器可以选择回复 Packet-out 或者下发 Flow-mod 指导交换机处理数据流。
- 如果配置了 Flow-Removed 标志位,当流表项过期时,会回复 Flow-Removed 报文通知控制器。
- 控制器周期向交换机发送 Echo 报文,以保持连接的活性。
OpenFlow 并不是部署 SDN 必需的协议,但是在短期内,尚未出现一种可以和 OpenFlow 竞争的南向协议。
2.2 广义南向协议
2.2.1 OF-Config(OpenFlow Management and Configuration Protocol)
OF-Config:交换机配置协议。在交换机正常工作之前,配置其功能、特性和资源。
OpenFlow 协议是控制器知道交换机进行数据转发的协议;而 OF-Config 协议是 OpenFlow 的补充,用于对交换机的资源进行配置(例如将某个交换机连接到指定的 OpenFlow 控制器)。两个协议也有重叠的功能。
2.2.2 OVSDB(The Open vSwitch Database Management Protocol)
JSON 数据编码,RPC 配置。
OVSDB:用于 Open vSwitch 的管理和配置协议。
OF-Config 可以用于所有支持 OpenFlow 的软件或硬件的交换机,OVSDB 仅用于 OVS 的配置和管理。
OVS 作为虚拟机和 Docker 与物理网络通信的关键节点十分重要,OVSDB 可以快速配置 OVS。
2.2.3 NETCONF
XML 数据编码,RPC 配置。
SNMP 在网络配置方面能力较差,所以在实际中常用于网络监控而非网络配置。NETCONF 是基于 XML 的网络配置和管理协议,在网络配置方面十分高效。
NETCONF 和 OF-Config、OVSDB 一样,只能进行网络设备的配置,无法指导交换机进行数据转发处理。传统的交换机使用 NETCONF 进行配置后即可开始工作,对于 SDN 设备,还需要 OpenFlow 等协议来指导交换机的数据交换等功能。
2.2.4 OpFlex
XML 或 JSON 数据编码,RPC 配置。
- OpFlex 是声明式控制协议:只通知对象要达到一种要求的状态,但是并没有规定其通过制定的方式去达到这个状态。(可编程能力不强,还是依赖于数据平面的完善控制能力)
- OpenFlow 是命令式控制协议:需要精确地告知交换机具体的动作,才能完成数据的处理。
2.2.4 XMPP(Extensible Messaging and Presence Protocol)
XML 数据编码
XMPP 最大的有点就是可以统一管理传统设备和 SDN 设备。但是功能不如 OpenFlow,也不是专门为 SDN 设计的协议。
2.2.6 PCEP(Path Computation Element Communication Protocol)
PCEP 没有使得数据平面和控制平面完全分离,但是把路径计算的控制逻辑从转发设备中抽离到远端,实现了部分数据平面和控制平面的分离。通过远端服务器的软件编程,可以指导底层路由或转发设备实现数据的转发和路由。OpenFlow 和 PCEP 协议结合使用可以实现 OpenFlow 网络和传统网络的统一管理和调度(例:华为和腾讯共同完成的腾讯数据中心互联方案)。
可编程能力不完善,常为流量工程(Traffic Engineering)提供路径计算服务,也并非专为 SDN 设计。
2.3 完全可编程南向协议
2.3.1 POF(Protocol Oblivious Forwarding,华为)
在 POF 架构中,POF 交换机并没有协议的概念,仅在 POF 控制器的指导下通过{offset,length}
来定位数据、匹配并执行对应的操作,从而完成数据处理。此举使得交换机可以在不关心网络协议的情况下完成网络数据的处理,使得在支持新协议时无须对交换机进行升级,仅需升级控制平面即可,大大加快了网络创新的进程。
基于 OpenFlow 实现的 SDN 有两个不足:
- OpenFlow 依然只能在现有支持的转发逻辑上添加对应流表项来指导数据包的转发,而无法对交换机的转发逻辑进行编程和修改。
- OpenFlow 基本是无状态的,其无法维护网络状态并主动做出动作。
协议的操作无非就是增加、修改和删除对应的字段/标签,这些操作可以通过通用的指令集来实现。因此在支持新字段或新协议时,只需在控制器端添加对应的协议处理逻辑即可,交换机无须做任何修改,所以网络设备能轻易地支持新字段或协议,从而大大加速了网络创新的进度。
控制器正如 PC 中的操作系统,为上层业务提供丰富的业务接口,调用下层提供的通用指令集,并完成两者的翻译工作。
针对 OpenFlow 无状态的缺陷,POF 设计了相关指令使得 POF 交换机可以维护简单的状态机。然而状态机的维护需要付出一些性能或者成本代价。
POF 支持协议无关转发,可以部署在非以太网络和其他未来网络架构。
为了实现 POF,还需要定义一套通用指令集,实现复杂的指令调度。性能不足是一个问题,但是性能问题总是可以通过不断地优化和产品迭代来解决,所以设计一个结构良好的雏形才是最重要的。
2.3.2 P4(Programming protocol-independent packet processors,Nick)
P4 是"协议无关数据包处理编程语言",支持对 P4 转发模型的协议解析过程和转发过程进行编程定义,实现了真正意义上的协议无关可编程网络数据平面。P4 是数据平面编程语言。
与 OpenFlow 不同的是,P4 关注的是另外一种网络需求:数据平面的可编程。
OpenFlow 的缺点:OpenFlow 只能在已经固化的交换机数据处理逻辑之上,通过流表项指导数据流处理,而无法重新定义交换机处理数据的逻辑,从而灵活支持新协议。
P4 的优点:
- 可灵活定义转发设备数据处理流程,且可做到转发无中断的重配置。具有对交换机的协议解析流程和数据处理流程进行编程的能力。
- 转发设备进行协议无关的转发。通过软件来定义交换机支持的协议功能,包括数据包的解析流程、匹配需要的表、需要执行的动作列表等内容。在完成协议处理逻辑定义后,P4 支持下发对应的匹配和动作表项去指导交换机进行数据的处理和转发。
- 设备无关性。使用 P4 进行网络编程无须关心底层设备的具体信息,P4 的编译器会将通用的 P4 语言处理逻辑编译成设备相关的指令并写入转发设备。
P4 抽象转发模型:
- 数据包解析:
- 定义数据报文格式,以及不同协议之间的跳转关系
- 编译写入流程:将网络字节流解析为对应的协议报文,并将报文送到接下来的控制流程中进行匹配和处理。
- 数据包转发:
- 存储转发规则的匹配表的定义及转发表之间的依赖关系
- 编译写入流程:
- 将 P4 程序编译,生成设备无关的 TDG(Table Dependency Graph)。
- 根据特定的底层转发设备的资源和能力,将 TDG 映射到转发设备的资源上。
2.4 SDN 南向协议标准之战
一流企业做标准,二流企业做服务,三流企业做产品。
- OpenFlow:第一个 SDN 南向协议标准
- OpFlex:和 OpenFlow 竞争
- NETCONF:OpenFlow 的补充,用于配置交换机的协议。在传统交换机和 OpenFlow 交换机中都可以支持。
- OF-Config:OpenFlow 的补充,用于配置交换机的协议。可以配置支持 OpenFlow 的物理交换机和软件交换机。
- OVSDB:OpenFlow 的补充,用于配置交换机的协议。可以用于 OVS(Open vSwitch) 的配置。
- POF:完全可编程网络:协议无关转发和有状态处理逻辑。
- P4:完全可编程网络:不仅是一种南向协议,更是一种网络编程语言。
三、SDN 控制平面
SDN 控制平面是 SDN 的大脑,指挥数据平面的转发等网络行为。控制平面提供了网络可编程能力,使得开发者可以在控制平面上开发网络应用,并直接部署到数据平面,指导数据平面的数据交换等业务。
控制平面可根据功能逻辑划分为:
- 南向接口层:关于南向协议的相关实现
- 控制核心层:控制器的核心,提供网络资源的管理、事件系统等服务
- 北向接口层:面向应用的编程接口,为上层应用提供 SDN 编程接口服务
- 应用层:网络应用服务的相关实现
3.1 SDN 开源控制器
SDN 控制器是 SDN 网络的重要组成部分,SDN 控制器的性能,将直接影响网络的性能。
3.1.1 NOX/POX
NOX 是 SDN 发展史上的第一个控制器,POX 是其 Python 版本(NOX 基于 C++)。NOX/POX 已经成为 SDN 控制器发展史上的一座里程碑。
NOX/POX 提供存储、路由、主机追踪及拓扑发现等组件供用户学习和使用。
3.1.2 Ryu
基于 Python,成为目前主流的控制器之一,也得到了了一些交换机厂商的认可,例如:被 Pica8 采用作为交换机内嵌的默认控制器。
Ryu 在北向接口提供了 REST API 和 RPC 接口,允许外界的进程与 Ryu 进行通信。
- pip install ryu
- Ryu Github
- Ryu 一键安装脚本
- 笔者博客
3.1.3 Floodlight
基于 Java,非常经典的控制器。前身为斯坦福大学的 Beacon。已过时。
- 劣势:南向协议只支持 OpenFlow,而且对 OpenFlow 的版本支持较少,也是其过时的原因。
- 优势:
- 模块化架构,易于扩展和提升
- 依赖少,易于安装
- 支持混合组网,即支持 OpenFlow 交换机和非 OpenFlow 交换机的混合网络
- 实现了 OpenStack 的插件,可与 OpenStack 协同工作
- 性能优势:稳定和高效
.
- 基于 Maven 构建
- Floodlight Github
- Floodlight Wiki
3.1.4 OpenDaylight
基于 Java 的 OSGi 框架,最出名的 SDN 控制器。在发展速度方面,已被版本迭代速度更快的 ONOS 超越。
OpenDaylight 与其他控制器架构最明显的区别是 OpenDaylight 架构中有服务抽象层:SAL(Service Abstraction Layer)。SAL 主要完成插件的管理,包括注册、注销和能力的抽象等功能。
OpenDaylight 支持 OpenFlow、NET-CONF、SNMP 和 PCEP 等多种南向协议。所以 OpenDaylight 可以管理使用不同南向协议的网络。OpenDaylight 不仅仅是一个 SDN 控制器,更是一个网络操作系统。除了 SDN 控制器的基础功能以外,还包括 NFV(Network Functions Virtualization)等其他应用服务,旨在打造一个通用的 SDN 操作系统。
- 基于 Maven 构建
- OpenDaylight 官网
- OpenDaylight 中文文档
- SDN 中文社区
3.1.5 ONOS(Open Network Operating System)
基于 Java 的 OSGi 框架,采用 Raft 分布式架构,重量级的 SDN 控制器竞争对手。
ONOS 的核心控制层是一个分布式的架构,支持多实例协同工作。SDN 的数控分离使得集中控制编程自动化成为可能,但是也带来了可扩展性的问题。为了支持大规模网络的管理,分布式 SDN 控制器成为当下 SDN 控制器设计的主要趋势之一。分布式不仅提供了更强大的管理能力,具有更好的可扩展性,同时也提供了容灾备份和负载均衡等功能。
3.1.6 总结
SDN 发展:最初的 NOX/POX,到以 Floodlight 和 Ryu 为代表的的纯 SDN 控制器,到以 OpenDaylight 和 ONOS 为代表的网络操作系统。
3.2 选择 SDN 控制器
3.2.1 评价控制器的要素
SDN 控制器是 SDN 的大脑,控制器的性能对整体网络性能有直接而显著的影响。作为网路的管理中心,控制器需要具有极高的性能和可靠性。
- 支持 OpenFlow
OpenFlow 作为主流的南向协议获得了业界的广泛认可。OpenFlow 有不同的版本,不同版本也有不同的特性,例如:是否支持 Ipv6 和组表。
- 支持网络虚拟化
网络虚拟化的出现早于 SDN,而 SDN 加速了网络虚拟化的发展。网络虚拟化是指在物理基础设施上虚拟出多个面向租户的虚拟网络,使得面向租户的虚拟网络和物理网络解耦合,从而给虚拟网络租户差异化的网络服务质量保障,可以提高网络整体的利用率。SDN 应该支持在全局信息的基础上,做出最优化的网络资源分配决策,进而提高网络利用率,加速服务部署。
- 网络功能
作为网络控制器,支持基础的网络功能是最基本的要求。SDN 控制器应该支持基本的交换、路由、安全接入、负载均衡和流量隔离等功能。
- 可扩展性
传统的网络是多层次的架构,不同二层网络的互联互通需要通过三层的路由层。SDN 控制器的可扩展能力,保证了其能管理足够大规模的网络。可管理的交换机数目是衡量控制器可扩展性的重要指标,至少能控制器100台交换机是对控制器的基本要求。
- 性能
性能是指处理网络事件和安装流表项的能力,可以从两个方面进行测量评价:建立流表项的延时;和每秒建立流表项的数目,即吞吐量。当网络中交换机产生的新流数目多于控制器能处理的最大数目时,SDN 性能不足就会严重影响网络的效率,此时会出现等待建立流表项时间过长而导致连接中断等现象,可以考虑增加控制器的数目,将压力分摊到多个控制器上。
控制器下发流表项分为主动下发和被动下发:
- 主动下发(Proactively):预先下发流表项,避免当网络设备大规模上线时新流处理请求的数目突增而使控制器直接宕机等问题,保护生产网络的正常运行。
- 被动下发(Reactively):交换机收到无法处理的数据包时,将通过 Packet-in 消息上报给控制器,而控制器被动触发 Packet-in 处理逻辑并下发流表项。(产生时延:传输时延和控制器时延)
- 网络可编程
网络可编程是 SDN 架构最大的优势之一。SDN 可以跳过工程师逐跳配置设备的过程,通过控制器编程完成自动化部署。实现近乎实时的动态的流量调度,网络管理和配置。
- 可靠性
分为数据平面网络可靠性和控制平面可靠性。作为网络的管控中心,可靠性是最基本也是最重要的要求。主要体现在当转发路径不可达时,控制器应能快速计算出备份路径或逃生路径,从而保障数据平面网络连通性的基本要求。需要支持多路径传输的热备份等措施,应支持 VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)等协议或其他多路径算法。
单节点的控制器在发生故障的时候也会导致全网瘫痪,不仅要提高控制器本身的稳定性,还要使用集群等手段进行热备份和冷备份,提高数据平面网络的可靠性。
- 网络安全性
支持企业级别的授权和认证,可以对流量进行监控和过滤。
- 集中监控和可视化
对网络进行实时监控能为网络正常运行提供保障,所以 SDN 控制器需要支持网络监控功能。OpenFlow 协议可以做到多匹配域的监控,提高了数据监控的种类,而且提供了统计方式而非采样方式,提高了监控的精度。凭借全局的网络信息,可以对网络进行可视化展示,可以实现快速的故障定位。SDN 控制器应支持使用通用的协议来对网络进行监控和可视化展示,并支持通过 REST API 等接口来获取网络信息。这也是 SDN 控制器最基本的要求之一。
- 控制器支撑团队
无法及时更新 SDN 控制器的特性,那么就会逐渐丧失竞争力。技术是一方面原因,控制器的支撑团队也是主要的原因。应关注其支撑团队是否有能力将控制器做优秀。
3.2.2 选择正确的控制器
- 开源和商业
- 开源:
- Python:Ryu
- Java:OpenDaylight & ONOS
- 开源:
- 应用生态和成熟的北向接口
- 基于应用场景选择
- 网络规模很小:轻量级 Ryu
- 工程部署:OpenDaylight & ONOS
- 控制器的可靠性及兼容性
- 与云管理平台产品结合
- 数据中心场景下与 OpenStack 集成
- 稳定的 API 及清晰的发展路线
3.3 SDN 控制平面发展趋势
自 SDN 发展以来,支持者声称 SDN 将改变传统网络,打破目前固化的网络架构,带来更灵活、更智能的网络;反对者则认为 SDN 并没有良好的发展前途,因为分布式的优点足以支撑目前的网络运行,而 SDN 所提倡的集中式虽然有优点,但需要付出的代价过多,且性能问题始终存在,所以劣势大于优势。
四、数据平面
SDN 的核心在于网络可编程,而网络可编程能力就取决于数据平面的可编程能力。只有数据平面提供足够的可编程能力,控制平面才能通过南向接口来对网络进行更灵活的编程控制。为了提供更好的可扩展性,通用可编程数据平面设备中所有的网络处理模块,包括包处理器,包转发和包调度等模块都是可编程重配置或者是协议无关的,都具备足够的可编程能力。
在传统网络架构中,设备的控制平面和数据平面为紧耦合关系。控制平面实现网络的控制逻辑,而数据平面执行网络控制逻辑,比如解析数据包头和转发数据包到某些端口。但紧耦合的关系导致设备升级时相互依赖,无法快速支持新需求。
现有路由器和交换机中网络转发平面的不足,理想的网络转发模型应该具备以下三个条件:
- 清晰的软硬件接口:支持软硬件体系结构各自独立地演进。
- 例如 x86 指令集
- 理想的网络转发模型应该与网络协议无关,支持根据软件编程实现所有的协议功能,甚至支持新的网络协议
- 简洁的硬件架构:能够通过增加处理器内核或子模块的数量来提升系统性能。
- 灵活有效的功能实现:能够高性能且低成本地实现大多数的网络功能,同时能够快速地添加新功能。
一种可编程通用转发抽象模型:OpenFlow Switch
4.1 通用可编程转发模型
OpenFlow Switch 通用转发模型包括"通用硬件模型"和"通用处理指令"。
网络数据处理流程为:
- 数据包从某个端口进入通用模型;
- 通用模型中的协议解析模块完成对数据包头部分的分析;
- 根据分析结果选择对应的流表进行处理;
- 流表内部,解析出来的数据包内容会与每个流表项进行比较;
- 如果数据包匹配到了流表的一条表项,则通用模型需要对该数据包执行表项中规定的处理操作;
- 反之,则会按照某种特定指令来处理,例如:丢弃或转发给处理器。
网络通用处理指令:
- 操作指令:对网络数据包的具体操作。
- 转发数据包
- 修改数据包
- 组表处理
- Meter 表处理
- 跳转指令:实现网络数据包在多个流表之间的跳转操作。
- 专用指令:实现某种特定的网络数据流处理。
4.1.1 通用硬件模型
4.1.1.1 流水线处理
多级流表:支持网络数据包在多个流表之间进行处理。
(二层转发表、三层路由表、访问接入控制查找表等)
每个数据包在进入流水线之前,将被分配一个对应的操作指令集(网络数据操作指令集合)。然后,数据包会进入第 0 个流表开始处理,通用硬件模型将把数据包协议内容与每个表项进行匹配查找。完成查找过程之后,通用硬件模型会将流表项中定义的操作指令写进操作指令集中,或者传输给下一个流表,或者在指令执行模块完成对数据包的操作处理。此外,多个流表之间也可以通过一个 Metadata 来交互信息,这个 Metadata 信息可以添加到下一个流表的匹配域中,也可以直接写进某个流表项。
4.1.1.2 流表
网络设备中的转发表是一种"键-值"查找表,通过表内容匹配来返回匹配成功的操作数据。流表是一种转发表的抽象子模型。流表模型本质是一种面向 Flow 的转发表。每个流表项包括匹配域和操作两部分。匹配域用来描述一组具有共同特征的网络数据包集合,即 Flow;操作用来定义特定 Flow 的处理指令,这种处理指令是一种控制指令,称为 Instruction。另外,流表项还包含了该 Flow 的其他信息,比如优先级、状态统一和失效时间等。
- 匹配域:用来与每个数据包的指定包头标识集合进行比较,包括输入端口,包头标识域(Vlan、Src & Dst 's Mac & Ip、port)和 Metadata 三部分。
- Instructions:指定该 Flow 中数据包的跳转操作,同时也包括对流表项的操作指令集的操作。
- 计数器:用来实时统计与流表项匹配成功的数据包数目等信息。这些统计信息是网络用户分析流量的关键信息。
- 优先级:用来说明该流表项的匹配优先级,当数据包与多条流表项匹配成功时,需要按照优先级来选择出一条流表项,并执行该表项的动作。
- 失效时间:用来指定该流表项的失效时间,包括硬超时和软超时两种设置。如果流表项的生存时间超过硬生存时间,或者在软生存时间内没有匹配到数据包,流表项中的内容会被清空。
流表项的指令会指明数据包需要跳转到哪一个流表,流水线中的最后一个流表不会包含流表跳转指令,从而强制停止流水线处理。
4.1.1.3 组表
组表也是一种转发表类型的抽象子模型,其具备给一组端口定义某种指定操作的抽象能力,从而为组播、负载均衡、重定向及聚类操作等网络功能提供更加便捷的实现方式。
组表主要包括组表项类型和 Action Buckets 两部分。Action Buckets 定义每个组表项对应的工作集。
四种组表类型:
- 全选择类型(ALL):执行 Action Buckets 中的所有 Action Buckets 操作动作集。实现组播和广播功能。
- 选择类型(SELECT):只选择执行一个 Action Bucket 的动作集。实现流量的网络负载均衡。
- 间接类型(Indirect):只支持一个 Action Bucket,多个流表项指向单一组表项。实现流量汇聚,重定向功能。
- 快速恢复类型(Fast Failover):只执行第一个激活的 Action Bucket,需要建立活跃度机制。实现容灾备份。
4.1.1.4 Meter 表
Meter 表也是一种转发表类型的抽象子模型。具备测量 Flow 的能力,可用来实现速率控制等 QoS 服务。
由多条计量表项组成,计量表项的计量带用来定义该表项对应的一组操作,每个计量带执行一个网络数据流的传输速率阈值,通常只有网络数据流的当前流量速率超过这个速度阈值时,才会执行指定操作。
- 丢弃:实现对应 Flow 的速率控制。
- 修改 DSCP 的 Remark:实现 DiffServ。
4.1.1.5 状态信息表
OpenFlow Switch 模型中的大量计数器组合起来就构成了一个基于 Flow 的网络状态信息表,对特定 Flow 的数据包进行统计和记录。
4.1.1.6 端口
端口是指 OpenFlow Switch 模型和其他网络设备之间传输数据包的网络接口,通用硬件模型通过端口相互连接在一起,此处强调逻辑上的连接。
- 物理端口:物理网络的真实网络端口,与网络设备中的物理接口一一对应。
- 逻辑端口:一种抽象的逻辑端口,通常用来描述链路聚合组、隧道和回环接口等逻辑概念。
- 保留端口:预留的虚拟端口类型。
4.1.1.7 总结
OpenFlow Switch 模型定义了一组抽象子模型来描述这个网络通用转发模型。
- 流表子模型(转发表):描述具体的网络数据包处理模块,支持通过简单的 Match-Action 过程完成对网络数据包操作处理;
- 组表子模型(转发表):描述给一组端口执行某一类统一操作;
- Meter 表子模型(转发表):描述基于 Flow 的网络测量行为;
- 状态信息表子模型:由一组计数器组成;
- 端口子模型:网络设备中本来就有的一种网络资源模型。
4.1.2 通用处理指令
指令集:计算机程序要控制硬件工作,必须使用硬件所能识别的语言,这些语言及其用法统称为指令集。指令集在程序员和处理器之间提供了一个抽象层,程序员编写软件只需要知道有哪些指令,以及如何使用即可,无须关心处理器如何实现。
计算机包含三种类型的指令:存储器访问指令,数据运算指令,流控制指令。OpenFlow Switch 的通用处理指令为:网络处理控制指令,网络数据操作指令,专用网络处理指令。
4.1.2.1 网络处理控制指令(流控制指令)
基于 Flow 的网络处理流程控制指令,可以控制数据包在通用硬件模型流水线上的处理流程。
控制指令有两种类型:
- 对 Flow 数据包的操作指令集进行写入、应用或者删除等修改操作。
- 指定 Flow 数据包在多个表中的处理顺序的跳转指令。
4.1.2.2 网络处理操作指令(逻辑运算指令)
基于 Flow 的网络处理操作指令,完成对数据包的丢弃、复制、转发和修改等操作。描述对数据包执行具体的操作。
每个数据包在进入流水线时都会被分配一个 Action Set,用于保存处理数据的动作。
4.1.2.3 专用网络处理指令
基于 Flow 的专用指令,实现某特定的网络处理功能。
Table-miss 指令:定义了在流表中匹配不成功时处理网络数据包的行为,不仅要省略所有匹配域,还要将优先级域设置为零。
4.1.3 小结
OpenFlow Switch 模型分别在通用硬件模型和通用处理指令两方面进行模型模型定义:一方面对网络转发处理行为进行通用抽象,建立一个通用转发抽象模型;另一方面对用户可编程的通用处理指令进行定义,使得用户可以通过软件编程的方式控制转发行为。
4.2 SDN 数据平面的发展趋势
4.2.1 发展历史
- 软件型和可编程硬件型的 SDN 数据平面设备 ->
- 支持 OpenFlow 南向接口的传统网络数据平面 ->
- 通用可编程数据平面和数据平面编程语言
4.2.2 白盒交换机(新的发展趋势)
White Box Switches 也称为开放网络交换机,是网络交换机硬件和操作系统解耦合的结果。White Box Switches 模式使得用户可以自主选择交换机硬件和操作系统。
White Box Switches 能显著提升网络设备的可编程能力,使得管理员像管理服务器一样操作网络设备。
五、从零开始实践
1. Mininet
网络模拟器 Mininet,用于快速构建 SDN 网络。
2. Open VSwitch
开源软件交换机,虚拟化交换机
3. Ryu
SDN 控制器
4. OpenVirteX
网络虚拟化
网络虚拟化可以将一个物理网络虚拟成多张虚拟网络,提供给不同的用户。虚拟网络用户并不需要关心底层物理网络的情况,只需关注虚拟网络即可,其虚拟网络到物理网络的映射关系由网络虚拟化平台完成。
- 面对租户,OVX 就是一个数据平面网络。OVX 根据租户的需求,将租户的虚拟网络拓扑映射到具体的物理拓扑上,租户只能看到租户虚拟网络,无法感知真实拓扑,也不需要关心真实拓扑。这种实现方式一方面提供了面向租户的网络,另一方面对用户屏蔽底层物理网络也将提高网络安全性。
- 面对交换机,OVX 就是控制器。
5. Cbench
测试控制器性能:模拟一系列软件交换机,向控制器发送 Packet-in 消息。
6. OFTest
测试 OpenFlow 交换机功能:测试 OpenFlow 设备对各个 OpenFlow 报文的处理机制是否完备正确。
7. Wireshark
网络数据包分析软件:截取网络数据包,并尽可能显示出最详细的网络数据包信息。
8. Iperf & Scapy
发包工具:发送自定义的数据包,来测试网络应用的正确性。
六、SDN 应用案例
1. 数据中心网络
数据中心主要是为了满足互联网厂商的大规模计算需求。由存储资源,计算资源和网络资源组成。其中网络资源完成计算资源,存储资源之间以及互联网之间的互联互通。
在一般的数据中心架构中,数据中心由许多互联的服务器组成,一组服务器堆叠放在一个服务器机架上,并连接到一个或多个 ToR 接入交换机。ToR 接入交换机向上连接汇聚层交换机,完成跨机架的服务器互联互通。汇聚层交换机还会继续向上汇聚,连接到顶层的核心交换机。一般的,核心交换机会完成数据中心和互联网的互联互通。这种拥有大量计算和存储资源的互联互通网络就是数据中心网络。
- 大规模的数据中心网络管理难度大,网络运行故障定位难,运维成本也非常高。
- 更多的动态业务不断出现,要求数据中心快速支持业务的部署。
- 需要实现多租户网络的隔离和安全保障等功能。
- 虚拟机需要根据业务的需要进行灵活的迁移,以提高资源利用率和服务质量。需要数据中心网络能够根据虚拟机的迁移,灵活部署相应的网络策略。
软件定义数据中心(SDDC)利用虚拟化技术将计算,存储和网络资源抽象成统一的虚拟资源池,从而支持动态管理网络,支持用户通过编程接口按需弹性获取虚拟资源。SDN 能很好地契合数据中心网络对网络自动化管理和网络虚拟化方面的需求。
现有商业方案
- SDN Overlay
渐进式的数据中心网络解决方案。传统的网络 Overlay 技术的主要做法是:在每个服务器内部新增一个软件实现的虚拟交换机,并在虚拟交换机上部署某种隧道协议来实现虚拟机互联的虚拟通道,从而在共享物理网络的基础上创建逻辑隔离的虚拟网络。
- SDN Underlay
革命性的数据中心网络解决方案,也称为直接编程硬件结构方案。需要全面升级所有的网络硬件设备,要求网络设备支持 OpenFlow 等 SDN 南向接口协议。
SDN Overlay 是一种渐进式的方案,不需要升级网络硬件,直接通过升级虚拟接入网络设备就可以实现数据中心的网络虚拟化。SDN 控制器 只需控制这些虚拟接入设备,节省了购买新网络硬件的成本,部署难度也较低。相比之下,SDN Underlay 是一种相对彻底的方案,需要全面升级现有的数据中心网络硬件设备,且 SDN 控制器需要控制所有的网络设备,部署难度较高。
目前数据中心网络开源解决方案 Neutron 在设计上充分体现了"软件定义网络"的理念,采用 Network Overlay 的方式来实现虚拟化。Neutron 将网络资源和网络功能抽象成通用的 API,实现了网络即服务(Naas)的目标。Neutron 的 API 可以使工程师像使用 Linux 网络命令那样去操作整个数据中心网络。
2. WAN
传统的 WAN 部署主要依赖专用网络设备和运营商专线。SDN 可用于解决 WAN 资源利用率低的问题。
SD-WAN 的两个优势:
- 节省成本:SD-WAN 让用户能够集中管理和自动配置 WAN 边缘设备,降低运营和传输成本,同时提高了传输性能。采用 SD-WAN 可以显著降低 MPLS(多协议标签交换,Multi-Protocol Label Switching) 相关的硬件设备成本和连接成本。
- 更加灵活:能够灵活管理 MPLS 和 LTE 等多种类型的连接方式,灵活提供定制化的连接,从而达到优化 WAN 连接的目的。
现有商业方案
Google B4 是最出名的 SDN 应用案例。Google 网络分为数据中心内网络和数据中心外网络两部分,其中数据中心外网络按网络需求分为两个 WAN:面向互联网用户的 B2 网络;连接 Google 数据中心的 B4 网络。
B4 网络流量分布的不均衡是一大问题,引入 SDN 的 B4 网络可通过统一的控制器来收集各数据中心之间的流量需求,从而进行统一的计算和调度,实施带宽的灵活按需分配,最大化程度优化网络,提升网络资源利用率。可以实现可编程的域间路由和动态分配带宽功能。Google B4 采用 SDN 架构之后,其 WAN 的链路利用率从 30%~40% 提升到 90% 以上。
现有的 SD-WAN 方案多是 Overlay 实现方式,不能充分利用运营商的底层网络硬件。
3. 其他应用
- SDN 在园区网中的应用:通过集中式网络控制和全局网络视图,SDN 网络不仅能简化园区网的管理,也支持面向用户、应用等更细粒度的网络流量管理。其集中统一的管理方式,也加速了新网络功能和服务的部署速度。
- SDN 在局域网中的应用:SD-LAN 实现了局域网控制平面与物理硬件之间的解耦合,重新定义了局域网接入层的实现方式,实现了基于应用和策略驱动的网络接入框架,提供自组织和集中管理的网络。
- SDN 在蜂窝网络中的应用:为应对大规模的流量和频繁变动的业务需求,如何提高无线网络资源利用效率,提高核心网的灵活性并缩短移动网络新功能上线周期成为移动网络需要重点解决的问题。在无线接入网络中,SDN 的全局化和集中式管理能够实现多种基站间的协同工作,提升频谱和能源效率。在核心网中,SDN 能够提供虚拟化功能,同时实现更加智能的网络设备管理和控制。
七、SDN 与网络虚拟化
网络虚拟化是一种重要的网络技术,该技术支持在物理网络上虚拟多个虚拟网络,从而允许不同用户共享或独占网络资源的切片,进而提高网络资源利用率,实现弹性的网络。SDN 的出现使网络虚拟化更容易实现、也更智能,而与此同时,网络虚拟化也成为了 SDN 的重量级应用。
1. 网络虚拟化
意义:将物理资源虚拟化成虚拟资源,从而实现动态、按需、弹性地资源分配,提高资源利用率。既能满足需求,又不浪费资源。
虚拟化技术的五个主要优势:
- 资源共享
- 将资源划分为更小的粒度,实现更细致的分配,从而减少资源的浪费,提高资源利用率。
- 资源隔离
- 通过添加标签等多种方式,可以实现动态的资源隔离,从而提升租户网络的安全性。
- 资源聚合
- 将众多小的资源聚合到一起,形成一个虚拟的大型资源池。计算资源虚拟化 & 存储资源虚拟化。
- 动态分配
- 服务器的负载均衡和虚拟机的动态迁移。
- 降低管理难度
- 不同系统的物理资源管理接口各不相同,而虚拟资源可以使用统一标准的接口。
网络虚拟化
网络虚拟化是一种支持在物理网络环境中同时运行多个虚拟网络的虚拟化技术,每个虚拟网络由多个虚拟节点和虚拟链路组成。本质上,虚拟网络资源就是物理网络资源的一个可动态调整子集。网络虚拟化技术将物理网络资源池化,从而给租户提供弹性的网络资源,提高网络资源的利用率。
1.1 网卡虚拟化
每台虚拟机所拥有的资源和物理服务器所拥有的资源种类一样,均拥有 CPU、内存、网卡等资源。需要网卡虚拟化技术来完成物理网卡和虚拟网卡之间的映射。
1.2 链路虚拟化
链路虚拟化技术可以从物理链路上映射生成虚拟链路。主要分为三类:
- 物理信道复用:在一个物理的信道上创建出多个子信道,从而虚拟出多个子链路
- 时分复用
- 频分复用
- 码分多址:码分多址是各发送端用各不相同的、相互正交的地址码调制其所发送的信号。在接收端利用码型的正交性,通过地址识别(相关检测),从混合信号中选出相应的信号。
- 带宽虚拟化:将多个子信道整合成一个更大的虚拟子信道,从而提供更多的带宽
- 数据路径虚拟化:交换节点为特定特征的数据流提供带宽等资源,从而形成基于数据的逻辑虚拟链路,进而使得不同的数据在各自的虚拟链路中转发
- 打标签:通过给数据打一个标签字段,从而和其他数据产生逻辑上的区分,实现虚拟链路。例如:VLAN
- 打隧道:将完整的原始数据包封装成外层数据报文的数据段,然后在物理网络上按照外层数据的地址进行转发。在报文抵达隧道终点之后,再将外层数据包头移除,继续转发原始数据包。
1.3 交换机虚拟化
虚拟交换机可以部署在宿主机上,也可以部署在专门负责转发的虚拟机内。虚拟交换机上同时连接着物理网卡和虚拟网卡,从而完成数据从虚拟机到物理网卡的转发。
虚拟机流量标识的解决方案:VN-Tag 可以让 ToR 交换机能区分不同虚拟机的数据,进而部署对应的网络策略。
1.4 网络虚拟化
- Overlay 网络:架设在现有底层物理网络基础上的虚拟网络,底层网络成为 Underlay 网络。虚拟网络的数据包将被封装成底层网络数据包的数据段,使用打隧道的方式传输。
- VPN(虚拟私有网络):是一种架设在基础网络之上的加密通道。VPN 更强调虚拟私有网络之间的连接,而 Overlay 网络更强调在物理网络上架设虚拟网络。
- VSN(虚拟共享网络):强调不同的虚拟网络共享同一个物理网络资源,但是接入权限不同。例如:员工网 & 访客网。
Overlay 网络强调在底层网络上创建于底层物理网络分离的虚拟上层网络;VPN 强调与公网数据的隔离,强调网络之间的连接;VSN 则强调多个虚拟网络共享物理网络资源。
从网络分层的角度区分网络虚拟化技术:
- 物理层:波分复用WDM(Wavelength Division Multiplexing)
- 链路层:VLAN
- 拓扑层:网络虚拟化
亚马逊的 VPC 可以提供虚拟私有云,即在数据中心的网络中创建一个虚拟网络拓扑,并提供给租户使用。
网络虚拟化最大的技术难题是如何实现虚拟网络资源和物理网络之间的映射。而 SDN 的出现为解决这一难题提供了良好的解决方案,降低了网络虚拟化的难度。SDN 以其逻辑集中式的管控,可获取全网的网络信息,从而为虚拟网络的创建提供了良好的基础,降低了部署虚拟网络的难度。
2. SDN 与网络虚拟化
- SDN 是一种集中控制的网络架构,其数据平面和控制平面相分离。
- 网络虚拟化是一种网络技术,可以在物理拓扑结构上创建虚拟网络。
网络虚拟化是 SDN 的应用,是一种网络技术,而基于 SDN 的网络架构可以更容易地实现网络虚拟化。
SDN 实现网络虚拟化
SDN 实现网络虚拟化的三部分:
- 物理网络管理
- 网络资源虚拟化
- 网络隔离
网络虚拟化平台完成物理网络的管理和虚拟化,并将虚拟网络资源提供给不同的租户。
2.1 网络虚拟化平台
网络虚拟化平台是介于底层物理网络和租户控制器之间的中间层软件。
- 面向租户控制器,虚拟化平台是数据平面,呈现模拟出的虚拟网络。
- 面向数据平面,虚拟化平台是SDN 控制器。
- 物理网络到虚拟网络的映射关系由虚拟化平台的核心层完成。
2.2 网络资源虚拟化
- 拓扑虚拟化:模拟节点和虚拟链路到物理节点和链路的映射。一虚一,一虚多,多虚一。
- 节点资源虚拟化:对节点的流表,CPU 等资源的抽象虚拟化。
- 链路资源虚拟化:包括租户可使用的带宽及端口的队列等资源。
2.3 网络隔离
- 控制平面隔离:保证租户的控制器在运行时不受其他租户控制器的影响。
- 数据平面隔离:保证租户的数据平面的资源不被其他租户所占据。
- 地址隔离:虚拟化平台在转发租户控制器的南向协议报文时,需要将虚拟地址映射为全网唯一的物理地址。
3. 网络虚拟化产品
网络虚拟化平台的架构分为集中式架构和分布式架构两种。
3.1 开源产品
- FlowVisor:里程碑式产品。过于复杂,且效率不高。
- OpenVirteX(OVX):支持租户定制任意拓扑和使用任意地址空间。
- VTN(Virtual Tenant Networks):并不是一个虚拟化平台,而是 SDN 控制器 OpenDaylight 的一个应用。支持同时管理 OpenFlow 网络和 Overlay 网络。
3.2 商业产品
NSX 和 ACI 不关注虚拟拓扑的虚拟化,仅通过部署隧道(Tunnel) 来实现 Overlay 网路。
- VMware 的 NSX
- 思科的 ACI(Application Centric Infrastructure):不采用 OpenFlow 协议,也不采用 Open vSwitch 的商业解决方案。
4. 未来研究方向
- 性能提升:虚拟化平台的集中管控成为了整体网络的瓶颈。隧道(Tunnel)技术也降低了传输效率。
- 安全与隐私:DDos 攻击的影响。不同租户的数据隔离。
- 架构设计:分布式和集中式的抉择。
- 资源发现、虚拟化和调度:优化资源发现算法。优化和统一虚拟化标准。动态调度虚拟资源,提高整体资源的利用率。
- 动态和移动性管理:如何实现针对移动资源的策略随动机制。
- 编程接口,定义标准化:在技术的发展过程中,标准化是永恒的旋律。
八、SDN 浪潮
1. SDN 对学术界的影响
SDN 领域在学术界的贡献产出相对趋于缓慢,SDN 与其他新技术的融合逐步成为研究者青睐的技术方向。
2. SDN 对工业界的影响
传统网络设备商主导的垂直封闭格局被打破,整个网络产业格局被分成很多开放的层次,每个层次都可以容纳更多的厂商一起参与,不同层次厂商之间更多的是合作关系,而不是竞争关系。
整个网络产业格局分为:
- 可编程网络芯片层
- 芯片驱动/编译层
- 设备操作系统层
- SDN 控制器层
- SDN 应用层。
3. 如何应对 SDN 的变革
程序员的进阶之道是:“抬头看路,埋头赶路”。现在人们已经不再讨论什么是 SDN,而更多的在讨论如何应用 SDN。
SDN 留给国内科研机构的机会已经不多了,更好的方式是结合自身在大数据等跨学科领域的积累和优势,将 SDN 理念和架构应用到该领域。
网络工程师转变为网络开发工程师,也需要学习编程技能,去动手写代码。
4. SDN 浪潮
一项新技术通常是:
- 技术萌芽期
- 炒作期(过热期)
- 幻觉破灭期
- 复苏期
- 生产力成熟期 -> 应用高峰
SDN 现在处于幻觉破灭期。