《计算机网络-自顶向下方法》4.4 泛化转发和SDN 读书笔记

目录


导语

  大家好呀~前面我们学了传统路由器的工作方式:根据目的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"抢了风头",但在今天的网络中仍然广泛存在,理解它们对理解真实网络至关重要。

  如果你觉得这篇笔记对你有帮助,欢迎点赞收藏~有问题也欢迎留言讨论,我们一起进步!

相关推荐
yonlingxu1 小时前
创客匠人深度陪跑案例:盘活存量 IP,解锁婚恋知识赛道第二增长曲线
网络·网络协议·tcp/ip
Java小白笔记1 小时前
Java 实现 ZIP 压缩包生成方案
java·开发语言·网络·7-zip
anxiao_m1 小时前
数据安全合规时代,企业跨网文件传输该如何落地
网络
库玛西2 小时前
深入浅出Linux select网络模型:从底层位图原理到C++面向对象高级封装
linux·服务器·网络·c++·ubuntu
实心儿儿2 小时前
Linux —— epoll(1)
linux·网络
Soari2 小时前
TSN网络之工业以太网协议测试
网络
s_w.h2 小时前
【 计网 】序列化与反序列化
linux·服务器·网络·算法·bash
物联通信量讯说3 小时前
5G会取代4G吗?物联网设备出海正在走向多网络融合
网络·物联网·5g
祖力553 小时前
网络编程:IO多路复用(select、poll、epoll)
linux·服务器·网络