floodlight修改流表(openflow流表原理)
一、修改openflow1.0中,流表流表流表的包头域中包括 ___ 个元组(tuple)。
openflow1.0中,原理流表的包头域中包括12个元组(tuple)。
openflow介绍如下:
OpenFlow,修改一种网络通信协议,流表流表属于数据链路层,原理能够控制网上交换器或路由器的修改转发平面forwarding plane,借此改变网络数据包所走的流表流表网络路径。
openflow的原理历史介绍如下:
OF的最初概念始于2008年的斯坦福大学。到2009年12月,修改OpenFlow交换规范1.0版发布。流表流表自成立以来,原理OpenFlow一直由开放网络基金会(ONF)管理,修改ONF是流表流表一个致力于开放标准和SDN应用的用户主导型组织。
自其发布以来,原理多家公司和OpenDaylight Project等开源项目都支持OpenFlow,甚至还提供了OpenDaylight控制器。思科和博科等其他公司也提供使用OF的控制器,以及Cisco XNC和Brocade Vyatta控制器。
openflow的概论介绍如下:
OpenFlow能够启动远程的控制器,经由网络交换器,决定网络数据包要由何种路径通过网络交换机。这个协议的发明者,将它当成软件定义网络(Software-defined networking)的启动器。
OpenFlow允许从远程控制网络交换器的数据包转送表,透过新增、修改与移除数据包控制规则与行动,来改变数据包转送的路径。
比起用访问控制表(ACLs)和路由协议,允许更复杂的流量管理。同时,OpenFlow允许不同供应商用一个简单,开源的协议去远程管理交换机(通常提供专有的接口和描述语言)。
OpenFlow协议用来描述控制器和交换机之间交互所用信息的标准,以及控制器和交换机的接口标准。协议的核心部分是用于OpenFlow协议信息结构的集合。
二、OpenFlow流表是什么
流表项中用来描述匹配后的处理方式是OpenFlow体系结构。
OpenFlow由斯坦福大学研究者提出一种应用于SDN架构的关键协议,核心理论就是将之前完全由交换机/路由器控制的数据包的转发过程,转变为由OpenFlow交换机和控制服务器分别完成的独立过程。主要由OpenFlow交换机和控制服务器两部分组成,OpenFlow规范主要分为四个部分。
OpenFlow允许从远程控制网络交换器的数据包转送表,透过新增、修改与移除数据包控制规则与行动,来改变数据包转送的路径。比起用访问控制表以及路由协议,允许更复杂的流量管理。同时,OpenFlow允许不同供应商用一个简单、开源的协议去远程管理交换机(通常提供专有的接口和描述语言)。
流表项的特点
流表项是流表的最小单位,每条流表项对应了网络中传输的一条流。流表项是OpenFlow中最核心的元素,组成部分是指控制器和交换机之间传输的数据结构,是对流表项的逻辑描述,并不是跟芯片转发表中的实际字段一一对应。
多级流表将数据包的处理逻辑划分为多个子逻辑,并由多张流表分别来匹配和处理,从而使得数据包的处理变成了一条流水线。多级流表的设计使得流表项聚合成为可能,节省流表空间,也提高了编程处理逻辑的灵活性。一个报文在流表进行匹配查找的时候,主要是从上到下顺序查找的,优先级就是用来标志流表项之间的顺序关系的。
三、openflow协议1.3版中,流表项的组成部分有哪些
OpenFlow v1.3中流表项主要由以下7部分组成:
1、匹配域:用来识别该条表项对应的flow。优先级:定义流表项的优先顺序。计数器:用于保存与条目相关统计信息。指令:匹配表项后需要对数据分组执行的动作。超时:最大时间计数值或流在交换机中失效之前的剩余时间。
2、Cookie:由控制器选择的不透明数据值。Flags:用于标识流表项的标志位。
OpenFlow v1.3的相关知识如下:
1、流表:每个流表包含一个流表项的集合,每个流表项由一个匹配域、一个计数器、一个待作用到匹配的数据包的指令集、一个超时时间、一个cookie组成。指令:一个指令要么修改流水处理(如将数据包指向另一个流表),要么包含一个待加入操作集的操作集合。
2、要么包含一个立即在数据包上生效的操作列表。物理端口:OpenFlow的物理端口为交换机的一个硬件接口。逻辑端口:OpenFlow的逻辑端口为交换机定义的端口,并不直接对应一个交换机的硬件接口,是一个更高层次的概念,可能包括报文封装,映射物理端口的功能。
3、协议特点:OpenFlow是一种用于控制和配置数据包交换设备的协议。它提供了一种开放和标准化的方式来控制网络设备的转发行为。OpenFlow允许将数据包处理流程从传统的固定规则和配置中分离出来,从而提供了更高的灵活性和可编程性。
4、流表结构:OpenFlow交换机中的核心组件是流表,每个流表由多个流表项组成。每个流表项代表一个特定的数据包处理规则,包括匹配条件和相应的动作。流表项的匹配条件通常包括源/目的MAC地址、IP地址、TCP/UDP端口号等。
四、ovs 删除openflow流表
有如下三种方法可以删除openflow流表:
a. controller/ovs-ofctl主动发命令(OFPFC_DELETE or OFPFC_DELETE_STRICT)删除流表。OFPFC_DELETE_STRICT和OFPFC_DELETE的区别是前者需要匹配所有的字段才能删除(包括优先级),并且一次只能删除一条流表,后者要求指定的字段必须是流表的一个子集(不能指定优先级),可以一次删除多个流表。
b.流表的超时机制:添加流表时如果指定idle_timeout或者hard_timeout参数,则流表超时后将被删除。如果不指定这俩参数,则默认不会被超时机制删除。hard_timeout指定的超时时间是从创建流表,或者修改流表开始计时,超时时间到后,不管此流表有没有被使用,都会被删除。idle_timeout指定流表空闲超时时间,从最近流表被使用开始计时,如果指定时间内此流表没有被使用,则被删除。
c.强制回收机制:添加流表时,如果当前流表个数大于等于最大流表个数,则判断是否可以强制回收之前添加的流表。可以通过Flow_Table里的overflow_policy参数指定当前流表个数大于等于最大流表个数时的行为,如果为refuse则拒绝添加新流表,如果为evict则强制删除即将超时的流表。强制回收只考虑指定了超时时间的流表。
添加流表时,如果指定了超时时间,并且流表指定的field包含group指定的field,则会将流表添加到一个分组中。具体为根据group指定的这些field计算hash值,再根据hash值到table->eviction_groups_by_id查找struct eviction_group。然后根据超时时间计算优先级,根据优先级将此流表插入struct eviction_group
针对强制删除流表,可以做如下实验
下面分析下这三种情况下的源码
controller/ovs-ofctl主动删除流表
将流表从分类器中删除
超时机制
添加流表时,如果指定了超时时间,则会将流表挂到链表ofproto->expirable上,在ovs-vswitchd的主循环中,会周期性的调用ofproto-dpif.c中的run函数,此函数会遍历链表ofproto->expirable判断流表是否超时,如果超时则将流表删除。
evict强制删除
添加流表时会将流表插入eviction_group中
当再次添加流表时,如果当前流表个数超过最大流表个数,则
五、ovs patch端口实现原理
ovs的patch端口,用于连接两个网桥,命令如下
添加端口时,会先后调用 port_construct和 port_add,下面看一下这两个函数对于patch端口的特殊处理
a. port_construct
b. port_add
如果是patch类型端口,不会将其添加到datapath中,所以通过 ovs-appctl dpctl/show是看不到patch端口的
br10和br12必须在同一个datapath,否则寻找peer就会失败,ofport->peer就会为空,后面数据转发时也不会从peer设备发出。
假如出端口为patch port,流程如下:
最后会将流表和action安装到datapath中,指导后续报文转发。
下面做一个小实验,拓扑图如下:
创建三个网桥br10,br11和br12,其中br10和br12为netdev类型,br11为system类型。
br10和br11通过patch端口patch1/patch2相连接,br10和br12通过patch端口patch3/patch4相连接。
br10上还添加了一个物理网卡enp129s0f0,其直连的网卡enp129s0f1配置ip地址2.2.2.2/24。
结论:
a. patch端口只存在网桥上,datapath中不会存在
b.如果出端口为patch端口,则相当于其peer设备收到报文,在peer设备所在网桥查找openflow流表进行转发
c.不同类型datapath的网桥不能通过patch端口相连接
参考资料:孔板流量计