计算机网络自顶向下方法38——网络层 泛化转发与SDN
网络层深度解析(七):泛化转发与SDN
传统IP转发是基于目的地址的“最长前缀匹配”。而SDN和OpenFlow引入的泛化转发,则极大地扩展了转发的决策维度,使网络变得可编程。
一、从传统转发到泛化转发
1. 传统转发(基于目的地转发)
-
匹配字段单一:主要依赖目的IP地址。
-
动作单一:只能将数据包从某个输出端口转发出去。
-
决策逻辑固定:路由器根据路由协议计算出的转发表工作,管理员无法自定义转发逻辑。
2. 泛化转发
-
核心思想:将转发抽象为一个 “匹配+动作” 的规则表。
-
匹配字段泛化:可以基于IP数据报、TCP/UDP报文段,甚至链路层帧的多达几十个首部字段进行匹配。
-
动作泛化:动作不再局限于“从某个端口转发”,而是一组丰富的操作集合。
二、OpenFlow:泛化转发的具体实现
OpenFlow是SDN架构中最为流行的南向接口协议。它规定了SDN控制器如何与交换机通信,以及交换机内部的流表应如何构建。
1. OpenFlow交换机的关键组件

-
流表:OpenFlow交换机的“大脑”,包含一系列的流表项。每个流表项就是一个“匹配+动作”规则。
-
安全通道:连接交换机与远程SDN控制器的接口,所有交互信息都通过此通道传输。
-
OpenFlow协议:在安全通道上运行,用于控制器与交换机之间通信(如控制器下发流表项、交换机向控制器发送事件)。
2. 流表项的结构:匹配+动作
a) 匹配字段
OpenFlow 1.0版本定义了10多个可匹配的首部字段,后续版本不断增加。主要包括:
-
链路层:入端口、源MAC地址、目的MAC地址、以太网类型。
-
网络层:源IP地址、目的IP地址、IP协议类型、IP服务类型。
-
传输层:源TCP/UDP端口、目的TCP/UDP端口。
关键特性:可以使用通配符,只匹配部分字段。
b) 动作集合
每个流表项都关联一个动作列表,指示交换机如何处理匹配的数据包。
-
转发:将数据包发送到指定的物理端口、或通过安全通道发送给控制器(
OUTPUT,ALL)。 -
丢弃:没有显式允许的流量默认丢弃(
DROP)。这是重要的安全特性。 -
修改字段:在转发前,可以修改数据包的某些首部字段(
SET_FIELD),如修改VLAN ID、IP地址(实现NAT)、TCP端口等。
三、运行中的OpenFlow示例
让我们通过几个具体的例子,来看OpenFlow如何实现复杂的网络功能。
场景设定:
-
一个OpenFlow交换机,端口1连接
10.0.0.0/24网络,端口2连接互联网。 -
SDN控制器已下发如下流表项:
| 优先级 | 匹配字段 | 计数器 | 动作 |
|---|---|---|---|
| 10 | IP源=10.0.0.0/24, IP协议=TCP, TCP目的端口=80 | 包数: 152 | OUTPUT: 2 |
| 5 | IP源=10.0.0.0/24, IP协议=TCP | 包数: 23 | OUTPUT: 2 |
| 1 | IP协议=TCP, TCP目的端口=22 | 包数: 0 | DROP |
| 0 | - | 包数: 10234 | CONTROLLER |
工作流程详解:
示例1:内部主机访问外部Web服务器
-
数据包到达:
{源IP: 10.0.0.2, 协议: TCP, 目的端口: 80, ...}从端口1进入。 -
匹配过程:
-
与流表项1匹配成功(源IP在
10.0.0.0/24,协议TCP,目的端口80)。
-
-
执行动作:交换机执行动作
OUTPUT: 2,将数据包从端口2转发出去。 -
更新计数器:流表项1的计数器“包数”增加。
示例2:内部主机SSH访问外部服务器
-
数据包到达:
{源IP: 10.0.0.2, 协议: TCP, 目的端口: 22, ...}从端口1进入。 -
匹配过程:
-
不匹配流表项1(目的端口不是80)。
-
不匹配流表项2(目的端口是22,不是任意端口)。
-
匹配流表项3(协议TCP,目的端口22)。
-
-
执行动作:交换机执行动作
DROP,丢弃该数据包。这实现了一条防火墙规则:“禁止所有SSH连接”。
示例3:第一个ARP请求
-
数据包到达:一个ARP广播帧从端口1进入。
-
匹配过程:
-
不匹配流表项1、2、3(因为它们都匹配IP和TCP字段)。
-
匹配流表项0(匹配所有)。
-
-
执行动作:交换机执行动作
CONTROLLER,通过安全通道将这个数据包封装在Packet-in消息中发送给SDN控制器。 -
控制器决策:控制器收到后,根据其全局视图,计算出一条新的转发规则,并通过Flow-mod消息下发给交换机,之后类似的ARP请求就可以直接转发了。
四、SDN控制器的核心职责
-
管理流表
-
通过
Flow-Mod消息添加、删除、修改流表项。
-
-
处理未知流
-
通过
Packet-In消息接收交换机上报的、没有匹配项的数据包,并做出决策。
-
-
维护网络视图
-
通过
Link-Layer Discovery Protocol等发现网络拓扑。 -
为每个流计算端到端路径。
-
-
提供北向API
-
向上层网络应用(如负载均衡、防火墙)提供编程接口。
-
总结:SDN与OpenFlow的价值
| 方面 | 传统网络 | SDN/OpenFlow网络 |
|---|---|---|
| 控制逻辑 | 分布式,在每个设备中 | 集中式,在控制器中 |
| 转发方式 | 基于目的IP地址 | 泛化转发(匹配+动作) |
| 网络视图 | 局部、不完整 | 全局、统一 |
| 管理与创新 | 配置复杂,创新缓慢 | 可编程,快速部署新功能 |
| 典型应用 | 传统路由器/交换机 | 数据中心、园区网 |
通过泛化转发和OpenFlow,SDN将网络从一个个独立的、配置复杂的“黑盒”,转变为了一个统一的、可编程的智能平台。管理员可以像编写软件一样定义网络行为,从而实现前所未有的灵活性、可控性和创新速度。
