本文内容基于 2025 秋季《计算机网络》课程讲述,如有差错,欢迎指正
传统网络与SDN#
回顾一下传统路由和SDN路由的区别:
- 传统因特网,它的控制平面采用分布式的方式来进行计算,每个路由器独立运行路由算法,互相交换路由信息,计算出自己的路由表
- 软件定义网络SDN有一个中心化的控制器,控制器收集整个网络的信息,进行全网的路由计算
传统网络的局限性#
在传统网络中,路由器作为独立的设备,运行分布式路由协议(如 OSPF、BGP),互相交互计算路由表。这种架构存在很多缺陷:
- 高度耦合,封闭系统:
- 传统路由器是“黑盒子”,集成了专用硬件、专用操作系统和专用网络应用。
- 不同厂商设备接口不兼容,配置和管理困难
- 传统网络不可编程,很难实现高效、按需的数据传输
- 路由计算效率低:
- 路由传递信息时间长,收敛速度慢,网络拓扑变化时需要较长时间才能稳定。
- 现代网络设备数量庞大,分布式算法计算复杂度高
- 流量工程实现困难:
- 流量工程:根据对传输流量的预测,规划流量的传输路径,以优化网络性能(如延迟、带宽利用率)
- 流量工程的实现往往需要如线性规划、网络流等复杂算法
- 传统路由协议(如 OSPF)通常基于最短路径(如链路权重),很难实现灵活的流量调度
- 例如,想让某些流量走低延迟路径,某些流量走高带宽路径,或者在多条路径间做负载均衡,在传统网络中难以实现
因此,在2005年前后,人们对网络层结构进行了重新思考,提出了软件定义网络(SDN)的概念
SDN 的核心思想#
软件定义网络 (Software Defined Networking) 的核心愿景是将网络像软件一样进行编程和控制。其三大特征为:
- 控制平面与数据平面分离,控制平面由一个逻辑上集中的控制器负责,对整个网络的负载进行统一规划
- 抽象出了一种基于流表的通用转发技术,它可以由用户根据自己的需求来决定如何匹配和处理数据包
- 提供开放接口,用户可以对网络设备本身或整个网络的功能去进行编程

- 北向接口(Northbound API):控制器向上提供给网络应用的接口
- 南向接口(Southbound API):控制器向下与数据平面设备交互的接口,最常用的是 OpenFlow 协议
SDN 数据平面#
在 SDN 中,数据平面的每个路由器(SDN 交换机)维护一张流表(flow table) ,流表由控制器计算后写入每个路由器
抽象模型:流表#
流表的形式可以是任意的,每个流表项通常包含3个部分:
- 头部:用于匹配报文
- 计数器:表项统计信息
- 动作:匹配成功后执行的操作
OpenFlow 流表#
目前最流行的流表结构是OpenFlow所定义的流表
OpenFlow的流表项由4部分组成
- 模式:报文头中的匹配值
- 动作:对于成功匹配的报文所进行的操作,包括转发、修改、丢弃、送往控制器
- 优先级:当一个报文有多个匹配成功项时,定义优先顺序
- 计数器:报文数、字节数

- switch port: 报文从open flow交换机哪一个端口进来的
支持链路层(源/目的 MAC, EtherType)、网络层(源/目的 IP, Proto)、传输层(源/目的 Port)等多个字段进行匹配
这种匹配-动作模型非常灵活,可以统一实现各类网络设备
- 实现路由器:匹配最长前缀 IP -> 转发
- 实现交换机:匹配目的 MAC -> 转发 / 泛洪
- 实现防火墙:匹配特定 IP 地址或端口 -> 丢弃 (Drop)
- 实现 NAT: 匹配 IP 地址与端口 -> 修改 IP 地址与端口

OpenFlow 协议仍有一些局限性:
- 匹配字段、动作固定,不支持自定义扩展
- 不支持“有状态处理”,无法记录过去的报文历史
后续出现了 P4 等更灵活的可编程数据平面技术
SDN 控制平面#
SDN 控制器采用层次化架构:
- 底层与交换机去进行通信(南向接口)
- 中层采用分布式数据库维护网络状态,屏蔽底层细节
- 顶层向网络应用提供抽象的 API(北向接口)

OpenFlow 协议#
OpenFlow定义了一套让控制器和交换机之间交互的协议,我们把它叫做OpenFlow协议,使用TCP进行传输
控制器到交换机的数据传输:
- 读状态: 控制器查询交换机状态或数据,交换机需回复
- 配置: 控制器设置交换机相关参数
- 修改状态: 添加、删除、修改交换机流表项
- Packet-out: 控制器通过交换机某个接口,发送数据报,即流量注入
交换机到控制器的数据传输:
- 流删除:通知流表项已经删除
- 流表项删除由控制器触发,或者超过存活周期
- 端口状态: 上报交换机某个状态或统计信息
- Packet-in: 将报文发送给控制器
当交换机收到一个数据包后发现流表中没有匹配项,交换机会将该数据包通过Packet-in消息发送给控制器,由控制器决定如何处理该数据包。 控制器处理完毕后可以通过Packet-out消息将数据包发送回交换机
此外,Packet-out消息还可以进行一些故障诊断等操作
传统路由 vs SDN 路由#
| 特性 | 传统路由 (Traditional) | SDN 路由 |
|---|---|---|
| 架构 | 分布式 (Distributed) | 集中式 (Centralized) |
| 计算位置 | 每个路由器独立计算 | 控制器统一计算 |
| 算法 | 路由算法 (LS/DV) 运行在路由器中 | 路由算法运行在控制器中 |
| 交互 | 路由器之间交换路由信息 (如 OSPF 报文) | 控制器收集拓扑,下发流表 |
| 灵活性 | 差 (受限于标准协议) | 强 (可编程,自定义策略) |
| 设备 | 专用硬件,昂贵 | 通用白盒交换机,便宜 |
SDN 整体示例#
- 交换机 S1 发生链路故障, 使用“端口状态”消息通知控制器
- SDN控制器收到该消息, 更新数据库里的链路状态消息
- 某个Dijkstra’s 路由算法应用通过北向接口注册了对链路状态的监听。此时,回调该路由算法
- Dijkstra’s 路由算法访问相关链路状态数据、网络拓扑数据,重新计算新路径
- Dijkstra’s 路由算法将新得到的路径,与流表数据库交互,生成新的流表项
- 控制器使用OpenFlow“修改状态”消息,将新的流表项安装至相关路由器