Roxy's Library

Back

本文内容基于 2025 秋季《计算机网络》课程讲述,如有差错,欢迎指正

传统网络与SDN#

回顾一下传统路由和SDN路由的区别:

  • 传统因特网,它的控制平面采用分布式的方式来进行计算,每个路由器独立运行路由算法,互相交换路由信息,计算出自己的路由表
  • 软件定义网络SDN有一个中心化的控制器,控制器收集整个网络的信息,进行全网的路由计算

传统网络的局限性#

在传统网络中,路由器作为独立的设备,运行分布式路由协议(如 OSPF、BGP),互相交互计算路由表。这种架构存在很多缺陷:

  1. 高度耦合,封闭系统:
    • 传统路由器是“黑盒子”,集成了专用硬件、专用操作系统和专用网络应用。
    • 不同厂商设备接口不兼容,配置和管理困难
    • 传统网络不可编程,很难实现高效、按需的数据传输
  2. 路由计算效率低:
    • 路由传递信息时间长,收敛速度慢,网络拓扑变化时需要较长时间才能稳定。
    • 现代网络设备数量庞大,分布式算法计算复杂度高
  3. 流量工程实现困难:
    • 流量工程:根据对传输流量的预测,规划流量的传输路径,以优化网络性能(如延迟、带宽利用率)
    • 流量工程的实现往往需要如线性规划、网络流等复杂算法
    • 传统路由协议(如 OSPF)通常基于最短路径(如链路权重),很难实现灵活的流量调度
    • 例如,想让某些流量走低延迟路径,某些流量走高带宽路径,或者在多条路径间做负载均衡,在传统网络中难以实现

因此,在2005年前后,人们对网络层结构进行了重新思考,提出了软件定义网络(SDN)的概念

SDN 的核心思想#

软件定义网络 (Software Defined Networking) 的核心愿景是将网络像软件一样进行编程和控制。其三大特征为:

  1. 控制平面与数据平面分离,控制平面由一个逻辑上集中的控制器负责,对整个网络的负载进行统一规划
  2. 抽象出了一种基于流表的通用转发技术,它可以由用户根据自己的需求来决定如何匹配和处理数据包
  3. 提供开放接口,用户可以对网络设备本身或整个网络的功能去进行编程

SDN 架构示意图

  • 北向接口(Northbound API):控制器向上提供给网络应用的接口
  • 南向接口(Southbound API):控制器向下与数据平面设备交互的接口,最常用的是 OpenFlow 协议

SDN 数据平面#

在 SDN 中,数据平面的每个路由器(SDN 交换机)维护一张流表(flow table) ,流表由控制器计算后写入每个路由器

抽象模型:流表#

流表的形式可以是任意的,每个流表项通常包含3个部分:

  • 头部:用于匹配报文
  • 计数器:表项统计信息
  • 动作:匹配成功后执行的操作

OpenFlow 流表#

目前最流行的流表结构是OpenFlow所定义的流表

OpenFlow的流表项由4部分组成

  • 模式:报文头中的匹配值
  • 动作:对于成功匹配的报文所进行的操作,包括转发、修改、丢弃、送往控制器
  • 优先级:当一个报文有多个匹配成功项时,定义优先顺序
  • 计数器:报文数、字节数

OpenFlow 流表结构

  • switch port: 报文从open flow交换机哪一个端口进来的

支持链路层(源/目的 MAC, EtherType)、网络层(源/目的 IP, Proto)、传输层(源/目的 Port)等多个字段进行匹配

这种匹配-动作模型非常灵活,可以统一实现各类网络设备

  • 实现路由器:匹配最长前缀 IP -> 转发
  • 实现交换机:匹配目的 MAC -> 转发 / 泛洪
  • 实现防火墙:匹配特定 IP 地址或端口 -> 丢弃 (Drop)
  • 实现 NAT: 匹配 IP 地址与端口 -> 修改 IP 地址与端口

OpenFlow 转发表配置示例

OpenFlow 协议仍有一些局限性:

  • 匹配字段、动作固定,不支持自定义扩展
  • 不支持“有状态处理”,无法记录过去的报文历史

后续出现了 P4 等更灵活的可编程数据平面技术

SDN 控制平面#

SDN 控制器采用层次化架构:

  • 底层与交换机去进行通信(南向接口)
  • 中层采用分布式数据库维护网络状态,屏蔽底层细节
  • 顶层向网络应用提供抽象的 API(北向接口)

SDN 控制平面架构

OpenFlow 协议#

OpenFlow定义了一套让控制器和交换机之间交互的协议,我们把它叫做OpenFlow协议,使用TCP进行传输

控制器到交换机的数据传输:

  • 读状态: 控制器查询交换机状态或数据,交换机需回复
  • 配置: 控制器设置交换机相关参数
  • 修改状态: 添加、删除、修改交换机流表项
  • Packet-out: 控制器通过交换机某个接口,发送数据报,即流量注入

交换机到控制器的数据传输:

  • 流删除:通知流表项已经删除
    • 流表项删除由控制器触发,或者超过存活周期
  • 端口状态: 上报交换机某个状态或统计信息
  • Packet-in: 将报文发送给控制器

当交换机收到一个数据包后发现流表中没有匹配项,交换机会将该数据包通过Packet-in消息发送给控制器,由控制器决定如何处理该数据包。 控制器处理完毕后可以通过Packet-out消息将数据包发送回交换机

此外,Packet-out消息还可以进行一些故障诊断等操作

传统路由 vs SDN 路由#

特性传统路由 (Traditional)SDN 路由
架构分布式 (Distributed)集中式 (Centralized)
计算位置每个路由器独立计算控制器统一计算
算法路由算法 (LS/DV) 运行在路由器中路由算法运行在控制器中
交互路由器之间交换路由信息 (如 OSPF 报文)控制器收集拓扑,下发流表
灵活性差 (受限于标准协议)强 (可编程,自定义策略)
设备专用硬件,昂贵通用白盒交换机,便宜

SDN 整体示例#

  1. 交换机 S1 发生链路故障, 使用“端口状态”消息通知控制器
  2. SDN控制器收到该消息, 更新数据库里的链路状态消息
  3. 某个Dijkstra’s 路由算法应用通过北向接口注册了对链路状态的监听。此时,回调该路由算法
  4. Dijkstra’s 路由算法访问相关链路状态数据、网络拓扑数据,重新计算新路径
  5. Dijkstra’s 路由算法将新得到的路径,与流表数据库交互,生成新的流表项
  6. 控制器使用OpenFlow“修改状态”消息,将新的流表项安装至相关路由器
软件定义网络SDN
https://astro-pure.js.org/blog/csnet_net_chap4
Author GreyRat
Published at December 16, 2025
Comment seems to stuck. Try to refresh?✨