Day 2 学习笔记
Day 1 我们从宏观上了解了 SDN 是什么、三层架构长什么样。今天我们主要搞清楚三个关键问题:
- 控制层和数据层到底是怎么解耦的?
- 南向接口、北向接口、东西向接口分别干了什么?
- 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 的核心工作机制:
- 默认情况下,交换机按流表规则自动转发
- 遇到没见过的数据包,交给控制器决策
- 控制器计算好路径,通过 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 的完整工作流程是:
- 控制器启动,通过南向接口发现网络拓扑
- 控制器构建全网视图,知道有哪些交换机、主机、链路
- 主机 A 想给主机 B 发数据,数据包进入交换机
- 交换机查流表,没找到匹配规则(第一次通信)
- 交换机发 Packet-In 给控制器,报告"有个新数据包不知道怎么处理"
- 控制器计算路径,决定从哪个端口转发
- 控制器发 Flow-Mod 给交换机,下发新的流表规则
- 交换机按新规则转发后续同类数据包,不再问控制器
前几个数据包会慢一些(需要控制器介入),但之后的通信都是交换机自主高速转发。
六、今日学习总结
| 项目 | 内容 |
|---|---|
| 阅读 | 《深度解析SDN》第3章 — 控制层与数据层解耦 |
| 阅读 | 《重构网络 SDN架构实现》第1章 — SDN 架构总览 |
| 精读 | OpenFlow: From Concept to Implementation — 前半部分 |
| 核心收获 | 理解控制层/数据层解耦的意义,三大接口的职责,OpenFlow 流表机制 |
| 待深入 | 明天继续学习 OpenFlow 协议的细节(流表、组表、计量表) |
参考资料
- 《深度解析SDN:利益、战略、技术、实践》—— 第3章
- 《重构网络:SDN架构实现》—— 第1章
- Lara, E. et al. “OpenFlow: From Concept to Implementation.” IEEE Communications Surveys & Tutorials, 2013.
- SDNLAB SDN 指南
本文是「SDN 入门学习计划」Day 2 的学习笔记。
学习路线:Day 1 SDN 是什么 → Day 2 SDN 架构深入 → Day 3 OpenFlow 协议详解 → Day 4 Mininet 实验 → …