前言
SDN 核心思想:控制平面与数据平面分离
SDN(软件定义网络)最核心的思想就是控制平面 (Control Plane) 与 数据平面 (Data Plane) 的分离。
- 数据平面 (Data Plane / Forwarding Plane):
- 职责:负责实际的数据包转发,也就是“怎么走”。
- 组成:由网络设备(如交换机、路由器)构成。这些设备现在被称为数据平面设备或转发器 (Forwarders)。
- 特点:它们变得“愚蠢”且可编程。它们不再自行决定数据包的转发路径,而是严格遵循控制平面下发的指令(流规则)进行操作。
- 南向接口 (Southbound Interface):是数据平面设备与控制平面通信的接口。它允许控制器向数据平面设备下发流规则,并接收数据平面设备的事件(如 Packet-In)。OpenFlow 是最广为人知和广泛使用的南向接口协议。
- 控制平面 (Control Plane / Control Layer):
- 职责:负责网络的“大脑”,决定数据包的转发逻辑和策略,也就是“往哪走”。
- 组成:由一个或多个网络控制器 (Network Controllers) 组成(例如 OpenDaylight, ONOS, Ryu, Floodlight 等)。
- 特点:集中化管理,具有网络的全局视图。它根据网络管理员的策略或应用程序的需求,计算出最佳的转发路径和规则,然后通过南向接口下发给数据平面设备。
- 北向接口 (Northbound Interface):是控制器与上层应用 (Applications) 或业务编排系统通信的接口。它允许应用程序向控制器请求网络服务、配置网络策略或获取网络状态。REST API 是最常见的北向接口形式。
总结:
- 传统网络:控制平面和数据平面紧密耦合在每个网络设备中。
- SDN 网络:将控制平面从数据平面设备中抽离出来,集中到控制器中。控制器通过南向接口控制数据平面,并通过北向接口暴露网络服务给上层应用。
南向接口 (Southbound Interface) 和 北向接口 (Northbound Interface)
- 南向接口 (Southbound Interface):
- 目的:控制器 <-> 转发设备。
- 功能:控制器向转发设备下发流规则、查询设备状态;转发设备向控制器报告事件(如 Packet-In,当遇到未知数据包时)。
- 例子:OpenFlow, NETCONF, OVSDB 等。OpenFlow 是目前 SDN 领域最主流和最具代表性的南向接口协议。
- 北向接口 (Northbound Interface):
- 目的:控制器 <-> 上层应用。
- 功能:应用程序通过北向接口向控制器请求网络资源、配置网络策略(例如“创建一条带宽为 100Mbps 的隧道”),或者获取网络拓扑、流量统计等信息。
- 例子:RESTful API (最常见), Java API, Python SDK 等。
Ryu控制器实操
💡 用 Python 编写一个简单的 Ryu L2 Learning Switch
环境搭建
| |
安装Ryu
Ryu最新版本为4.34,早就19年就不维护了,很多依赖都不适配当前最新版本,python还是乖乖用3.9,不然不好安装。
| |
程序
| |
执行
| |
总结 Ryu 的行为模式:
- 第一次见到的流量:当 OVS 收到一个数据包,并且没有任何流规则匹配它时(只会匹配到默认的 priority=0, actions=CONTROLLER 规则),OVS 会将这个数据包的头部(以及一部分数据)封装成 Packet-In 消息发送给 Ryu 控制器。
- 学习:Ryu 控制器会分析 Packet-In 消息,特别是数据包的源 MAC 地址和它进入 OVS 的端口号,并将这个 MAC-to-Port 映射存储在自己的 self.mac_to_port 字典中。
- 决策:
- 如果数据包的目的 MAC 地址在 self.mac_to_port 中已知,Ryu 就知道应该将数据包转发到哪个端口。
- 如果目的 MAC 地址未知(例如 ARP 广播),Ryu 就会决定泛洪数据包到除了入端口之外的所有端口。
- 下发流规则:如果 Ryu 成功地学习到了源 MAC 和目的 MAC 的映射关系,并且决定直接转发(而不是泛洪),它就会通过 OpenFlow 协议向 OVS 网桥下发一条新的流规则。这条流规则告诉 OVS:“以后如果收到来自这个端口、目的 MAC 是这个地址的数据包,就直接转发到那个端口,不用再问我了。”
- 数据平面转发:一旦流规则被下发并安装到 OVS 的流表中,后续所有符合该流规则的数据包都将由 OVS 直接在数据平面进行高速转发,而不再需要经过控制器。这就是 SDN “控制平面与数据平面分离”的精髓所在:控制器只负责初始的决策和规则下发,实际的数据转发则由数据平面设备高效完成。