【碎碎念】-- 什么是OVS

537 阅读4分钟

image.png

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

咋又搞起来云计算了?咋又学起SDN了?我也不知道


OVS

Open vSitch 简称OVS,是一个支持多层数据转发的高质量虚拟交换机,主要部署在服务器上面,但是实际我们应用时是部署在OpenStack虚拟化层面的,这个之后再说吧,相比传统交换机,具有很好的编程扩展性,同时具备传统交换机实现网络隔离和数据转发的功能,运行在实现虚拟化层面的物理机上面,并提供远程管理,提供了两种在虚拟化环境中远程管理协议,一个是OpenFlow,用流表来管理交换机的行为,另一种没用到,称为OVSDB,OpenFlow,又见到您了,定义于SDN网络,用于实现网络转发平面和控制平面分离。

image.png

OVS主要包含三个基本组件,如上图所示:一个是ovs-vswitchd、ovsdb-server、openvswitch.ko

  • ovs-vswitchd 交换机的主要模块,该模块运行在用户态,主要负责基本的转发逻辑,地址学习和外部物理端口绑定等,还可以使用自带的ovs-ofctl工具采用openflow协议对交换机进行远程配置和管理。
  • ovsdb-server组件是存储ovs网桥配置、日志的轻量级数据库,ovsdb是一个可以提供持久化存储的数据库,可以借助ovs-vsctl工具配置OVS交换机,server和DB之间采用OVSDB管理协议,通信内容包含加载配置信息,同时将运行过程中变化的OVS信息保存在数据库中。
  • openvswitch.ko组件运行在内核态,属于快速转发平面,主要负责流表匹配,报文修改,隧道封装、转发或者上送,并且维护底层转发表,在原始的OVS中,报文首先经过该组件完成报文的解析和封装,转发规则匹配。若找到转发规则不再经过用户空间,直接转发,否则转交用户空间的ovs-vswitchd组件进行处理,ovs-vswitchd与openvswitch.ko采用netlink执行进程间的通信,netlink则是一红进程间的通信机制,可用于处理用户态和内核态的通信

碎碎念1:什么是用户态和内核态????

应用程序从磁盘读取文件,是不是直接读硬盘写内存呢,当然不是,流程应该是

  • 程序先将数据从硬盘拷贝到内核buffer
  • 再将数据从内核buffer拷贝到用户buffer

这样用户态和内核态的区别就就此展开了,我们都知道所有的指令都是CPU完成执行的,但是也有不同权限。

image.png

用户态为Ring 3 而内核态为Ring 0,越接近核心权限越高,因此运行在Ring3的为用户态,而Ring 0则为内核态。

应用程序通过调用不同的函数库完成内核操作,比如分配内存等等,函数库发起系统调用,用户态就会切换为内核态执行内核方法。

回来了回来了

OVS的功能

OVS是一种以软件形式存在于虚拟网络中的交换机,与传统物理交换机类似,可以进行局域网划分,隧道搭建,模拟路由等

传统OVS发送报文的处理机制

当报文到达网卡设备的时候,网卡将接收到的报文交给该网卡绑定的端口,在OVS中定义的数据包接收函数处理。在datapath中进行报文头信息获取,根据报文头信息生成匹配流表的key值,得到key值进行内核态流表匹配。在OVS中有两个流表,一个位于内核空间的内核态流表,一个是位于用户空间的用户态流表,内核态流表主要存储近期匹配过的流表项。用户态流表主要由控制器或人为通过OVS提供的ovs-ofctl工具下发。当在内核态的流表中匹配到流表项的时候,数据包将不会再通过用户空间,而直接进行操作,如转发或者丢弃。如果没有匹配到,则会发送到用户态做相应的操作。

基于DPDK的报文处理机制

当报文到达网卡的时候,EAL层(环境抽象层,将底层环境资源做抽象)将报文发送到用户空间交给TO-Thread线程进行接管,在该线程中对报文进行解封装、解析协议内容等操作,根据报文头部与内核协议栈进行通信获取报文key值,完成用户态流表匹配,匹配到的流表项由TO-Thread线程进行处理,完成数据的转发或者丢包,整个过程不经过OVS中内核态datapath进程处理。

部分参考:

blog.csdn.net/qq_20817327…