Skip to content

SDN

软件定义网络(Software-Defined Networking,SDN)不是某一种控制器,也不等同于 OpenFlow。更准确地说,它是一套网络可编程方法,通过把设备能力和网络状态通过接口暴露给软件,由软件完成策略计算、配置下发和运行状态反馈。

控制平面与转发平面的分离是 SDN 的基础,但这里的分离不是把所有控制逻辑都搬到一台服务器。实际系统往往是混合的,控制器负责全局策略,设备继续处理邻接维护、快速故障切换或协议报文。逻辑上集中,不代表物理上只能有一个控制器进程。

1 从配置设备到控制网络

传统网络通常围绕单台设备展开。管理员登录交换机或路由器,逐条修改 VLAN、路由、ACL 和队列参数。设备数量少时,这套方法直接有效。规模扩大后,真正难处理的不是某一条命令,而是多台设备之间的状态是否一致。

SDN 把操作对象从某台设备的配置提高到整个网络应该呈现什么行为。应用先表达路径、访问控制或流量调度要求,控制系统再把这些要求转换成设备能够执行的规则。这样做并没有消除网络协议,而是把重复配置、全局计算和状态协调交给软件。

2 一条完整的控制链路

只看到了流表操作容易漏掉一半。一个可运行的 SDN 系统至少要形成下面这条链路:

text
策略与应用
    |
    v
控制器或编排系统 ------ 计算路径、生成配置、处理冲突
    |
    v
控制与管理接口 -------- P4Runtime、NETCONF、gNMI、OpenFlow 等
    |
    v
交换机、路由器、软件转发器、SmartNIC
    |
    v
计数器、事件、流式遥测、INT
    |
    +--------------------> 分析结果并调整策略

只有下发没有反馈,本质上仍是自动化配置。把设备状态和数据平面观测结果送回控制系统,才能进一步做拥塞绕行、异常检测或动态负载均衡。不过,是否自动执行调整要由业务风险决定。不少生产网络仍会把分析和变更审批分开。

3 现代 SDN 系统有哪些部分

3.1 应用与策略

这一层描述网络要做什么,例如为业务选择路径、隔离租户、限制带宽或阻断异常流量。应用不应依赖某一台交换机的端口编号,而应尽量使用拓扑、端点、租户和服务等更稳定的对象。

3.2 控制与编排

控制器维护网络视图,把上层策略转换成设备规则,并处理拓扑变化、主备切换和状态同步。所谓逻辑集中,指的是应用看到统一的控制入口。控制器内部完全可以由多个节点组成,也可以按地域或功能分层部署。

3.3 接口与数据模型

不同接口解决的问题并不相同:

接口或模型主要用途
P4Runtime管理 P4 流水线配置及表项、计数器、Meter、Digest 等运行时实体
NETCONF / YANG用模型描述并修改设备配置
gNMI读取和订阅模型化状态,也可提交配置更新
OpenFlow控制交换机中由规范定义的匹配与动作对象

它们可以同时存在。P4Runtime 适合控制可编程转发流水线,但端口、机框、证书和设备发现通常还要交给管理接口或厂商系统。

3.4 数据平面

数据平面真正处理每一个包。它可以是硬件交换芯片、虚拟交换机、软件转发器,也可以是 SmartNIC。控制器决定规则,设备按照本地流水线在线速路径上执行。遇到新流时再逐包询问控制器,通常无法满足高吞吐和低时延要求。

3.5 观测系统

端口计数器只能说明某处发生了变化,不一定能说明某个包经过了什么。流式遥测、事件通知和 INT 提供了更细的状态来源,但采集粒度越高,设备、网络和后端的处理成本也越高。遥测方案需要在可见性与开销之间做取舍。

4 从 OpenFlow 到 PDP

早期 SDN 经常与 OpenFlow 放在一起讨论。OpenFlow 让控制器可以通过统一协议操作交换机流表,证明了转发规则能够由外部软件集中管理。不过,设备能够解析哪些报头、有哪些表和动作,仍主要由协议及芯片流水线预先规定。

P4 把可编程范围向数据平面内部推进了一步。开发者可以描述报文如何解析、表如何匹配、动作如何修改字段,以及处理完成后如何重新组装报文。P4 程序决定流水线的结构,P4Runtime 则在运行期间安装规则、读取状态并接收异步消息。两者分工不同,不能互相替代。

INT 建立在可编程数据平面(Programmable Data Plane,PDP)之上。节点可以按指令记录路径、端口、时延或队列状态,再把数据交给监控系统。它补上了“控制器如何知道数据平面刚刚发生了什么”这一环,但遥测结果仍需经过聚合、判断和策略执行,才会形成闭环。

5 一个 P4 网络如何启动

以 BMv2 和 P4Runtime 为例,一次较完整的启动过程通常是:

  1. 编译 P4 程序,得到目标设备配置和 P4Info。
  2. 启动交换机,为各端口接入测试主机或其他交换机。
  3. 控制器连接 P4Runtime 服务,完成主备仲裁并确认协议版本。
  4. 控制器下发转发流水线配置,再依据 P4Info 写入表项。
  5. 数据包进入设备,经过 Parser、控制块和 Deparser 完成转发。
  6. 计数器、Digest、PacketIn 或 INT 报告把运行状态送回控制侧。
  7. 控制应用根据新状态保留、修改或撤销已有规则。

这条流程能把 P4、P4Runtime 和 INT 放到同一张图里理解。它只是可编程网络的一种实现,不代表所有 SDN 系统都必须使用 P4。

6 常见部署方式

集中式控制

一组控制器掌握完整或接近完整的网络视图,统一计算路径和策略。它便于做全局优化,但需要认真处理控制器扩展、状态一致性和故障恢复。

分层控制

本地控制器处理区域内事件,上层控制器负责跨区域协调。大规模网络常用这种方式限制状态传播范围,代价是层级之间必须定义清楚责任边界。

混合控制

设备继续运行 BGP、OSPF 或本地保护机制,控制器只接管流量工程、策略和自动化管理。它更容易接入现有网络,也能在控制器暂时不可用时保留基本转发能力。

7 适合解决什么问题

  • 流量工程:根据链路利用率、时延或业务等级调整路径。
  • 数据中心网络:批量配置交换设备,并让网络状态跟随计算资源变化。
  • 安全策略:集中维护访问控制、隔离规则和异常流处置逻辑。
  • 网络遥测:结合流式状态与包级路径信息定位拥塞、丢包和微突发。
  • 协议与算法实验:在软件交换机或可编程设备上验证新报头、新转发行为和控制逻辑。

SDN 并不会自动带来性能提升。收益来自更一致的策略、更短的变更路径和更完整的状态反馈。如果控制逻辑、数据模型和回滚机制没有设计好,集中化反而会放大错误影响。

8 工程上最容易低估的部分

状态一致性

控制器中的期望状态、设备上的实际状态和遥测系统看到的状态可能来自不同时间点。重连、超时和部分失败都会让三者偏离,控制程序必须能够读取、比较并修复差异。

更新过程

一次策略变更往往涉及多台设备。规则按什么顺序写入、失败后如何回滚、旧流量如何排空,都会影响更新期间是否出现环路、黑洞或策略穿透。

设备能力

硬件流水线有表容量、阶段数、动作和带宽限制。同一份 P4 程序能否编译、能达到多高性能,仍取决于目标架构和芯片资源,协议无关并不等于硬件无关。

安全边界

控制接口拥有改变全网行为的权限。身份认证、加密传输、角色划分、操作审计和最小权限不是附加功能,而是控制系统能够上线的前提。

可验证性

实验环境中写入一条表项很简单,证明一组策略在拓扑变化和设备故障下始终正确则困难得多。单元测试、仿真、配置检查和变更后的数据平面验证需要一起做。

9 本站笔记的阅读顺序

  1. Mininet:搭建可重复的虚拟拓扑,熟悉主机、交换机和控制器之间的连接。
  2. P4 Language:理解 Parser、Control、Table、Action 和 Deparser 如何组成转发流水线。
  3. P4Runtime:学习控制器如何配置流水线、写入实体并接收异步事件。
  4. P4 INT:继续研究数据平面如何采集并导出逐跳状态。
  5. iPerf:生成可控流量,检查吞吐、时延和丢包表现。

如果目标是先跑通实验,可以从 Mininet 和 iPerf 开始。

10 参考资料

Released under the MIT License.