OVS流表分析

在具体介绍OVS的工作机制之前,读者要先理解OVS并不是Neutron网络实现的唯一选择。

实际上,Neutron中底层网络的实现千差万别:有的agent本地是真正处理数据流的网络设备(OVS,Router,LoadBalancer等),而有的agent本地是SDN控制器(如ODL、ONOS、OpenContrail、NSX等)。上述Neutron底层网络的两种模型示意如下。

第一种模型中Neutron相当于SDN控制器,plugin与agent间的通信机制(如rpc)就相当于简单的南向协议。第二种模型中Neutron作为SDN应用,将业务需求告知SDN控制器,SDN控制器再通过五花八门的南向协议远程控制网络设备。当然,第二种模型中也可以把Neutron看做超级控制器或者网络编排器,去完成OpenStack中网络业务的集中分发。

以下我们讲的是第一种模型中OVS处理数据流的工作机制。后一种模型中,SDN控制器也可以通过OpenFlow或者OVSDB来控制OVS处理数据流,对此本节暂时不进行讨论,后续讲到ODL和ONOS等SDN控制器的时候再来介绍。

以Overlay组网模型对OVS的工作机制进行介绍,具体分为两个角度:OVS实现L2的基本连接,OVS对连接机制的优化。
 

(一)L2基本连接的实现

复原一下通信场景,其中的网络基础请参考“OpenStack网络基础”一小节。图中某租户有两个网段,分别用橙红色和蓝色表示,网段间的互通要经过网络节点中的Router,网段内的通信不需要经过网络节点中的Router。网段间的互通可分为3步:橙红色网段通过网段内通信找到Router,Router进行路由,Router通过蓝色网段的网段内通信转发给目的地。Router上的路由是linux内核实现的,我们不去关心,因此可以说租户内部通信都是基于网段内通信实现的。

Overlay模型中,网段内通信涉及ovs br-int和ovs br-tun,计算节点和网络节点中两类网桥的实现没有什么区别。概括地说,br-int负责在节点本地的网段内通信,br-tun则负责节点间的网段内通信。

在本节的场景内br-int实现为普通的二层交换机,即完成VLAN标签的增删和正常的二层自学习与转发,没有必要进行过多的解释,其代码实现请参考“Neutron的软件实现”中agent部分。

Br-tun采用多级流表实现节点间的网段内通信,下面直接通过图示来看br-tun中多级流表的设计。图中流表的序号不是固定的,可在neutron.plugins.openvswitch.agent.common目录下的constants.py文件中修改。

所有流经br-tun的数据包首先进入Table 0进行处理。Table 0对数据包的来源进行判断,从与br-int相连的patch-int进入的数据包交给Table 1处理,从GRE或者VxLAN端口(不同节点间的隧道有不同的Port_ID)进入的分别交给Table 2、Table 3处理。Table 1根据数据包目的MAC地址判断是否为单播,是则送往Table 20,否则送往Table 21,Table 20根据(VLAN_ID,MAC)到(PORT_ID,TUNNEL_ID)的映射关系将单播包送到特定的隧道,Table 21将非单播包复制后送到所有隧道。进入Table 2或者Table 3的数据包,首先判断TUNNE_ID是否合法,是则添加本地VLAN_ID并送往Table 10,否则丢弃。Table 10记录数据包的VLAN_ID,MAC、入端口以及TUNNEL_ID,将(VLAN_ID,MAC)到(PORT_ID,TUNNEL_ID)的映射关系写入Table 20,然后将数据包从与br-int相连的patch-int送出。上述流表具体表示如下:

=====================Tables in br-tun ==========================

Table 0:

table=0, priority=1, in_port=patch_int, actions=resubmit(,1)

table=0, priority=1, in_port=, actions=resubmit(,2)

table=0, priority=1, in_port=, actions=resubmit(,3)

table=0, priority=0, actions=drop

Table 1:

table=1, priority=0, dl_dst=00:00:00:00:00:00/01:00:00:00:00:00, actions=resubmit(,20)

table=1, priority=0, dl_dst=01:00:00:00:00:00/01:00:00:00:00:00, actions=resubmit(,21)

Table 2:

table=2, priority=1, tun_id=xxx, actions=mod_vlan_vid: xxx, resubmit(,10)

table=2, priority=0, actions=drop

Table 3:

table=3, priority=1, tun_id=xxx, actions=mod_vlan_vid: xxx, resubmit(,10)

table=3, priority=0, actions=drop

Table 10:

table=10, priority=1 actions=learn(table=20,hard_timeout=300,priority=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:patch-int

Table 20:(由Table 10自学习触发流表项的生成)

table=20, priority=0, actions=resubmit(,21)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值