文章目录
软件定义网络 SDN
软件定义网络(Software Defined Networking,SDN
)是一种新兴的网络架构,旨在通过网络控制与数据转发的分离,实现网络的集中管理和灵活性。
SDN
是由美国斯坦福大学 Clean Slate 课题研究组提出的一种新型网络创新架构,是网络虚拟化的一种实现方式。其起源可追溯到 2006 年斯坦福大学的 Clean Slate 研究课题,而正式提出 SDN
概念则是在 2009 年。
- SDN 最初只是学术界讨论的一种新型网络体系结构
- SDN 成功案例:谷歌于 2010~2012 年间建立的数据中心网络 B4。
- SDN 是当前网络领域最热门和最具发展前途的技术之一,成为近年来的研究热点
远程控制器
现在的路由器一般都基于硬件进行转发,单个分组的转发时间为纳秒数量级
在 SDN 体系结构中,路由器中的路由软件都不存在了。因此,路由器之间不再交换路由信息。在控制层面中,有一个在逻辑上集中的远程控制器。
逻辑上集中的远程控制器在物理上可由不同地点的多个服务器组成。远程控制器掌握各主机和整个网络的状态,能够为每一个分组计算出最佳的路由,并为每一个路由器生成其正确的转发表。
SDN 这种新型网络体系结构的核心思想:把网络的控制层面和数据层面分离 ,而让控制层面利用软件来控制数据层面中的许多设备。
OpenFlow协议
OpenFlow
协议是一个得到高度认可的标准,在讨论 SDN
时往往与 OpenFlow
一起讨论。OpenFlow
协议可被看成是 SDN
体系结构中控制层面与数据层面之间的通信接口。
OpenFlow
协议使得控制层面的控制器可以对数据层面中的物理设备进行直接访问和控制。
OpenFlow 协议的技术规范由非营利性的产业联盟开放网络基金会 负责制定。
(Open Networking Foundation, ONF)
ONF
的任务是致力于 SDN
的发展和标准化。SDN
并未规定必须使用 OpenFlow
,只不过大部分 SDN
产品采用了 OpenFlow
作为其控制层面与数据层面的通信接口。
OpenFlow
从 2009 年底发表的 1.0 版开始,每年都被更新,历经 12 次更新,到 2015 年 3 月发布了 1.5.1 版,目前较为成熟的是 1.3 版本。
SDN 广义转发
传统意义上的数据层面的任务:根据转发表转发分组。转发分组分为以下两个步骤:
- 进行"匹配 ":查找转发表中的网络前缀 ,进行最长前缀匹配。
- 执行"动作":把分组从匹配结果指明的接口转发出去,
SDN 的广义转发分为以下两个步骤:
-
进行"匹配 ":能够对网络体系结构中各层(数据链路层、网络层、运输层)首部中的字段进行匹配。
-
执行"动作 ":不仅转发分组 ,还可以负载均衡 、重写IP首部 (类似NAT路由器中的地址转换),人为地阻挡或丢弃一些分组(类似防火墙一样)。
在 SDN 的广义转发中,完成"匹配+动作"的设备并不局限在网络层工作,因此不再称为路由器而称为"OpenFlow交换机 "或"分组交换机 ",或更简单地称为"交换机"
流表
相应的,在 SDN 中取代传统路由器中转发表的是 流表(Flow Table)
一个流就是穿过网络的一种分组序列 ,而在此序列中的每个分组都共享分组首部某些字段的值。例如某个流可以是具有相同源IP地址和目的IP地址的一连串分组。
OpenFlow 交换机中的流表是由SDN远程控制器来管理的。SDN 远程控制器通过一个安全信道,使用 OpenFlow 协议来管理 OpenFlow 交换机中的流表。
网络设备可以由不同厂商来生产,可以使用在不同类型的网络中。从SDN远程控制器看到的,是统一的逻辑交换功能。
每个 OpenFlow 交换机必须有一个或多个流表 ,每一个流表可以包含多个流表项 。每个流表项包含三个字段:首部字段值(或称匹配字段) 、计数器 、动作
-
首部字段值 字段:包含有一组字段,用来使入分组(Incoming Packet) 的对应首部与之匹配,因此又称为匹配字段。匹配不上的分组就被丢弃,或被发送到SDN远程控制器做更多的处理
-
计数器 字段:是一组计数器,记录已经与该流表项匹配的分组数量 的计数器,记录该流表项上次更新到现在经历时间的计数器。
-
动作字段:是一组动作,当分组匹配某个充表项时,执行该流表项中动作字段指明动作:
- 把分组转发到指明的端口
- 丢弃分组
- 发出去把分组进行复制后再从多个端口转发出去
- 重写分组的首部字段(包括数据链路层、网际层以及运输层的首部)
简单转发
在 SDN 架构下,控制平面 (Controller)负责网络策略的制定和下发,而数据平面(Switches)则执行具体的流量转发操作。
网络拓扑:
-
图中有三个 OpenFlow 交换机:S1、S2 和 S3。
-
S1 连接到 主机H1 (IP:
10.0.1.1
) 和 H2 (IP:10.0.1.2
),并通过 端口1 和 2 分别连接到这两个主机。 -
S2连接到 主机H3 (IP:
10.0.2.3
) 和 H4 (IP:10.0.2.4
),并通过 端口1 和 2 分别连接到这两个主机。 -
S3连接到 主机H5 (IP:
10.0.3.5
) 和 H6 (IP:10.0.3.6
),并通过 端口1 和 2 分别连接到这两个主机。 -
S1、S2 和 S3 通过各自的 端口3 相互连接形成一个环形结构。
流表项配置:每个 OpenFlow 交换机都有一张流表,用于指导数据包如何转发。各交换机的流表项配置见图
数据包转发过程,假设从 H1 发送一个数据包给 H3:
-
H1 -> S1: 当 H1 向 H3 发送数据包时,这个数据包首先到达 S1 的 端口1。
-
S1 -> S3 : 根据 S1 的流表项,所有来自子网
10.0.1.*
并前往子网10.0.2.*
的数据包都会被转发到 端口3,因此这个数据包会被转发到 S3。 -
S3 -> S2 : 在 S3 上,由于数据包是从 端口1 进入并且 目标IP 地址属于子网
10.0.2.*
,所以根据 S3 的流表项,这个数据包会被转发到 端口2,从而到达 S2。 -
S2 -> H3 : 最终,S2 接收到这个数据包后,根据其流表项,发现目标IP地址是
10.0.2.3
,于是将数据包转发到 端口2,最终到达 H3。
这样就完成了一次从 H1 到 H3 的数据包转发过程。整个过程中,所有的决策都是基于预先设定好的流表项进行的,体现了 SDN 集中管理和控制的优点。
负载均衡
下图展示了在一个软件定义网络(SDN)环境中,如何通过负载均衡机制分发流量的过程。
具体步骤如下:
-
初始状态:
- 主机H1 发送数据包到 主机H3。
- 数据包经过 S1 交换机,然后通过 S3 交换机到达 H3。
-
负载均衡启用:
- 控制器检测到流量增加或某种其他触发条件,决定启用负载均衡。
- 控制器更新 S1 和 S2 交换机的流表,使得部分流量通过 S2 交换机分流。
-
负载均衡后的路径:来自 H1 的数据包现在有两种可能的路径到达 H3 :
- 第一种路径仍然是通过
S1 -> S3 -> H3
。 - 新增的第二种路径是通过
S1 -> S2 -> S3 -> H3
。
- 第一种路径仍然是通过
通过这种方式,控制器可以根据当前网络状况动态调整流量分配,以优化网络性能和资源利用率。这种灵活性是 SDN 的核心优势之一,因为它允许网络管理员更精细地控制和管理网络流量。
防火墙
下图展示了一个软件定义网络(SDN)环境中的防火墙设置,在这个例子中,防火墙规则应用于 OpenFlow 交换机 S2,限制了哪些数据包可以通过此交换机。
在 S2 交换机上设置了防火墙规则,只允许接收来自于S1相连的主机所发送的数据包,无论这些数据包是从 S2 自己的哪个端口进来的。只有当数据包的 源IP 地址匹配 10.0.1.*
范围内的地址时,才会被转发到相应的端口(对于目的地为 10.0.2.3
的数据包转发到 端口2,对于目的地为 10.0.2.4
的数据包转发到 端口3)。
SDN 控制器
SDN 控制器作为中央控制点的角色,通过标准化的API与上下层进行通信,实现了网络的可编程性和灵活性。
这张图展示了 SDN 架构中各层的功能划分以及它们之间的交互方式,
-
网络控制应用程序层:这一层包含多个网络控制应用模块,如路由选择、负载均衡、接入控制等。这些模块通过北向 API 与 SDN 控制器交互。
-
北向API:北向 API 是 SDN 控制器与网络控制应用程序层之间的接口。它支持 REST 风格的 API 和其他形式的通信协议,如 Intent。
-
SDN控制器(网络操作系统):SDN 控制器是 SDN 架构的核心组件,负责网络的整体控制和管理。它通过南向API与底层的数据层面设备进行通信。
-
南向API:南向API 是 SDN 控制器与数据层面设备之间的接口。它使用标准协议(如OpenFlow)来控制和管理底层的网络设备。
-
数据层面:数据层面包含了实际的网络设备,如交换机和路由器。这些设备受到 SDN 控制器的控制,按照控制器的指示进行数据包的转发。
-
网络范围的状态管理层:这一层次负责收集和管理网络范围内的重要信息,如链路状态信息、主机信息、分组交换机信息等。
-
通信层:通信层负责 SDN 控制器与数据层面设备之间的通信,确保命令和反馈信息的正确传输。