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

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

Chapter 4-3 的主线是网络层数据平面的进一步抽象。前面已经讨论过,传统路由器在收到 IP 数据报后,通常根据目的 IP 地址查转发表,再把分组送往某个输出端口。但现实网络中的设备远不止传统路由器:交换机、防火墙、NAT、负载均衡器、缓存、入侵检测系统等都会在数据路径上处理分组。

这些设备看起来功能不同,但从更抽象的角度看,它们都在做一件类似的事:

1
2
3
4
5
检查分组头部中的某些字段

匹配某条规则

执行对应动作

因此,本节的核心问题是:

1
能否用一个统一模型描述各种网络设备对分组的处理逻辑?

答案就是通用转发:匹配 + 动作。SDN 和 OpenFlow 则把这种抽象进一步系统化、可编程化,使网络控制逻辑可以从传统设备中分离出来,由控制器集中计算并下发规则。


❗ 本节核心结论: Chapter 4-3 的核心不是“又学一种路由表”,而是理解网络设备处理分组的统一抽象:根据字段匹配规则,再执行转发、丢弃、修改、复制、上送控制器等动作。

1. 从传统转发到通用转发

传统 IP 路由器的工作方式可以简化为:

1
目的 IP 地址 → 查转发表 → 输出端口

这就是基于目的地址的转发。它关注的是“这个分组要去哪个目的网络”,主要依赖目的 IP 地址和最长前缀匹配。

但现实网络设备经常需要做更复杂的判断。例如:

  • 防火墙需要根据源 IP、目的 IP、TCP/UDP 端口决定是否允许流量通过;
  • NAT 需要根据 IP 地址和端口号改写地址映射;
  • 交换机需要根据 MAC 地址转发或泛洪;
  • 负载均衡器需要把请求分配到不同后端服务器;
  • 入侵检测系统需要观察流量特征并触发告警;
  • 缓存设备可能直接响应请求,而不是继续转发。

这些行为不能简单归结为“看目的 IP 后转发”。因此,传统转发模型过窄,无法统一描述现代网络中的多种设备功能。

通用转发把问题抽象为:

1
match → action

也就是:

  1. 分组到达设备;
  2. 设备读取分组头部字段;
  3. 在规则表中查找匹配项;
  4. 找到匹配项后执行对应动作;
  5. 更新统计信息。

这张图体现了通用转发的基本逻辑:设备不再被限制为只看目的 IP,而是可以根据多层字段执行不同动作。


❗ 本节核心结论: 传统转发是通用转发的一个特例;通用转发把路由器、交换机、防火墙、NAT 等设备都抽象为“匹配字段并执行动作”的系统。

2. 数据平面与控制平面的重新理解

学习 SDN 前,必须再次区分数据平面和控制平面。

数据平面负责处理已经到达设备的分组。它回答的问题是:

1
当前这个分组来了,我应该马上怎么处理?

控制平面负责决定网络整体策略。它回答的问题是:

1
整个网络应该如何转发?路径和规则应该如何生成?

可以用交通系统类比:

概念 类比 网络中的含义
数据平面 路口执行交通规则 分组到达设备后,按表项立即处理
控制平面 交通规划系统 计算路径、策略和规则
转发表/流表 路口指示牌 告诉设备匹配后该做什么

传统网络中,每台路由器通常同时包含控制平面和数据平面。路由器之间交换路由信息,各自运行路由协议,然后生成本地转发表。

SDN 则强调二者分离:

  • 数据平面设备负责高速执行规则;
  • 控制器负责从全局视角计算并下发规则;
  • 网络应用可以在控制器之上实现 routing、access control、load balancing 等逻辑。

这里的“集中”主要是逻辑集中,不一定意味着物理上只有一台控制器。真实部署中,控制器可以有多个实例,以保证性能和可靠性。


❗ 本节核心结论: 数据平面负责高速执行,控制平面负责生成规则;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
2
3
入端口 = 1
源 IP = 10.0.0.1
目的 TCP 端口 = 22

这类条件已经明显超出了传统路由表的表达范围。

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
2
3
4
5
6
7
8
9
网络应用提出策略

控制器收集或维护网络状态

控制器计算流表规则

控制器把规则下发给交换设备

交换设备按规则处理分组

在这个结构中:

  • 控制器负责“算”;
  • 交换设备负责“做”;
  • 网络应用负责表达更高层策略。

例如,一个访问控制应用可以告诉控制器:

1
禁止来自某个源 IP 的 SSH 流量

控制器把它转换成流表项:

1
2
3
source IP = x
TCP dst port = 22
action = drop

再下发到相关交换设备。

负载均衡应用也可以类似地把流量分配给不同服务器。路由应用则可以根据拓扑和链路状态计算路径,并把沿途交换机的流表项一起配置好。


❗ 本节核心结论: SDN 的可编程性来自控制逻辑的集中管理:网络策略先由应用表达,再由控制器转换为分布在各交换设备上的流表规则。

6. 一条路径不是由一个交换机单独实现的

在 OpenFlow 或 SDN 网络中,一条端到端路径不是靠某一个交换机“知道全部路径”来完成的,而是由沿途多个交换机上的流表规则共同实现。

可以把它理解成:

1
2
3
交换机 S1:看到某类分组 → 转发到 S2
交换机 S2:看到某类分组 → 转发到 S4
交换机 S4:看到某类分组 → 转发到目的主机

每个交换机只执行自己本地的规则,但这些规则组合起来,就形成了一条端到端路径。

这张图说明:控制器从全局视角计算路径,但真正的数据包仍然由每个交换机在本地按流表高速转发。

这也解释了一个常见误解:SDN 交换机不是完全没有智能。它不需要每来一个分组都询问控制器。绝大多数分组会直接匹配本地已有流表项,并在数据平面中快速处理。只有没有匹配规则、需要异常处理或需要控制器决策时,才可能把分组或事件上送控制器。


❗ 本节核心结论: SDN 中的端到端路径由多个交换机的本地流表规则共同实现;控制器负责配置规则,交换机负责高速执行规则。

7. Match + Action 如何统一各种网络设备

通用转发最重要的价值,是给各种网络设备提供了共同语言。

设备 Match 看什么 Action 做什么
路由器 Router 目的 IP 前缀 转发到下一跳或输出接口
交换机 Switch 目的 MAC 地址 转发或泛洪
防火墙 Firewall IP 地址、协议类型、端口号 允许、丢弃或阻塞
NAT IP 地址、端口号 重写地址和端口
负载均衡器 Load Balancer 目的地址、端口、连接信息 改写目的服务器或分发请求
IDS 流量特征、协议字段 记录、告警或上报
缓存 Cache 请求内容、URL 或对象标识 返回缓存内容或继续转发

这些设备在工程实现上差异很大,但抽象结构相似:

1
2
3
4
5
看字段

匹配规则

执行动作

这就是为什么本节强调 generalized forwarding。它不是为了取代所有网络设备,而是为了提供一个能统一描述它们的概念框架。


❗ 本节核心结论: 路由器、交换机、防火墙、NAT 等设备功能不同,但都可以抽象为“匹配某些字段,然后执行某些动作”。

8. 中间盒:现实互联网不只是纯 IP 路由器

中间盒 middlebox 指的是:位于源主机和目的主机之间的数据路径上,执行普通 IP 路由器标准转发功能之外其他功能的设备。

典型中间盒包括:

  • NAT;
  • 防火墙;
  • 入侵检测系统 IDS;
  • 负载均衡器;
  • 缓存;
  • 应用专用中间盒;
  • CDN 相关设备。

传统互联网常被描述为“IP 沙漏”结构:

1
2
3
上层:很多应用和传输协议
中间:统一的 IP
下层:各种链路层和物理层技术

IP 是“细腰”,因为只要大家都支持 IP,不同上层应用和不同下层网络技术就能互联。

但现实网络逐渐变复杂了。路径中不再只有按 IP 地址转发的路由器,还插入了大量执行额外功能的设备。这些设备让网络不再是理论上极简的 IP 转发系统,而是带有安全、性能、管理、地址转换、内容分发等功能的复杂基础设施。

所谓“互联网的中年发福”,正是在形容这种变化:原本细腰的 IP 层周围,堆叠了越来越多中间功能。

这张图说明:现实数据路径上可能经过多个中间盒,每个中间盒都可能不只是简单转发,而是对流量进行额外处理。


❗ 本节核心结论: 中间盒说明现实互联网已经不只是单纯的 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
网络设备处理分组,本质上是在特定字段上匹配规则,并根据规则执行动作。