Chapter 4-3:通用转发、SDN 与中间盒

Chapter 4-3:通用转发、SDN 与中间盒
agsdChapter 4-3:通用转发、SDN 与中间盒
Chapter 4-3 的主线是网络层数据平面的进一步抽象。前面已经讨论过,传统路由器在收到 IP 数据报后,通常根据目的 IP 地址查转发表,再把分组送往某个输出端口。但现实网络中的设备远不止传统路由器:交换机、防火墙、NAT、负载均衡器、缓存、入侵检测系统等都会在数据路径上处理分组。
这些设备看起来功能不同,但从更抽象的角度看,它们都在做一件类似的事:
1 | 检查分组头部中的某些字段 |
因此,本节的核心问题是:
1 | 能否用一个统一模型描述各种网络设备对分组的处理逻辑? |
答案就是通用转发:匹配 + 动作。SDN 和 OpenFlow 则把这种抽象进一步系统化、可编程化,使网络控制逻辑可以从传统设备中分离出来,由控制器集中计算并下发规则。
❗ 本节核心结论: Chapter 4-3 的核心不是“又学一种路由表”,而是理解网络设备处理分组的统一抽象:根据字段匹配规则,再执行转发、丢弃、修改、复制、上送控制器等动作。
1. 从传统转发到通用转发
传统 IP 路由器的工作方式可以简化为:
1 | 目的 IP 地址 → 查转发表 → 输出端口 |
这就是基于目的地址的转发。它关注的是“这个分组要去哪个目的网络”,主要依赖目的 IP 地址和最长前缀匹配。
但现实网络设备经常需要做更复杂的判断。例如:
- 防火墙需要根据源 IP、目的 IP、TCP/UDP 端口决定是否允许流量通过;
- NAT 需要根据 IP 地址和端口号改写地址映射;
- 交换机需要根据 MAC 地址转发或泛洪;
- 负载均衡器需要把请求分配到不同后端服务器;
- 入侵检测系统需要观察流量特征并触发告警;
- 缓存设备可能直接响应请求,而不是继续转发。
这些行为不能简单归结为“看目的 IP 后转发”。因此,传统转发模型过窄,无法统一描述现代网络中的多种设备功能。
通用转发把问题抽象为:
1 | match → action |
也就是:
- 分组到达设备;
- 设备读取分组头部字段;
- 在规则表中查找匹配项;
- 找到匹配项后执行对应动作;
- 更新统计信息。
flowchart TD
A[分组到达设备] --> B[读取头部字段]
B --> C[匹配规则]
C --> D{是否匹配}
D -- 是 --> E[执行 action]
D -- 否 --> F[默认处理]
E --> G[更新 stats]
这张图体现了通用转发的基本逻辑:设备不再被限制为只看目的 IP,而是可以根据多层字段执行不同动作。
❗ 本节核心结论: 传统转发是通用转发的一个特例;通用转发把路由器、交换机、防火墙、NAT 等设备都抽象为“匹配字段并执行动作”的系统。
2. 数据平面与控制平面的重新理解
学习 SDN 前,必须再次区分数据平面和控制平面。
数据平面负责处理已经到达设备的分组。它回答的问题是:
1 | 当前这个分组来了,我应该马上怎么处理? |
控制平面负责决定网络整体策略。它回答的问题是:
1 | 整个网络应该如何转发?路径和规则应该如何生成? |
可以用交通系统类比:
| 概念 | 类比 | 网络中的含义 |
|---|---|---|
| 数据平面 | 路口执行交通规则 | 分组到达设备后,按表项立即处理 |
| 控制平面 | 交通规划系统 | 计算路径、策略和规则 |
| 转发表/流表 | 路口指示牌 | 告诉设备匹配后该做什么 |
传统网络中,每台路由器通常同时包含控制平面和数据平面。路由器之间交换路由信息,各自运行路由协议,然后生成本地转发表。
SDN 则强调二者分离:
- 数据平面设备负责高速执行规则;
- 控制器负责从全局视角计算并下发规则;
- 网络应用可以在控制器之上实现 routing、access control、load balancing 等逻辑。
flowchart TD
A[网络应用] --> B[SDN Controller]
B --> C[计算网络策略]
C --> D[下发流表规则]
D --> E[SDN Switches]
E --> F[按流表处理分组]
这里的“集中”主要是逻辑集中,不一定意味着物理上只有一台控制器。真实部署中,控制器可以有多个实例,以保证性能和可靠性。
❗ 本节核心结论: 数据平面负责高速执行,控制平面负责生成规则;SDN 的关键是把控制逻辑从交换设备中抽离出来,由逻辑集中的控制器管理。
3. 通用转发的核心:Match、Action、Stats
通用转发并不是只把转发表字段变多,而是把网络设备行为统一抽象为三部分:
1 | Match + Action + Stats |
3.1 Match:匹配哪些字段
Match 指设备用哪些头部字段判断一个分组是否符合某条规则。
匹配字段可以来自不同层次:
| 层次 | 可匹配字段 |
|---|---|
| 链路层 | 入端口、源 MAC、目的 MAC、VLAN |
| 网络层 | 源 IP、目的 IP、IP 协议字段、IP ToS |
| 传输层 | TCP/UDP 源端口、TCP/UDP 目的端口 |
传统路由器通常主要匹配目的 IP 前缀;通用转发则可以把多层字段组合起来。例如:
1 | 入端口 = 1 |
这类条件已经明显超出了传统路由表的表达范围。
3.2 Action:匹配后做什么
Action 指某条规则匹配成功后,设备要执行的动作。动作不只是转发,还可以包括:
- forward:转发到某个端口;
- drop:丢弃;
- modify:修改头部字段;
- flood:向多个端口泛洪;
- copy:复制分组;
- encapsulate and send to controller:封装后发送给控制器;
- block:阻塞;
- record:记录日志或统计信息。
因此,通用转发的“forwarding”不能狭义理解为“只转发”。它其实是在描述更一般的分组处理行为。
3.3 Stats:记录什么
Stats 指统计信息,例如:
- 匹配了多少个分组;
- 匹配了多少字节;
- 表项存在了多久;
- 最近一次匹配时间。
这些信息可以帮助控制器了解网络状态,也可以用于计费、监控、调试和策略调整。
❗ 本节核心结论: Match 决定“哪些分组属于这条规则”,Action 决定“匹配后怎么处理”,Stats 则记录“这条规则处理了多少流量”。
4. OpenFlow:把通用转发表达成流表
OpenFlow 可以理解为 SDN 中表达“匹配 + 动作”的一种具体机制。它把设备上的处理规则组织为流表 flow table。
一条 OpenFlow 流表项大致包含:
| 组成部分 | 含义 |
|---|---|
| Match | 匹配字段 |
| Action | 匹配后执行的动作 |
| Stats | 匹配统计信息 |
这和传统路由表有本质区别。传统路由表主要服务于 IP 路由转发,典型规则是:
1 | 目的 IP 前缀 → 下一跳 / 输出接口 |
而 OpenFlow 流表可以表达更广泛的规则。例如:
1 | 目的 IP = 51.6.0.8 → 从端口 6 转发 |
这是路由器式行为。
1 | 目的 TCP 端口 = 22 → drop |
这是防火墙式行为。
1 | 源 IP = 128.119.1.1 → drop |
这也是访问控制或防火墙式行为。
1 | 目的 MAC = 某地址 → 转发到某端口 |
这是交换机式行为。
OpenFlow 的关键意义在于:它不是给传统路由表换了一个名字,而是用统一格式表达多种网络设备功能。
❗ 本节核心结论: OpenFlow 流表不是更复杂的路由表,而是更通用的分组处理规则表;它用 Match、Action、Stats 统一表达路由、交换、防火墙等行为。
5. SDN 如何让网络变得可编程
传统网络中,路由、访问控制、负载均衡等功能常常分散在不同设备中。每台设备有自己的配置方式、控制逻辑和管理界面。网络管理员要改变策略时,往往需要分别配置多个设备,整体行为不容易统一推理。
SDN 试图改变这一点。它把网络控制逻辑上移到控制器,使网络策略可以像程序一样表达、计算和下发。
SDN 的基本工作流程是:
1 | 网络应用提出策略 |
在这个结构中:
- 控制器负责“算”;
- 交换设备负责“做”;
- 网络应用负责表达更高层策略。
例如,一个访问控制应用可以告诉控制器:
1 | 禁止来自某个源 IP 的 SSH 流量 |
控制器把它转换成流表项:
1 | source IP = x |
再下发到相关交换设备。
负载均衡应用也可以类似地把流量分配给不同服务器。路由应用则可以根据拓扑和链路状态计算路径,并把沿途交换机的流表项一起配置好。
❗ 本节核心结论: SDN 的可编程性来自控制逻辑的集中管理:网络策略先由应用表达,再由控制器转换为分布在各交换设备上的流表规则。
6. 一条路径不是由一个交换机单独实现的
在 OpenFlow 或 SDN 网络中,一条端到端路径不是靠某一个交换机“知道全部路径”来完成的,而是由沿途多个交换机上的流表规则共同实现。
可以把它理解成:
1 | 交换机 S1:看到某类分组 → 转发到 S2 |
每个交换机只执行自己本地的规则,但这些规则组合起来,就形成了一条端到端路径。
flowchart LR
H1[源主机] --> S1[交换机 S1]
S1 --> S2[交换机 S2]
S2 --> S4[交换机 S4]
S4 --> H2[目的主机]
C[SDN 控制器] -.下发规则.-> S1
C -.下发规则.-> S2
C -.下发规则.-> S4
这张图说明:控制器从全局视角计算路径,但真正的数据包仍然由每个交换机在本地按流表高速转发。
这也解释了一个常见误解:SDN 交换机不是完全没有智能。它不需要每来一个分组都询问控制器。绝大多数分组会直接匹配本地已有流表项,并在数据平面中快速处理。只有没有匹配规则、需要异常处理或需要控制器决策时,才可能把分组或事件上送控制器。
❗ 本节核心结论: SDN 中的端到端路径由多个交换机的本地流表规则共同实现;控制器负责配置规则,交换机负责高速执行规则。
7. Match + Action 如何统一各种网络设备
通用转发最重要的价值,是给各种网络设备提供了共同语言。
| 设备 | Match 看什么 | Action 做什么 |
|---|---|---|
| 路由器 Router | 目的 IP 前缀 | 转发到下一跳或输出接口 |
| 交换机 Switch | 目的 MAC 地址 | 转发或泛洪 |
| 防火墙 Firewall | IP 地址、协议类型、端口号 | 允许、丢弃或阻塞 |
| NAT | IP 地址、端口号 | 重写地址和端口 |
| 负载均衡器 Load Balancer | 目的地址、端口、连接信息 | 改写目的服务器或分发请求 |
| IDS | 流量特征、协议字段 | 记录、告警或上报 |
| 缓存 Cache | 请求内容、URL 或对象标识 | 返回缓存内容或继续转发 |
这些设备在工程实现上差异很大,但抽象结构相似:
1 | 看字段 |
这就是为什么本节强调 generalized forwarding。它不是为了取代所有网络设备,而是为了提供一个能统一描述它们的概念框架。
❗ 本节核心结论: 路由器、交换机、防火墙、NAT 等设备功能不同,但都可以抽象为“匹配某些字段,然后执行某些动作”。
8. 中间盒:现实互联网不只是纯 IP 路由器
中间盒 middlebox 指的是:位于源主机和目的主机之间的数据路径上,执行普通 IP 路由器标准转发功能之外其他功能的设备。
典型中间盒包括:
- NAT;
- 防火墙;
- 入侵检测系统 IDS;
- 负载均衡器;
- 缓存;
- 应用专用中间盒;
- CDN 相关设备。
传统互联网常被描述为“IP 沙漏”结构:
1 | 上层:很多应用和传输协议 |
IP 是“细腰”,因为只要大家都支持 IP,不同上层应用和不同下层网络技术就能互联。
但现实网络逐渐变复杂了。路径中不再只有按 IP 地址转发的路由器,还插入了大量执行额外功能的设备。这些设备让网络不再是理论上极简的 IP 转发系统,而是带有安全、性能、管理、地址转换、内容分发等功能的复杂基础设施。
所谓“互联网的中年发福”,正是在形容这种变化:原本细腰的 IP 层周围,堆叠了越来越多中间功能。
flowchart TD
A[源主机] --> B[防火墙]
B --> C[NAT]
C --> D[负载均衡器]
D --> E[缓存/CDN]
E --> F[目的服务器]
这张图说明:现实数据路径上可能经过多个中间盒,每个中间盒都可能不只是简单转发,而是对流量进行额外处理。
❗ 本节核心结论: 中间盒说明现实互联网已经不只是单纯的 IP 路由网络;路径中大量设备会执行安全、转换、缓存、负载均衡等额外功能。
9. 重要对比
9.1 基于目的地址的转发 vs 通用转发
| 对比点 | 基于目的地址的转发 | 通用转发 |
|---|---|---|
| 匹配字段 | 主要看目的 IP 地址 | 可看多个头部字段 |
| 使用表 | 转发表 forwarding table | 流表 flow table |
| 典型动作 | 转发到某个输出端口 | 转发、丢弃、修改、复制、发给控制器等 |
| 适用范围 | 传统路由器 | 路由器、交换机、防火墙、NAT 等 |
| 灵活性 | 较低 | 较高 |
| 管理复杂度 | 较低 | 较高 |
9.2 传统控制平面 vs SDN 控制平面
| 对比点 | 传统方式 | SDN 方式 |
|---|---|---|
| 控制逻辑位置 | 每台路由器内部 | 逻辑集中的控制器 |
| 数据平面位置 | 路由器本地 | 分组交换设备本地 |
| 控制与转发是否分离 | 不明显 | 明显分离 |
| 表项来源 | 路由器自己计算 | 控制器计算并下发 |
| 可编程性 | 较弱 | 较强 |
| 典型抽象 | 路由表 / 转发表 | 流表 |
9.3 转发表 vs 流表
| 对比点 | 转发表 | 流表 |
|---|---|---|
| 主要用途 | IP 路由转发 | 通用分组处理 |
| 匹配内容 | 通常是目的 IP 前缀 | 多层头部字段 |
| 典型动作 | 输出端口或下一跳 | 转发、丢弃、修改、封装给控制器等 |
| 表达范围 | 较窄 | 较广 |
| 典型场景 | 传统路由器 | SDN / OpenFlow |
❗ 本节核心结论: 通用转发扩展了传统转发的匹配字段和动作类型;SDN 扩展了传统控制平面的组织方式;流表扩展了传统转发表的表达能力。
10. 易混点集中整理
10.1 流表不是路由表换名
路由表主要回答:
1 | 去某个目的网络应该往哪里转发? |
流表可以回答更广泛的问题:
1 | 符合某些字段条件的分组应该如何处理? |
例如:
1 | 目的 TCP 端口 = 22 → drop |
这是防火墙规则,不是传统路由规则。
10.2 Action 不只是 forward
通用转发中的动作可以是转发,但也可以是丢弃、修改、复制、封装给控制器、泛洪或阻塞。把 action 只理解成“输出端口”会低估本节的核心抽象。
10.3 SDN 的集中是逻辑集中
SDN 控制器逻辑上集中管理网络,但物理上可以部署为多个控制器实例。不要把它机械理解成“整个网络只有一台控制器服务器”。
10.4 SDN 交换机不是每个包都问控制器
交换机本地有流表,能高速执行已有规则。只有未命中规则、异常流量或需要新决策时,才可能联系控制器。
10.5 中间盒不是普通路由器
普通路由器的标准功能是根据 IP 层信息进行转发。中间盒是在路径中执行额外功能,例如 NAT、过滤、缓存、检测、负载均衡。
10.6 OpenFlow 的重点不是应用层通信语法
OpenFlow 可以涉及控制器和交换机之间的通信,但本节重点是它如何表达数据平面的通用转发规则,而不是把它当成单纯的应用层协议来背。
❗ 本节核心结论: 本章最容易混淆的是“表”的层次:路由表用于传统路径转发,流表用于通用分组处理;SDN 不是让交换机失去执行能力,而是让控制逻辑更集中、更可编程。
11. 复习清单
学完本节后,应能回答:
- 数据平面和控制平面的区别是什么?
- 为什么 forwarding 是本地动作,而 routing 是网络范围内的逻辑?
- 传统基于目的地址的转发主要匹配什么字段?
- 通用转发为什么可以统一描述路由器、交换机、防火墙和 NAT?
- “匹配 + 动作”中的 match 可以包含哪些字段?
- “匹配 + 动作”中的 action 有哪些类型?
- OpenFlow 流表中的 Match、Action、Stats 分别表示什么?
- 为什么说 OpenFlow 流表不是普通路由表的简单改名?
- “目的 TCP 端口号为 22 的分组全部 drop”更像哪类设备的行为?
- SDN 中控制器和本地控制代理 CA 的关系是什么?
- SDN 的“控制平面和数据平面分离”到底是什么意思?
- 为什么 SDN 可以提高网络可编程性?
- 一条端到端路径为什么需要多个交换机上的流表规则共同实现?
- SDN 交换机是否每来一个分组都要询问控制器?
- 中间盒是什么?
- 中间盒和普通 IP 路由器有什么区别?
- 为什么说中间盒让互联网从“IP 沙漏”变得更复杂?
最终总结
Chapter 4-3 的核心是从传统转发走向通用转发。传统路由器主要根据目的 IP 地址查转发表,而现实网络需要根据更多字段执行更多动作。于是,网络设备可以被统一抽象为:
1 | Match + Action + Stats |
SDN 在这个基础上进一步把控制平面和数据平面分离:控制器负责从全局视角计算规则,交换设备负责按流表高速执行。OpenFlow 则提供了一种具体的流表表达方式,使路由、交换、防火墙、NAT 等功能都可以用“匹配 + 动作”的模型描述。
中间盒的出现说明,现实互联网早已不只是单纯的 IP 路由器网络。数据路径中存在大量执行额外功能的设备,这些设备让网络更强大,也更复杂。理解本节的关键,就是把这些复杂设备背后的共同结构看出来:
1 | 网络设备处理分组,本质上是在特定字段上匹配规则,并根据规则执行动作。 |








