Day 3 学习笔记

Day 2 我们了解了 OpenFlow 作为南向接口协议的角色。今天我们深入 OpenFlow 的内部机制,搞清楚三个核心问题:

  1. 流表的内部结构是什么样的?
  2. 数据包进入交换机后,匹配流程到底是怎么走的?
  3. 除了流表,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 匹配优先级

当一张流表中有多条规则都能匹配时:

  1. 最精确匹配优先:匹配字段越多的规则优先级越高
  2. 显式优先级:每条流表项都有一个 priority 值,数值越大越优先
  3. 相同优先级:匹配最早的那条(先入先出)

四、动作集(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 实验环境,动手验证流表转发

参考资料

  1. 《深度解析SDN:利益、战略、技术、实践》—— 第4章
  2. 《重构网络:SDN架构实现》—— 第2~3章
  3. 左青云. 基于OpenFlow的SDN技术研究.
  4. Lara, E. et al. “Network Innovation using OpenFlow: A Survey.” IEEE Communications Surveys & Tutorials, 2013.
  5. OpenFlow 1.3 Specification

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

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