关于openflow流表

软件定义网络(SDN)的核心——OpenFlow协议是如何识别并处理数据流的

核心

简单来说,OpenFlow交换机中的流表 (Flow Table) 存储了一系列的流表项 (Flow Entry)。每个流表项就像一条规则,它规定了“如果一个数据包看起来像A,就对它执行操作B”。

具体来说,一个流表项包含三个核心部分:

  1. 匹配字段 (Match Fields):用来定义数据包的特征,也就是图中的“首部字段值”,它从数据链路层、网络层一直到传输层提取关键信息来识别不同的“流”。

  2. 计数器 (Counters):用于统计有多少数据包和字节匹配了这条规则。

  3. 动作 (Actions):规定了匹配成功后要执行的操作,例如转发到特定端口、修改包头或丢弃。


流表格式详解:匹配、计数、动作

我们把流表的结构拆开来看,它就是一张由多行“规则”组成的表格。每一行,就是一个流表项。

1. 匹配字段 (Match Fields) - “找谁?”

这是流表项的灵魂,它定义了一个数据“流”的特征。当一个数据包进入OpenFlow交换机,交换机会提取其各层头部信息,与流表中的每一条规则的“匹配字段”进行比对。

正如你提供的图片所示,OpenFlow 1.0版本定义了一个包含11个(加上入端口共12个)核心字段的元组(Tuple)来作为匹配的依据。我们来详细解析这11个“首部字段值”:

层次 字段名称 英文名/缩写 长度/类型 解释与作用
物理层 入端口 Ingress Port 16位 数据包从交换机的哪个物理端口进入。这是最基本、最重要的匹配字段。
数据链路层 源MAC地址 Eth Src 48位 识别发送方的设备(网卡)。
目的MAC地址 Eth Dst 48位 识别下一跳接收方的设备。
类型 Eth Type 16位 标识上层协议类型。例如0x0800代表IPv4,0x0806代表ARP,0x86DD代表IPv6。
VLAN ID VLAN ID 12位 虚拟局域网的标识符,用于隔离广播域。
优先级 VLAN Priority 3位 VLAN标签中的PCP字段,用于定义服务质量(QoS)。
网络层 (IP) 源IP地址 IP Src 32位 识别数据包的原始发送主机。
目的IP地址 IP Dst 32位 识别数据包的最终接收主机。
协议 IP Protocol 8位 标识IP数据报承载的上层协议。例如6代表TCP,17代表UDP,1代表ICMP。
服务类型 ToS Bits 8位 IP头部的服务类型字段,用于指定数据包的转发优待(如低延迟、高吞吐量)。
传输层 源端口 TCP/UDP Src Port 16位 识别发送方的应用程序。例如HTTP的80端口。
目的端口 TCP/UDP Dst Port 16位 识别接收方的应用程序。

关键点

2. 计数器 (Counters) - “来了多少?”

每个流表项都有一组关联的计数器,用于网络监控和管理。

控制器可以定期查询这些计数器,以了解网络流量的状况,例如哪些应用流量最大,哪些路径最繁忙等。

3. 动作 (Actions) - “怎么办?”

一旦数据包匹配了某个流表项,交换机就会执行该表项定义的“动作集”。


工作流程示例

  1. 一个HTTP请求包(目的TCP端口为80)进入交换机的1号端口。

  2. 交换机提取其头部信息:入端口=1, 目的MAC=..., 类型=IPv4, 目的IP=..., 协议=TCP, 目的端口=80 ...

  3. 交换机在流表中查找规则。假设找到一条规则,其匹配字段为 目的IP=服务器IP目的端口=80

  4. 匹配成功!

  5. 交换机更新该规则的计数器(包数+1,字节数增加)。

  6. 交换机执行该规则的动作,例如 修改目的MAC为下一跳路由器MAC,从5号端口转发出去

  7. 数据包被处理完毕。整个过程在硬件中完成,速度极快。