Day 2 学习笔记

Day 1 我们从宏观上了解了 SDN 是什么、三层架构长什么样。今天我们主要搞清楚三个关键问题:

  1. 控制层和数据层到底是怎么解耦的?
  2. 南向接口、北向接口、东西向接口分别干了什么?
  3. OpenFlow 作为最主流的南向协议,它的基本工作原理是什么?

一、控制层与数据层解耦

1.1 回顾:传统网络的"紧耦合"

Day 1 提到,传统网络中每台设备同时承担控制和转发两个角色。这种设计带来了一个根本问题:你改不了

想换一种路由算法?得等厂商出新固件。想加一条安全策略?得逐台设备配置。设备的"大脑"和"身体"绑死在一起,改不了也换不了。

1.2 解耦之后变成什么样

SDN 把控制逻辑从每台设备中抽出来,集中到一个叫控制器(Controller) 的软件里。数据层的设备(交换机、路由器)只保留转发能力,变成"听话的执行者"。

打个比方:

  • 解耦前:每个士兵既要想战术又要打仗,各打各的
  • 解耦后:将军(控制器)统一指挥,士兵(交换机)只管执行命令

这种分离带来了三个直接好处:

好处 说明
灵活性 控制器是软件,想改就改,不用动硬件
集中管理 一个控制器管一片网络,配置一次全网生效
开放创新 控制器向上暴露 API,任何人都能开发网络应用

二、控制器:SDN 的大脑

控制器是整个 SDN 的核心,它承担了传统网络中分散在每台设备上的所有控制功能。

2.1 控制器的主要职责

  • 全网拓扑发现:自动探测网络中有哪些设备、链路怎么连接
  • 路径计算:根据全局视图计算最优转发路径
  • 流表下发:把计算好的转发规则通过南向接口写入交换机
  • 状态监控:实时掌握链路状态、流量情况、设备健康度
  • 北向 API:向上层应用提供调用接口

2.2 常见的 SDN 控制器

控制器 语言 特点 适用场景
Ryu Python 轻量、易上手 学习和原型开发
Floodlight Java 功能完善、社区活跃 企业级实验
ONOS Java 分布式、运营商级 大规模网络部署
OpenDaylight Java 模块化、企业级 企业网络和NFV

对于初学者,Ryu 是最推荐的入门选择。它基于 Python,代码简洁,官方教程也很完善,后面搭建 Mininet 实验环境时会用到。


三、三大接口

SDN 架构中有三个方向的接口,它们构成了控制器与外部世界交互的通道。

3.1 南向接口(Southbound API)

方向:控制器 -> 数据层

南向接口是控制器和交换机之间的通信通道。控制器通过南向接口向交换机下发流表规则,告诉交换机"遇到什么样的数据包,执行什么样的动作"。

目前最主流的南向接口协议是 OpenFlow(后面会详细讲)。除了 OpenFlow,还有 NETCONF、gRPC、P4Runtime 等协议。

3.2 北向接口(Northbound API)

方向:应用层 -> 控制器

北向接口是控制器向上层应用暴露的能力。网络应用通过调用北向 API 来获取网络状态、下发策略。

北向接口通常以 REST API 的形式提供。比如你可以写一个 Python 脚本,调用控制器的 REST API 来:

  • 查询网络拓扑
  • 下发流表规则
  • 获取流量统计

这就让网络变成了"可编程"的——想实现什么网络功能,写个应用调 API 就行。

3.3 东西向接口(East-West API)

方向:控制器 <-> 控制器

当网络规模很大时,一个控制器可能管不过来,需要部署多个控制器。东西向接口就是控制器之间用来协同的通道。

比如:

  • 主控制器挂了,备用控制器接管(高可用)
  • 不同区域的控制器共享拓扑信息(分布式协调)

东西向接口目前没有统一的标准协议,各控制器通常自定义实现。

3.4 三大接口一览

          北向接口 (REST API)
              |
    ┌─────────┴─────────┐
    │                   │
  应用层              应用层
 (流量工程)         (安全防护)
    │                   │
    └─────────┬─────────┘
              |
     ┌────────┴────────┐
     │   控制器 (Controller)  │←——→ 东西向接口 ←——→ 其他控制器
     └────────┬────────┘
              |
          南向接口 (OpenFlow)
              |
    ┌────┬────┬────┐
    │    │    │    │
  交换机 交换机 交换机 交换机

四、OpenFlow 协议入门

OpenFlow 是目前最主流的 SDN 南向接口协议,由斯坦福大学于 2008 年提出。理解 OpenFlow 是理解 SDN 工作原理的关键。

4.1 核心概念:流表

OpenFlow 交换机的核心是流表(Flow Table)。流表可以理解为一张"规则表",每条规则定义了:

  • 匹配字段:什么样的数据包匹配这条规则(源IP、目的IP、端口号等)
  • 优先级:多条规则都能匹配时,优先级高的赢
  • 动作:匹配后做什么(转发、丢弃、修改、发给控制器)
  • 计数器:这条规则被命中了多少次

4.2 数据包的处理流程

当一个数据包进入 OpenFlow 交换机时:

数据包进入
    |
    v
查找流表(按优先级从高到低匹配)
    |
    ├── 匹配成功 ──→ 执行动作(转发 / 丢弃 / 修改)
    |
    └── 没有匹配 ──→ Packet-In:发给控制器,让控制器决定怎么处理

这个流程就是 SDN 的核心工作机制:

  1. 默认情况下,交换机按流表规则自动转发
  2. 遇到没见过的数据包,交给控制器决策
  3. 控制器计算好路径,通过 OpenFlow 把新规则写入交换机

4.3 OpenFlow 的版本演进

版本 时间 主要变化
1.0 2009 第一个正式版本,单流表
1.3 2012 多级流表、组表、计量表,目前最广泛使用
1.5 2015 增强 egress 流表,当前最新版本

初学阶段重点关注 OpenFlow 1.0 和 1.3 的区别即可。

4.4 举个例子

假设你要让交换机把来自 192.168.1.0/24 网段的 HTTP 流量(端口 80)从端口 3 转发出去,控制器下发的流表规则大致是:

匹配字段 动作 优先级
src_ip=192.168.1.0/24, tcp_dst=80 output:3 100

交换机收到这条规则后,所有匹配的 HTTP 数据包都会从端口 3 转发,不再需要问控制器。


五、SDN 工作的完整流程

把以上知识串起来,SDN 的完整工作流程是:

  1. 控制器启动,通过南向接口发现网络拓扑
  2. 控制器构建全网视图,知道有哪些交换机、主机、链路
  3. 主机 A 想给主机 B 发数据,数据包进入交换机
  4. 交换机查流表,没找到匹配规则(第一次通信)
  5. 交换机发 Packet-In 给控制器,报告"有个新数据包不知道怎么处理"
  6. 控制器计算路径,决定从哪个端口转发
  7. 控制器发 Flow-Mod 给交换机,下发新的流表规则
  8. 交换机按新规则转发后续同类数据包,不再问控制器

前几个数据包会慢一些(需要控制器介入),但之后的通信都是交换机自主高速转发。


六、今日学习总结

项目 内容
阅读 《深度解析SDN》第3章 — 控制层与数据层解耦
阅读 《重构网络 SDN架构实现》第1章 — SDN 架构总览
精读 OpenFlow: From Concept to Implementation — 前半部分
核心收获 理解控制层/数据层解耦的意义,三大接口的职责,OpenFlow 流表机制
待深入 明天继续学习 OpenFlow 协议的细节(流表、组表、计量表)

参考资料

  1. 《深度解析SDN:利益、战略、技术、实践》—— 第3章
  2. 《重构网络:SDN架构实现》—— 第1章
  3. Lara, E. et al. “OpenFlow: From Concept to Implementation.” IEEE Communications Surveys & Tutorials, 2013.
  4. SDNLAB SDN 指南

本文是「SDN 入门学习计划」Day 2 的学习笔记。

学习路线:Day 1 SDN 是什么 → Day 2 SDN 架构深入 → Day 3 OpenFlow 协议详解 → Day 4 Mininet 实验 → …