OpenFlow1.0交换机流表
OpenFlow交换机中的转发表称为流表(Flow Table),列表中的每个条目称为表项,每个表项包括三个域,包头域(header field),计数器(counters),行动(actions)。
包头域Head Fields:
数据包匹配特征:
- 一层:交换机入端口(Ingress Port)
- 二层:源MAC地址(Ether source)、目的MAC地址(Ether dst)、以太网类型(Ether Type)、VLAN标签(VLAN id)、VLAN优先级(VLAN priority)
- 三层:源IP(IP src)、目的IP(IP dst)、IP协议字段(IP proto)、IP服务类型(IPToS bits)
- 四层:TCP/UDP源端口号(TCP/UDP src port)、TCP/UDP目的端口号(TCP/UDP dst port)
包头域/匹配字段
简单来说,除了进接口,传统2层到4层的寻址信息都出现在包头域中(MAC、IP、PORT)。也就是说,OpenFlow交换机相比传统网络中的交换机,是一个比较模糊的概念,不在区分交换机、路由器等。OpenFlow交换机可以广义理解为OpenFlow转发设备(交换机。路由器、防火墙)。
计数器Counters:
主要对每张表,每个端口。每个流等进行技术,方便流量管理。(例如某张表查了多少次?匹配这个流的数据包有多少了?)
动作Actions:
即对匹配到的流进行处理,传统网络中要么转发要么丢弃,没有第三种选择,OpenFlow1.0提供多种行动,前两个必备:
丢弃(Drop)
没有明确指明处理行动的表项,所匹配的所有网包默认丢弃。
转发(Forward)
- ALL转发到所有出口(不包括入口)
- CONTROLLER封装并转发给控制器
- LOCAL转发给本地网络栈
- TABLE对要发出的包执行流表中的行动
- IN PORT从入口发出
可选行动-转发
NORMAL按照传统交换机的二层或三层进行转发处理。
FLOOD通过最小生成树从出口泛洪发出,注意不包括入口。
可选行动-入队(Enqueue)
将转发包绑定到某个端口的队列中。
可选行动-修改包头(Modify field)
- SET_VLAN_VID 修改VLAN标签
- SET_VLAN_PCP 修改VLAN优先级
- STRIP_VLAN 弹出VLAN标签
- SET_DL_SRC 修改源MAC地址
- SET_DL_DST 修改目的MAC地址
- SET_NW_SRC 修改源IP地址
- SET_NW_DST 修改目的IP地址
- SET_NW_TOS 修改IP服务类型字段
- SET_TP_SRC 修改源端口号
- SET_TP_DST 修改目的端口号
注意:这是跟传统网络最大的区别,OpenFlow可以对数据包头进行修改!
流表匹配(1.1版本引入):
流表匹配(table 0------->table n):
-
匹配到:直接执行相应动作(Actions)
-
未匹配到:通过安全通道交付给控制器处理
OpenFlow1.3
openflow使用多级流表,每张流表有独立的序号,从序号最小的流表开始匹配,每张流表由独立的处理和动作。
- 匹配域Match Fields
它是之前1.0的拓展,匹配的内容除了2到4层的寻址信息(MAC,IP,PORT),多了MPLS(城域网),IPV6,PBB,Tunnel ID等支持。1.0能匹配12个信息,1.3能匹配39个信息
- 优先级Priority
用于标志流表匹配的优先顺序,优先顺序越高越早匹配,默认优先级为0
- 计数器Counters
主要对每张表,每个端口,每个流等进行计数,方便流量监管,在原有1.0的基础上,加入了对每一个组,每一个动作集(队列)的计数
- 超时时间Timeout
用于标志该流表项老化的时间,超过了时间限制就删除,节省了内存资源
- 附属信息Cookie
由控制器选择的不透明数据值。控制器用来过滤流统计数据,流改变和流删除,但处理数据包时不能使用
- 指令Instructions:(与1.0版本的最重要区别就是引入了指令)
Require Instructions:
Write-Actions action(s):将制定的行动添加到正在运行的行动集中
Goto-Table next-table-id:指定流水线处理进程中的下一张表中的ID(流水线pipeline定义:多级流表的匹配)
Apply-Actions action(s):立即执行指定的行动,而不改变指令集(。这个指令经常用来修改数据包,在两个表之间或者执行同类型的多个行动的时候)
Optional Instructions:
Merter merter id:直接将计流量包丢弃
Clear-Actions:在行动集中立刻清楚所有的动作
Write-Meterdata meterdata/mask:在元数据区域纪录元数据
动作Action
Require Action:
Outport:报文输出到指定端口
Drop:丢弃
Group:用组表处理报文
Optional Action:
Set-Queue:设置报文的队列ID,为了QoS的需要
Push-Tag/Pop-Tag
Set-Field:设置报文包头的类型和和修改包头的值
Change-TTL:修改TTL的值
- 动作执行的顺序(动作集Action Set):
-
copy TTL inwards: apply copy TTL inward actions to the packet
-
pop: apply all tag pop actions to the packet
-
push-MPLS: apply MPLS tag push action to the packet
-
push-PBB: apply PBB tag push action to the packet
-
push-VLAN: apply VLAN tag push action to the packet
-
copy TTL outwards: apply copy TTL outwards action to the packet
-
decrement TTL: apply decrement TTL action to the packet
-
set: apply all set-field actions to the packet
-
qos: apply all QoS actions, such as set queue to the packet
-
group: 如果指定了组行动,那么按照这个序列中的顺序执行组行动存储段里的行动。
-
output: 如果没有指定组行动,报文就会按照 output 行动中指定的端口转发。
Output 行动最后执行。如果组行动和输出行动均存在,那么组行动优先级高。如果两者均 不存在,那么报文被丢弃。
流表匹配:
理解:1.3版本引入指令集后,当匹配到相应流表项时,不再直接执行Actions而是将Actions添加到指令的Action set中,并继续匹配,直至全部匹配完后,再统一执行指令的Action set。