易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 3836|回复: 0
收起左侧

OVS 总体架构、源码结构及数据流程全面解析

[复制链接]
发表于 2019-10-18 11:00:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
数据面就是以用户态的 ovs-vswitchd 和内核态的 datapath 为主的转发模块,以及与之相关联的数据库模块 ovsdb-server,控制面主要是由 ovs-ofctl 模块负责,基于 OpenFlow 协议与数据面进行交互。而管理面则是由 OVS 提供的各种工具来负责,这些工具的提供也是为了方便用户对底层各个模块的控制管理,提高用户体验。下面就对这些工具进行一个逐一的阐述。
# j$ \( r$ R2 A4 b/ w
: ^) m  d' q$ j; N, i) O% M; Novs-ofctl:这个是控制面的模块,但本质上它也是一个管理工具,主要是基于 OpenFlow 协议对 OpenFlow 交换机进行监控和管理,通过它可以显示一个 OpenFlow 交换机的当前状态,包括功能、配置和表中的项。使用时,有很多参数,我们可以通过 ovs-ofctl --help 查看。
. I; s1 N. ~- W' g
  \  p$ C" R2 g+ e- p1 Q% tCopy
9 B& y/ `. `$ [1 P常用命令:
; V- c6 u1 C; L, e# r2 |* H* |1 U* N/ e4 ?9 @, @
ovs-ofctl show switch-name :输出交换机信息,包括其流量表和端口信息。9 h. F$ z  J2 d* Q& a7 Y( v" g
. F. o, ~% t. i! m3 i7 @
ovs-ofctl dump-ports switch-name:输出交换机的端口统计信息,包括收发包、丢包、错误包等数量。. e: Q/ L" {" `- u) R- o5 d
2 o4 w( b- m! b! `5 `* C5 p
ovs-ofctl add-flow switch-name:为交换机配置流策略。' Q* Z" N6 f# E; S# b/ |
ovs-dpctl:用来配置交换机的内核模块 datapath,它可以创建,修改和删除 datapath,一般,单个机器上的 datapath 有 256 条(0-255)。一条 datapath 对应一个虚拟网络设备。该工具还可以统计每条 datapath 上的设备通过的流量,打印流的信息等,更过参数通过 ovs-dpctl --help 查看。+ x- l+ u5 [  G/ D  T

  ]( t, w( _4 E' Y7 B5 U  ]Copy
) i" Y2 Z! S' ^8 x' ^' n常用命令:' _; I9 y& t8 V, e7 o

) D7 x/ ]" {6 ~ovs-dpctl show :显示所有 datapath 的基本信息。
3 O" O9 v3 h& |3 }6 [2 x3 i  j. p1 G8 [8 m% F1 h$ Y) t( N
ovs-dpctl dump-dps :显示所有 datapath 的名字。
! U0 S8 ?* K3 ]1 m$ l5 w- x- I( ~5 |2 o" j. D
ovs-dpctl dump-flows DP :显示一条 datapath DP 上的流信息。
# x) }) l0 c" {! p& yovs-appctl:查询和控制运行中的 OVS 守护进程,包括 ovs-switchd,datapath,OpenFlow 控制器等,兼具 ovs-ofctl、ovs-dpctl 的功能,是一个非常强大的命令。ovs-vswitchd 等进程启动之后就以一个守护进程的形式运行,为了能够很好的让用户控制这些进程,就有了这个命令。详细可以 ovs-appctl --help 查看。  [  b+ B* f( t$ V

/ k# Y# ]" z4 \ovs-vsctl:查询和更新 ovs-vswitchd 的配置,这也是一个很强大的命令,网桥、端口、协议等相关的命令都由它来完成。此外,还负责和 ovsdb-server 相关的数据库操作。
7 c  i% m7 a. R: S/ [, W6 k/ q  H6 D! e$ G
Copy
- N$ X+ U" U2 u5 f7 J常用命令:4 d  Y3 U( t: V+ I
4 [2 j9 `  V, G2 j; e" ?9 D6 |
ovs-vsctl show :显示主机上已有的网桥及端口信息。
. }# \4 G0 \1 K; v! d6 j/ a7 o% Z/ k+ P9 j
ovs-vsctl add-br br0:添加网桥 br0。% k9 d5 `' }4 r
ovsdb-client:访问 ovsdb-server 的客户端程序,通过 ovsdb-server 执行一些数据库操作。
: o1 P4 V5 @& E( h5 m3 B- m7 X. c1 D
Copy" A1 `3 t, _, p( V! m4 G
常用命令:4 d. z; c# O6 v+ ?2 o
4 ^. P' O8 q0 B# M: `
ovsdb-client dump:用来查看ovsdb内容。
) B( C9 j1 W+ c4 \( `& ^; o2 F! {
4 t; \9 h& L: F+ N0 Q4 govsdb-client transact :用来执行一条类 sql。
9 }! K$ c' G9 g" ]! S/ y+ b! Sovsdb-tool:和 ovsdb-client 要借助 ovsdb-server 才能进行相关数据库操作不同,ovsdb-tool 可以直接操作数据库。: X% f- U  ^. P5 ?& ^/ G6 e+ O. E* d

. u0 q) L* j6 F6 E" s( gOVS 源码结构#
2 @4 u* t0 v) `* j5 a+ J+ k# IOVS 源码结构中,主要包含以下几个主要的模块,数据交换逻辑在 vswitchd 和 datapath 中实现,vswitchd 是最核心的模块,OpenFlow 的相关逻辑都在 vswitchd 中实现,datapath 则不是必须的模块。ovsdb 用于存储 vswitch 本身的配置信息,如端口、拓扑、规则等。控制面部分采用的是 OVS 自家实现的 OVN,和其他控制器相比,OVN 对 OVS 和 openstack 有更好的兼容性和性能。
  k, y# n3 H. W5 \7 C
+ g+ F! P1 \. l& h  n  q
) E1 ]( H/ ]' l( Z: q3 @
& I) V* I! }1 N" G; v! E从图中可以看出 OVS 的分层结构,最上层 vswitchd 主要与 ovsdb 通信,做配置下发和更新等,中间层是 ofproto ,用于和 OpenFlow 控制器通信,并基于下层的 ofproto provider 提供的接口,完成具体的设备操作和流表操作等工作。
1 T. h: @% Y# a) g7 A
% o& O! c& G' B: p6 _dpif 层实现对流表的操作。
% N; f* F' t$ f8 u1 N( T& r# C  N& }, ?+ x8 u4 V9 q
netdev 层实现了对网络设备(如 Ethernet)的抽象,基于 netdev provider 接口实现多种不同平台的设备,如 Linux 内核的 system, tap, internal 等,dpdk 系的 vhost, vhost-user 等,以及隧道相关的 gre, vxlan 等。
1 L6 T3 G% B. A/ A4 P6 O* C; s4 x' a9 Y
数据转发流程#
1 R: V" x) ^# a- r通过一个例子来看看 OVS 中数据包是如何进行转发的。( g6 l; Q8 q) k5 L/ J! h
4 d, Y1 A% A" T# X; I; h& {

# f; q7 g" r. V$ Z2 A
9 {2 h" i, f2 z: u) v1)ovs 的 datapath 接收到从 ovs 连接的某个网络端口发来的数据包,从数据包中提取源/目的 IP、源/目的 MAC、端口等信息。
3 ~, c3 }# g9 k  B# b2 R1 C5 B3 c6 z
2)ovs 在内核态查看流表结构(通过 hash),如果命中,则快速转发。2 D7 [0 c% ]: T( y4 `

5 i3 v9 P0 u2 j" F4 f! P1 z3)如果没有命中,内核态不知道如何处置这个数据包,所以,通过 netlink upcall 机制从内核态通知用户态,发送给 ovs-vswitchd 组件处理。
4 M& R7 c+ ?/ \; b5 b- u) k: t$ [& T- I* l/ d7 v- U# U( j8 c
4)ovs-vswitchd 查询用户态精确流表和模糊流表,如果还不命中,在 SDN 控制器接入的情况下,经过 OpenFlow 协议,通告给控制器,由控制器处理。* |: t! r& l# @% c- l8 m$ Q
  X* f* T; F7 h, g  ^- H
5)如果模糊命中, ovs-vswitchd 会同时刷新用户态精确流表和内核态精确流表,如果精确命中,则只更新内核态流表。
, f7 q$ W  ]1 [/ \  ]
7 p) Q( a. |9 r5 W7 B6)刷新后,重新把该数据包注入给内核态 datapath 模块处理。- @( [2 D$ d/ M! n* h0 C& f$ x

/ G$ @3 ]& z+ j$ C# [7)datapath 重新发起选路,查询内核流表,匹配;报文转发,结束。
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 点击这里给我发消息

GMT+8, 2026-4-8 12:10 , Processed in 0.043945 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表