Day 3 学习笔记
Day 2 我们了解了 OpenFlow 作为南向接口协议的角色。今天我们深入 OpenFlow 的内部机制,搞清楚三个核心问题:
- 流表的内部结构是什么样的?
- 数据包进入交换机后,匹配流程到底是怎么走的?
- 除了流表,OpenFlow 还有哪些表类型?
一、OpenFlow 版本概览
在深入细节之前,先了解 OpenFlow 的几个关键版本:
| 版本 | 年份 | 关键变化 |
|---|---|---|
| 1.0 | 2009 | 第一个正式版本,单流表,功能基础 |
| 1.3 | 2012 | 多级流表、组表、计量表,目前最广泛使用 |
| 1.5 | 2015 | 增强 egress 流表,最新版本 |
目前学术界和工业界主要使用 OpenFlow 1.3,这也是我们学习的重点。
二、流表(Flow Table)
流表是 OpenFlow 交换机的核心。每条流表项定义了一条转发规则,告诉交换机"遇到什么样的包,怎么处理"。
2.1 流表项的结构
一条流表项由四个部分组成:
| 组成部分 | 作用 |
|---|---|
| 匹配字段(Match Fields) | 定义匹配条件:源/目的 MAC、IP、端口号等 |
| 优先级(Priority) | 多条规则都能匹配时,优先级高的赢 |
| 计数器(Counters) | 记录匹配到的包数量和字节数 |
| 动作集(Instructions/Actions) | 匹配后执行的操作 |
2.2 匹配字段详解
OpenFlow 1.0 支持 12 个匹配字段,OpenFlow 1.3 扩展到了 40 多个。常用的包括:
入端口 (Ingress Port)
─────────────────────
源 MAC 地址 (Eth Src)
目的 MAC 地址 (Eth Dst)
以太网类型 (Eth Type)
VLAN ID
VLAN 优先级
─────────────────────
源 IP 地址 (IP Src)
目的 IP 地址 (IP Dst)
IP 协议号 (IP Proto)
IP DSCP
IP ECN
─────────────────────
TCP/UDP 源端口 (Transport Src)
TCP/UDP 目的端口 (Transport Dst)
这些字段可以任意组合使用。比如你可以只匹配"目的 IP + TCP 端口",也可以匹配"入端口 + 源 MAC + VLAN ID",灵活度很高。
2.3 通配符
不是所有字段都需要精确匹配。OpenFlow 支持通配符:
- 精确匹配:
192.168.1.1— 只匹配这一个 IP - 前缀匹配:
192.168.1.0/24— 匹配整个网段 - 全匹配:
*— 任何值都匹配
三、流表匹配流程
这是 OpenFlow 最核心的机制。当一个数据包进入交换机时,处理流程如下:
3.1 完整流程图
数据包进入交换机
|
v
┌─────────────┐
│ 查找第 0 级流表 │ ← 从最低编号的流表开始
└──────┬──────┘
|
┌────┴────┐
| |
匹配成功 未匹配
| |
v v
执行动作 Packet-In
| 发送给控制器
| |
| v
| 控制器决策
| 下发 Flow-Mod
| |
v v
┌─────────────┐
│ 检查是否有 │
│ Goto-Table 指令│
└──────┬──────┘
|
┌────┴────┐
| |
有 无
| |
v v
跳转到下一级 数据包
流表继续匹配 离开交换机
3.2 关键概念:多级流表
OpenFlow 1.3 引入了多级流表,允许多张流表串联工作。数据包可以像过流水线一样,依次经过流表 0、流表 1、流表 2…
每一级流表执行特定功能:
| 流表 | 典型用途 |
|---|---|
| 流表 0 | 首次分类:区分 ARP、ICMP、TCP/UDP |
| 流表 1 | 按 IP 网段做进一步路由决策 |
| 流表 2 | 按端口号做访问控制 |
通过 Goto-Table 指令,数据包可以在多级流表之间跳转。这种设计让复杂的转发逻辑可以拆分成多个简单步骤,每张表负责一部分。
3.3 匹配优先级
当一张流表中有多条规则都能匹配时:
- 最精确匹配优先:匹配字段越多的规则优先级越高
- 显式优先级:每条流表项都有一个 priority 值,数值越大越优先
- 相同优先级:匹配最早的那条(先入先出)
四、动作集(Actions)
匹配成功后,交换机执行的动作。主要动作类型:
| 动作 | 说明 | 例子 |
|---|---|---|
| output | 从指定端口转发 | output:3 → 从端口 3 发出 |
| drop | 丢弃数据包 | 不指定 output 即为丢弃 |
| set-field | 修改包头字段 | 修改 VLAN ID、目的 MAC |
| push/pop-tag | 添加/移除标签 | 添加 VLAN 标签 |
| group | 转发到组表 | 用于广播、多播 |
一个流表项可以同时包含多个动作,按顺序依次执行。比如:先修改 VLAN 标签,再从指定端口转发。
五、组表(Group Table)
组表是 OpenFlow 1.3 引入的高级转发机制。当多个流表项需要执行相同的复杂动作时,可以把动作封装到组表中,流表项只需引用组 ID。
5.1 组表的四种类型
| 类型 | 用途 | 场景 |
|---|---|---|
| All | 所有端口都执行动作 | 广播、泛洪 |
| Select | 选择一个端口执行 | 负载均衡 |
| Indirect | 只有一个端口执行 | 高效复用 |
| Fast Failover | 优先执行活跃端口 | 链路冗余、故障切换 |
5.2 举个例子:广播
假设交换机要将一个 ARP 请求广播到所有端口。没有组表时,需要为每个端口写一条流表项。有了组表:
组表:Group ID = 1, Type = All
→ Bucket 1: output:1
→ Bucket 2: output:2
→ Bucket 3: output:3
流表项:match=* → group:1
只需一条流表项就能实现广播,大大简化了配置。
六、计量表(Meter Table)
计量表用于流量控制和 QoS(服务质量)。它可以对匹配的流量进行限速、优先级调度等操作。
6.1 工作原理
数据包 → 流表匹配 → 计量表(限速/标记) → 执行动作
计量表可以:
- 限速:超过阈值的包被丢弃或降级
- 标记:修改 DSCP 字段,标记不同服务等级
- 统计:统计各流量级别的包数量和字节数
6.2 典型场景
- 保证视频会议的带宽优先于文件下载
- 限制 P2P 下载的最高带宽
- 对不同租户的流量做差异化服务
七、控制器与交换机的通信
控制器和交换机之间通过 OpenFlow 消息通信,主要有三类消息:
7.1 控制器 → 交换机
| 消息 | 作用 |
|---|---|
| Features | 查询交换机能力(支持多少流表、端口数等) |
| Configuration | 设置交换机参数 |
| Modify-State | 增删改流表项(Flow-Mod) |
| Read-State | 读取流表、端口统计信息 |
| Packet-Out | 控制器通过交换机发送数据包 |
7.2 交换机 → 控制器
| 消息 | 作用 |
|---|---|
| Packet-In | 交换机遇到未知包,上送给控制器决策 |
| Flow-Removed | 流表项被删除时通知控制器 |
| Port-Status | 端口状态变化时通知控制器 |
| Error | 报告错误 |
7.3 对称消息
| 消息 | 作用 |
|---|---|
| Hello | 建立连接时互相打招呼 |
| Echo | 心跳检测,确认连接存活 |
| Experimenter | 厂商自定义扩展 |
7.4 一次完整的交互流程
1. 交换机启动,与控制器建立 TCP 连接
2. 双方交换 Hello 消息,协商 OpenFlow 版本
3. 控制器发送 Features-Request,查询交换机能力
4. 交换机回复 Features-Reply,报告支持的流表数、端口等
5. 控制器通过 Modify-State 下发初始流表规则
6. 数据包到达,交换机按流表转发
7. 遇到未知包 → Packet-In → 控制器决策 → Packet-Out / Flow-Mod
八、今日学习总结
| 项目 | 内容 |
|---|---|
| 阅读 | 《深度解析SDN》第4章 — OpenFlow 协议详解 |
| 阅读 | 《重构网络 SDN架构实现》第2~3章 — 流表、组表、计量表 |
| 精读 | 基于 OpenFlow 的 SDN 技术研究(左青云) |
| 快读 | Network Innovation using OpenFlow: A Survey |
| 核心收获 | 流表结构、多级流表匹配流程、组表四种类型、计量表与 QoS |
| 待深入 | 明天搭建 Mininet 实验环境,动手验证流表转发 |
参考资料
- 《深度解析SDN:利益、战略、技术、实践》—— 第4章
- 《重构网络:SDN架构实现》—— 第2~3章
- 左青云. 基于OpenFlow的SDN技术研究.
- Lara, E. et al. “Network Innovation using OpenFlow: A Survey.” IEEE Communications Surveys & Tutorials, 2013.
- OpenFlow 1.3 Specification
本文是「SDN 入门学习计划」Day 3 的学习笔记。
学习路线:Day 1 SDN 是什么 → Day 2 SDN 架构深入 → Day 3 OpenFlow 协议详解 → Day 4 Mininet 实验 → …