关于openflow流表
软件定义网络(SDN)的核心——OpenFlow协议是如何识别并处理数据流的。
核心
简单来说,OpenFlow交换机中的流表 (Flow Table) 存储了一系列的流表项 (Flow Entry)。每个流表项就像一条规则,它规定了“如果一个数据包看起来像A,就对它执行操作B”。
具体来说,一个流表项包含三个核心部分:
-
匹配字段 (Match Fields):用来定义数据包的特征,也就是图中的“首部字段值”,它从数据链路层、网络层一直到传输层提取关键信息来识别不同的“流”。
-
计数器 (Counters):用于统计有多少数据包和字节匹配了这条规则。
-
动作 (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位 | 识别接收方的应用程序。 |
关键点:
-
灵活性:这些字段不是必须全部匹配。你可以创建一条只匹配“目的IP地址”的规则,也可以创建一条同时匹配“源IP地址”和“目的TCP端口”的更精细的规则。这提供了巨大的灵活性。
-
跨层识别:从图中可以清晰地看到,OpenFlow的能力横跨了数据链路层、网络层和传输层,因此它可以实现比传统二层交换机(只看MAC地址)和三层交换机(只看IP地址)更复杂、更精细的流分类和控制。
2. 计数器 (Counters) - “来了多少?”
每个流表项都有一组关联的计数器,用于网络监控和管理。
-
匹配包数:自规则创建以来,有多少个数据包匹配了此规则。
-
匹配字节数:这些匹配的数据包总共包含多少字节。
-
活动时间:距离上一个数据包匹配此规则过去了多长时间。
控制器可以定期查询这些计数器,以了解网络流量的状况,例如哪些应用流量最大,哪些路径最繁忙等。
3. 动作 (Actions) - “怎么办?”
一旦数据包匹配了某个流表项,交换机就会执行该表项定义的“动作集”。
-
转发 (Forward):这是最常见的动作。
-
ALL
:泛洪(广播)到除入口外的所有端口。 -
CONTROLLER
:将数据包封装后发送给控制器。当交换机遇到一个“未知”的数据流(即流表中没有任何规则可以匹配它)时,通常会执行此操作,让“大脑”来决定如何处理。 -
TABLE
:转发到下一个流表进行处理(在支持多级流表的版本中)。 -
指定端口:转发到某一个或某几个具体的物理端口。
-
-
丢弃 (Drop):直接将数据包丢弃。这是实现网络安全策略(如防火墙)的基础。
-
修改字段 (Modify-Field):修改数据包的头部信息。例如,路由器在转发时修改源/目的MAC地址,或者NAT网关修改IP地址和端口号,这些都可以通过修改字段动作来实现。
工作流程示例
-
一个HTTP请求包(目的TCP端口为80)进入交换机的1号端口。
-
交换机提取其头部信息:
入端口=1
,目的MAC=...
,类型=IPv4
,目的IP=...
,协议=TCP
,目的端口=80
... -
交换机在流表中查找规则。假设找到一条规则,其匹配字段为
目的IP=服务器IP
且目的端口=80
。 -
匹配成功!
-
交换机更新该规则的计数器(包数+1,字节数增加)。
-
交换机执行该规则的动作,例如
修改目的MAC为下一跳路由器MAC,从5号端口转发出去
。 -
数据包被处理完毕。整个过程在硬件中完成,速度极快。