目录
- 导语
- 一、从传统转发到泛化转发
- [二、4.4.1 匹配(Match)](#二、4.4.1 匹配(Match))
- [三、4.4.2 操作(Action)](#三、4.4.2 操作(Action))
- [四、4.4.3 运行中的匹配加操作:OpenFlow例子](#四、4.4.3 运行中的匹配加操作:OpenFlow例子)
- 本节核心总结(必看)
- 结语
导语
大家好呀~前面我们学了传统路由器的工作方式:根据目的IP地址查找转发表,然后从对应端口转发出去。这种方式简单高效,但有一个大问题------太死板了!路由器只会根据目的IP转发,如果你想根据源IP、端口号、协议类型甚至应用层内容来做不同的处理,传统路由器根本做不到。
这一节我们要学的泛化转发(Generalized Forwarding)和软件定义网络(Software-Defined Networking,SDN) ,就是要打破这种死板。泛化转发让路由器可以根据数据包的任意字段 来匹配,然后执行任意操作------转发、丢弃、修改、复制、送到控制器......SDN则把控制平面从路由器中抽出来,放到集中控制器中,让网络变得可编程、可灵活管理。
SDN是近十年来网络领域最重要的变革之一。Google、微软、Facebook等大厂的数据中心网络都已经全面SDN化。理解SDN,就是理解现代网络的发展方向。准备好了吗?让我们看看网络是怎么从"硬编码"走向"可编程"的~

一、从传统转发到泛化转发
1. 传统转发的局限
传统路由器的转发逻辑很简单:
if (目的IP地址匹配前缀A) → 从端口1转发
else if (目的IP地址匹配前缀B) → 从端口2转发
else → 从默认端口转发
这种"只看目的IP"的转发方式在因特网早期是够用的------那时网络功能简单,只要把包送到目的地就行。但随着网络应用的多样化,人们需要更灵活的转发能力:
- 防火墙:根据源IP、目的端口决定是否丢弃数据包
- 负载均衡:把同一个目的IP的流量分发到多个服务器
- NAT:修改源IP和端口号
- QoS:根据协议类型(语音vs文件下载)给不同优先级
- 流量监控:把特定流量复制一份送到监控设备
传统路由器做不了这些事,所以网络中出现了各种"中间盒"(middlebox)------防火墙、负载均衡器、NAT设备、入侵检测系统等。每个中间盒都是一个专用设备,配置方式不同,管理复杂,扩展性差。
2. 泛化转发的思想
泛化转发的核心思想是:把转发逻辑抽象成**匹配+操作(Match+Action)**的模式。
- 匹配(Match):检查数据包的任意字段(不只是目的IP),看是否匹配某条规则
- 操作(Action):对匹配的数据包执行任意操作(不只是转发)
这样,路由器不再是一个"只会根据目的IP转发"的傻设备,而是一个可以灵活编程的"数据包处理机"。防火墙、负载均衡、NAT、QoS等功能,都可以通过不同的匹配+操作规则来实现,不需要额外的专用设备。
OpenFlow是泛化转发的典型实现,也是SDN的事实标准协议。下面我们详细学习OpenFlow的匹配和操作。
二、4.4.1 匹配(Match)
1. OpenFlow的匹配字段

OpenFlow定义了一组可以匹配的字段,覆盖了从链路层到传输层的各个层次:
链路层字段:
- 入端口(Ingress Port):数据包从哪个端口进来的
- 源MAC地址(Ether Source)
- 目的MAC地址(Ether Destination)
- VLAN ID(VLAN ID)
- VLAN优先级(VLAN Priority)
- 以太网类型(Ether Type):如0x0800表示IPv4,0x86DD表示IPv6
网络层字段:
- 源IP地址(IP Source)
- 目的IP地址(IP Destination)
- IP协议号(IP Protocol):如6表示TCP,17表示UDP
- IP服务类型(IP DSCP/ECN)
传输层字段:
- TCP/UDP源端口(TCP/UDP Source Port)
- TCP/UDP目的端口(TCP/UDP Destination Port)
每个字段可以指定具体值,也可以用通配符(wildcard,即"不关心这个字段")。比如一条规则可以只匹配目的IP=10.0.0.1,其他字段全部通配;也可以匹配源IP=192.168.1.0/24 AND 目的端口=80,实现更精确的控制。
2. 流表(Flow Table)
OpenFlow交换机中维护一张或多张流表(Flow Table),每张流表由多条**流表项(Flow Entry)**组成。每个流表项包含:
- 匹配字段(Match Fields):要匹配的数据包字段值
- 优先级(Priority):当多个流表项都匹配时,优先级高的生效
- 计数器(Counters):统计匹配的数据包数和字节数
- 操作(Instructions/Actions):匹配后要执行的操作
- 超时(Timeouts):流表项的过期时间
当一个数据包到达OpenFlow交换机时,交换机从第一张流表开始,按优先级从高到低查找匹配的流表项。找到后执行对应的操作。如果所有流表都没有匹配项,就把数据包发送给控制器(controller),由控制器决定怎么处理。
3. 匹配的实现------多级流表
早期的OpenFlow只有一张流表,所有匹配字段都在一张表里。但随着匹配字段越来越多,单张流表的TCAM成本太高(TCAM很贵且功耗大)。OpenFlow 1.3引入了多级流表(pipeline)------数据包依次经过多张流表,每张流表只匹配部分字段,前一张流表的处理结果可以传递给后一张流表。
多级流表的好处是:可以把复杂的匹配逻辑分解成多个简单步骤,降低TCAM的需求,提高灵活性。比如第一张流表只匹配入端口和VLAN ID,第二张流表匹配目的IP,第三张流表匹配传输层端口。
三、4.4.2 操作(Action)
1. OpenFlow的操作类型

匹配到流表项后,OpenFlow可以执行多种操作:
转发类操作:
- 转发到端口(Output Port):把数据包从指定端口发出去。这是最基本的操作,类似传统路由器的转发。
- 泛洪(Flood):把数据包从除入端口外的所有端口发出去,类似交换机的广播。
- 发送到控制器(Send to Controller):把数据包封装后发送给SDN控制器,由控制器决定如何处理。
丢弃类操作:
- 丢弃(Drop):直接丢弃数据包,不做任何处理。用于实现防火墙功能。
修改类操作:
- 修改字段(Set Field):修改数据包的任意字段,如修改源MAC、目的MAC、源IP、目的IP、VLAN ID、端口号等。用于实现NAT、负载均衡等功能。
- 压入/弹出标签(Push/Pop Tag):添加或移除VLAN标签、MPLS标签等。
复制类操作:
- 复制到多个端口:把数据包复制多份,从多个端口发出。用于实现流量镜像、多播等功能。
排队类操作:
- 设置队列(Set Queue):把数据包放到指定的输出队列中,用于实现QoS和流量调度。
2. 操作集(Action Set)
OpenFlow 1.3引入了**操作集(Action Set)**的概念------每个数据包在经过多级流表时,各张流表可以往操作集中添加操作,数据包离开流水线时统一执行操作集中的所有操作。
操作集的好处是:操作的执行顺序是固定的(先修改字段,再设置队列,最后转发),不会因为流表的顺序不同而产生歧义。这让多级流表的行为更可预测。
3. 组表(Group Table)
OpenFlow还支持组表(Group Table),用于实现更复杂的操作组合。一个组表项包含多个存储桶(bucket),每个桶有自己的操作集。组表有四种类型:
- All:执行所有桶的操作,用于多播/广播。
- Select:根据哈希算法选择一个桶执行,用于负载均衡。
- Indirect:所有流量都执行第一个桶的操作,用于间接转发。
- Fast Failover:根据端口状态选择第一个可用的桶,用于快速故障切换。
组表让OpenFlow可以实现负载均衡、快速故障切换等高级功能,不需要控制器实时干预。
四、4.4.3 运行中的匹配加操作:OpenFlow例子
1. 例子场景

让我们通过一个具体的例子来理解匹配+操作是怎么工作的。假设有一个简单的网络:
- 主机A(10.0.0.1)连接在交换机S1的端口1
- 主机B(10.0.0.2)连接在交换机S1的端口2
- 服务器C(10.0.0.3,提供Web服务,端口80)连接在交换机S1的端口3
- S1是一台OpenFlow交换机,连接到SDN控制器
2. 场景一:基本转发
主机A要给主机B发数据。第一个数据包到达S1的端口1时,S1查找流表,没有匹配项(因为是新流量),于是把数据包发送给控制器。
控制器收到数据包后,分析得知这是A到B的流量,于是计算出路径:从端口2转发。控制器向S1下发一条流表项:
匹配:入端口=1, 目的IP=10.0.0.2
操作:转发到端口2
优先级:100
同时,控制器把第一个数据包从端口2转发出去。后续A到B的数据包到达S1时,直接匹配这条流表项,从端口2转发,不需要再问控制器。这就是**反应式(reactive)**流表安装方式------第一个包触发控制器,后续包走流表。
3. 场景二:防火墙------阻止特定流量
假设管理员想阻止主机A访问服务器C的Web服务(端口80)。控制器可以预先下发一条流表项:
匹配:源IP=10.0.0.1, 目的IP=10.0.0.3, 协议=TCP, 目的端口=80
操作:丢弃
优先级:200
当A访问C的80端口时,数据包匹配这条高优先级规则,直接被丢弃。而A访问C的其他端口(如SSH的22端口)不匹配这条规则,走正常转发规则。这就实现了防火墙的功能,而且不需要额外的防火墙设备!
4. 场景三:负载均衡
假设有两台服务器C1(10.0.0.3)和C2(10.0.0.4)都提供Web服务,管理员想把流量平均分配到两台服务器上。控制器可以使用组表实现:
组表项(Select类型):
桶1:修改目的IP=10.0.0.3, 转发到端口3
桶2:修改目的IP=10.0.0.4, 转发到端口4
流表项:
匹配:目的IP=10.0.0.100(虚拟IP), 目的端口=80
操作:执行组表项1
当客户端访问虚拟IP 10.0.0.100的80端口时,交换机根据哈希算法选择一个桶,把目的IP改成对应的真实服务器IP,转发过去。这样就实现了负载均衡------同样不需要专用的负载均衡器!
5. 场景四:流量监控
管理员想监控所有从端口1进入的HTTP流量。控制器下发:
匹配:入端口=1, 协议=TCP, 目的端口=80
操作:转发到正常端口 + 复制一份到监控端口5
这样,所有HTTP流量既正常转发,又复制了一份送到监控设备做分析。这就是流量镜像(port mirroring)功能。
6. OpenFlow的优势总结
通过上面的例子可以看到,OpenFlow的匹配+操作模式非常强大:
- 统一平台:防火墙、负载均衡、NAT、QoS、监控等功能都可以在同一台OpenFlow交换机上实现,不需要各种专用中间盒。
- 集中管理:所有流表项由控制器统一管理,管理员可以在控制器上配置全网策略,自动下发到所有交换机。
- 灵活可编程:控制器可以用任意编程语言(Python、Java等)编写,实现复杂的网络逻辑,比如动态调整路由、自动故障切换、按应用调度流量等。
- 快速创新:新的网络功能不需要等待硬件厂商升级,只要在控制器上写程序就行,大大加快了网络创新的速度。
本节核心总结(必看)
这一节我们学习了泛化转发和SDN,核心要点如下:
一、泛化转发的思想
- 传统转发:只根据目的IP转发,功能死板
- 泛化转发:匹配+操作(Match+Action),可匹配任意字段,执行任意操作
- OpenFlow是泛化转发的典型实现
二、匹配(Match)
- 可匹配链路层、网络层、传输层的多个字段
- 字段可以指定值或通配
- 流表由多个流表项组成,每项有匹配字段、优先级、计数器、操作、超时
- 多级流表(pipeline)降低TCAM成本,提高灵活性
三、操作(Action)
- 转发类:转发到端口、泛洪、发送到控制器
- 丢弃类:丢弃数据包
- 修改类:修改任意字段、压入/弹出标签
- 复制类:复制到多个端口
- 排队类:设置队列实现QoS
- 组表实现负载均衡、快速故障切换等
四、OpenFlow例子
- 基本转发:第一个包送控制器,后续包走流表
- 防火墙:匹配特定流量执行丢弃
- 负载均衡:组表+修改目的IP
- 流量监控:复制流量到监控端口
关键概念清单
- SDN(软件定义网络):控制平面集中化,数据平面可编程
- OpenFlow:SDN的标准通信协议
- 泛化转发(Generalized Forwarding):匹配+操作模式
- 流表(Flow Table):OpenFlow交换机中的规则表
- 流表项(Flow Entry):流表中的一条规则
- 匹配字段(Match Fields):用于匹配的数据包字段
- 操作集(Action Set):统一执行的操作集合
- 组表(Group Table):复杂操作组合
- 控制器(Controller):SDN的控制平面核心
- TCAM:三态内容寻址存储器,高速流表查找
结语
这一节我们学习了泛化转发和SDN------网络领域近十年来最重要的变革。从传统的"目的IP转发"到OpenFlow的"匹配+操作",网络设备从专用的"黑盒子"变成了可编程的"通用平台"。SDN让网络管理变得集中化、自动化、灵活化,也催生了网络虚拟化、网络功能虚拟化(NFV)等一系列新技术。
今天,Google的数据中心网络(B4)、微软的Azure网络、AT&T的核心网都已经全面SDN化。SDN不再是实验室里的概念,而是真实支撑着数十亿用户上网的基础设施。理解SDN,就是理解了现代网络的发展方向。
下一节4.5我们将学习中间盒(Middlebox)------在SDN出现之前,人们是怎么用各种专用设备来实现防火墙、NAT、负载均衡等功能的。中间盒虽然被SDN"抢了风头",但在今天的网络中仍然广泛存在,理解它们对理解真实网络至关重要。
如果你觉得这篇笔记对你有帮助,欢迎点赞收藏~有问题也欢迎留言讨论,我们一起进步!