SDN 与 OpenFlow
SDN 与 OpenFlow
一个全球骨干网升级要花多久
2012 年 Google 决定把全球骨干网从 40G 升级到 100G。按传统方式,运维团队要登录全球 100+ 个 POP(Point of Presence)节点的每台路由器,逐台升级配置——预估工期 18 个月,升级期间网络不能停。
Google 没这么干。他们用 SDN(Software Defined Networking,软件定义网络)重新设计了骨干网——所有路由器由一个集中控制器管理,升级时间从 18 个月压缩到 3 个月。
控制器在新版本发布后,自动推送配置到全球所有路由器,每台路由器自己重启加载,流量自动切换。运维只需要点一个按钮。
这一章讲 SDN 怎么把网络的"控制面"和"数据面"分离,OpenFlow 协议怎么工作,Google 怎么用 SDN 重构骨干网,SDN 在企业网和数据中心的应用。
问题一:传统网络为什么"改个路由这么难"
传统网络(OSPF、BGP)每个路由器独立决策。路由器之间通过路由协议交换信息,自动计算路径。
问题 1:分布式决策难以优化全局。
每个路由器只看邻居信息,不知道全网拓扑。流量调度只能"局部最优"——路由器 A 选到 B 的最短路径,但全网来看 A→C→D→B 才是空闲路径。全局最优 vs 局部最优矛盾。
问题 2:配置复杂。
新增一条流策略要登录多台路由器敲命令。ACL、QoS、路由策略要保持一致。配置漂移(不同路由器配置不一致)是常见故障。
问题 3:新功能上线慢。
想加个新协议或新算法?等厂商在路由器操作系统里实现,3-5 年。运营商新业务上线卡在设备厂商。
问题 4:故障定位难。
网络出问题要一台台路由器查日志、抓包,平均定位时间 4-8 小时。
SDN 解决思路:把"决策"(控制面)从"执行"(数据面)分离出来,集中控制器做决策,路由器只管执行。
问题二:SDN 的三层架构
SDN 架构分三层:
┌──────────────────────────────────┐
│ 应用层(Application) │
│ 路由应用、负载均衡、防火墙、流量工程 │
└──────────────┬───────────────────┘
│ 北向 API(RESTful、gRPC)
┌──────────────↓───────────────────┐
│ 控制层(Control Plane) │
│ SDN 控制器(ONOS、ODL、Faucet) │
│ - 全网拓扑 │
│ - 路径计算 │
│ - 策略管理 │
└──────────────┬───────────────────┘
│ 南向 API(OpenFlow、NETCONF、P4RT)
┌──────────────↓───────────────────┐
│ 数据层(Data Plane) │
│ 交换机、路由器(Open vSwitch、Cisco)│
│ - 包转发 │
│ - 流表匹配 │
└──────────────────────────────────┘控制层(SDN 控制器):
- 全网拓扑视图
- 集中决策(路径、流表、ACL)
- 维护网络状态
- 代表实现:ONOS(ON.Lab)、OpenDaylight(Linux Foundation)、Faucet(面向园区网)
数据层(交换机/路由器):
- 只管按流表转发包
- 接收控制器的流表项
- 上报拓扑、统计、故障
- 代表实现:Open vSwitch(OVS)、白盒交换机(Edgecore、H3C)
南向 API(控制器 → 设备):
- OpenFlow:最早的 SDN 协议(2008 年斯坦福)
- NETCONF/YANG:IETF 标准
- P4:新的可编程数据面语言
北向 API(应用 → 控制器):
- RESTful API、gRPC
- 应用可以是 Python/Java/Go 写的网络应用
问题三:OpenFlow 怎么工作
OpenFlow 是 SDN 的标志性协议(2008 年 Stanford Clean Slate 计划)。
核心思想:交换机不跑路由协议,只维护一张流表。流表由控制器下发。
流表项结构:
┌─────────────────────────────────────────────────┐
│ Match Fields(匹配字段) │
│ - 入端口 │
│ - 源/目的 MAC │
│ - 源/目的 IP │
│ - 源/目的端口 │
│ - VLAN ID │
│ - L3/L4 协议类型 │
├─────────────────────────────────────────────────┤
│ Priority(优先级) │
├─────────────────────────────────────────────────┤
│ Counters(统计:包数、字节数、时长) │
├─────────────────────────────────────────────────┤
│ Instructions(动作) │
│ - 转发到指定端口 │
│ - 丢弃 │
│ - 修改包头(改 MAC、改 VLAN) │
│ - 转发给控制器 │
└─────────────────────────────────────────────────┘包处理流程:
[包到达交换机]
↓
[查流表:第一条匹配项优先级最高]
↓
命中?──是──→ [执行动作:转发/丢弃/修改]
↓ 否
[查下一条流表项]
↓
[所有流表项都未命中]
↓
[执行 Table-miss 动作:通常发给控制器]
↓
[控制器决策:下发新流表项给交换机]Packet-in 消息:
交换机收到无法匹配的包,整个包打包发给控制器。控制器决策后下发的流表项告诉交换机"这个包以及后续同样的包怎么处理"。
典型场景:
主机 A → 主机 B 的第一个包
→ 交换机查流表,未命中
→ 交换机把包发给控制器
→ 控制器计算路径:A → Switch 1 → Switch 2 → B
→ 控制器下发流表项:Switch 1 端口 1 → 端口 2;Switch 2 端口 1 → 端口 2
→ 后续包直接按流表转发,不再问控制器优势:
- 快速决策:第一个包延迟可能 10-50ms(控制器往返),后续包微秒级
- 全网一致:所有交换机按同一策略
- 新业务快:写个 Python 脚本调用控制器 API,几小时上线新功能
问题四:Google B4 SDN 实践
Google B4(SIGCOMM 2013 论文公开)是全球最大规模的 SDN 部署之一——Google 全球数据中心之间的骨干网。
背景:
2012 年 Google 全球 12 个数据中心互联,承载 Google Search、YouTube、Gmail 的跨数据中心流量。流量特点:
- 流量大(10 Tbps+ 总带宽)
- 流量突发(某个时间点某个机房流量暴增)
- 流量矩阵复杂(机房间互相访问,模式难预测)
传统 BGP 路由问题:
- BGP 选路只看 AS 路径长度,不看带宽利用率
- 链路利用率不均,热门链路 80% 利用率,冷门链路 20%
- 扩容要等运营商部署,新业务上线慢
SDN 解决方案:
Google 用 SDN 控制器实时计算全局最优路径,按链路利用率动态调度。
B4 架构:
┌────────────────────────────────────┐
│ SDN 控制器(Quagga + Web) │
│ - 全网拓扑和流量矩阵 │
│ - 实时路径计算(每 100ms 重算) │
│ - OpenFlow 下发流表 │
└──────┬──────────────────────┬──────┘
│ │
[数据中心 A] [数据中心 B]
├─ ToR 交换机 ├─ ToR 交换机
├─ Aggregation 交换机 ├─ Aggregation 交换机
└─ 边界 SDN 交换机 └─ 边界 SDN 交换机
│ │
└──── 100G 专线 ────────┘关键技术:
1. 自研白盒交换机:
Google 不买 Cisco/Juniper,用白盒交换机(Bare metal switch)+ 自研操作系统。每个 POP 几十台白盒交换机,硬件成本降低 50%+。
2. OpenFlow 协议:
控制器通过 OpenFlow 1.0 下发流表。Google 在 OpenFlow 基础上扩展了多级流表和ECN 拥塞通知。
3. 流量工程:
控制器每 100ms 重算路径,让链路利用率控制在 50-70%(不超 80% 留 buffer)。
4. 故障恢复:
BGP 协议下链路故障收敛 10-30 秒。SDN 下控制器 1 秒内重新计算路径,下发新流表。
结果:
- 链路利用率从 30-40% 提升到 70%
- 新业务上线从 6 个月缩短到几小时
- 单端口成本下降 50-70%
问题五:SDN 在企业的应用
1. 数据中心 SDN
VMware NSX、Cisco ACI、Juniper Contrail 是商用 SDN 方案:
- 虚拟网络叠加在物理网络之上
- 租户隔离(VXLAN + OpenFlow)
- 微分段(micro-segmentation):每个 VM 独立 ACL
2. 园区网 SDN
Cisco DNA Center、华为 Agile Campus、Aruba Central:
- 集中管理 AP、交换机
- 自动配置新设备(零接触部署)
- 用户/设备身份策略(基于 802.1X)
3. WAN SDN(SD-WAN)
Cisco Viptela、VMware Velocloud、Versa Networks:
- 企业总部和分支通过 SD-WAN 互联
- 智能选路(哪条链路质量好走哪条)
- 减少 MPLS 专线依赖
4. 5G 网络
5G 核心网本身就是 SDN 架构(参考前文 5G 章节)。运营商用 SDN + NFV 部署网络切片。
问题六:SDN 的挑战和未来
挑战 1:控制器单点故障
控制器是全网大脑,挂了全网瘫痪。实际部署都用控制器集群(ONOS 集群、ODL 集群),主备切换秒级。
挑战 2:南北向协议标准不统一
OpenFlow 各厂商实现有差异,互通难。业界趋势:
- 控制面用 ONOS/ODL 等开源控制器
- 数据面用 P4 编程(更灵活)
- 南向协议向 gNMI/OpenConfig 收敛
挑战 3:性能和扩展性
OpenFlow 控制器集中决策,每秒能下发的流表项有限(典型 10K 流/秒)。大规模网络需要分层控制(多个控制器分级管理)。
未来:意图驱动网络(IBN)
IBN(Intent-Based Networking)是 SDN 的进化版:
- 运维告诉网络"我要让北京到上海的延迟 <10ms"
- 控制器自动翻译成底层配置
- 自动监控、自动修复
代表产品:Cisco DNA Center、Juniper Apstra。
思考题
- SDN 控制器集中决策看起来很美好,但所有包都要问控制器会让网络慢。OpenFlow 实际怎么处理这个问题?第一个包 vs 后续包延迟差异多大?
- Google B4 用 SDN 后链路利用率从 30% 提到 70%。但利用率高意味着拥塞风险高。B4 怎么平衡利用率和拥塞?ECN 拥塞通知怎么工作?
- 假设你设计一个校园网 SDN 系统。5000 个用户、200 个 AP、50 台交换机。要用 OpenFlow 还是 P4?控制器选 ONOS 还是 Faucet?为什么?
- SDN 控制器挂了怎么办?用主备、双活、还是分布式集群?分别有什么优劣?设计一个控制器故障时网络仍能工作 5 分钟的方案。
- SD-WAN 用 SDN 思想改造企业 WAN。某公司总部在上海,分支在北京、广州、深圳。SD-WAN 怎么选路:视频会议走 MPLS 专线,普通上网走 Internet?怎么保证视频质量?
- 5G 核心网是 SDN 化的,但运营商有几千台传统设备(4G EPC、传输网)。运营商怎么把传统设备纳入 SDN 体系?是替换还是网关代理?
延伸阅读
- 《SDN 核心技术剖析与实战指南》机械工业出版社
- SIGCOMM 2008: OpenFlow: Enabling Innovation in Campus Networks(OpenFlow 原始论文)
- SIGCOMM 2013: B4: Experience with a Globally-Deployed Software Defined WAN(Google B4 论文)
- SIGCOMM 2015: Jupiter Rising: A Decade of Clos Topologies and Centralized Control in Google's Datacenter Network
- ONOS 文档:https://opennetworking.org/onos/
- Open vSwitch 文档:https://www.openvswitch.org/
- 动手实验:用 Mininet + Open vSwitch 搭建迷你 SDN 网络(参考
mininet教程) - 动手实验:用 ONOS 控制器管理 OVS 交换机,写一个 Python 应用控制流表