OVS流表分析

本文深入介绍了OpenvSwitch(OVS)在Neutron网络模型中的工作原理,特别是OVS如何通过流表实现L2基本连接。详细阐述了OVS在Overlay组网模型下,如何利用多级流表处理节点间的通信,包括br-int和br-tun的作用以及流表配置。同时,文章探讨了连接机制的优化,如l2_population机制,用于避免隧道上的泛洪,以及DVR(Distributed Virtual Routing)如何实现分布式路由,提高网络可靠性。通过对流表的分析,揭示了OVS在网络流量处理中的智能和灵活性。
摘要由CSDN通过智能技术生成

在具体介绍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)

在OpenvSwitch中,ovs-vswitchd和ovsdb-server是两个核心组件,它们共同工作以管理网络配置和流表。ovs-vswitchd作为主要的守护进程,负责处理数据平面的任务,比如流量转发和流表项的更新。而ovsdb-server则是管理控制平面的数据库服务器,它存储了网络的配置信息和流表项。 参考资源链接:[深入解析OpenvSwitch(OVS)代码结构](https://wenku.csdn.net/doc/1jipuokhyv?spm=1055.2569.3001.10343) ovs-vswitchd与ovsdb-server的交互主要通过OVSDB协议进行,这是一种专门为管理Open vSwitch数据库而设计的JSON-RPC协议。ovs-vswitchd启动时,会通过OVSDB协议与ovsdb-server建立连接,并注册为客户端。当需要更新或查询流表时,ovs-vswitchd会发送相应的OVSDB协议请求到ovsdb-server,请求内容可能包括添加新的流表项、修改现有的流表项或查询当前的流表配置等。 在流表管理中,ovs-vswitchd通过与ovsdb-server的交互,实现以下功能: 1. 流表的动态更新:当网络策略或配置发生变化时,ovs-vswitchd可以实时地向ovsdb-server提交更新请求,ovsdb-server负责持久化这些配置,并通知ovs-vswitchd应用新的流表规则。 2. 流表项的查询和监控:ovs-vswitchd需要实时监控流表项的状态,并根据流表项执行具体的数据包转发操作。通过与ovsdb-server的交互,ovs-vswitchd可以获取当前有效的流表项列表,并据此进行转发决策。 3. 高级网络功能支持:例如VLAN标签、隧道封装和ACL策略等,都需要通过ovs-vswitchd和ovsdb-server的协同工作来实现。 通过这种方式,OpenvSwitch能够提供一个灵活而强大的网络虚拟化平台,支持复杂的网络拓扑和丰富的网络功能。建议结合《深入解析OpenvSwitch(OVS)代码结构》来更深入地理解这些组件是如何协同工作的,以及它们在OVS整体架构中的具体位置和作用。 参考资源链接:[深入解析OpenvSwitch(OVS)代码结构](https://wenku.csdn.net/doc/1jipuokhyv?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值