找回密码
 注册
查看: 3835|回复: 0

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2019-10-18 11:00:53 | 显示全部楼层 |阅读模式
数据面就是以用户态的 ovs-vswitchd 和内核态的 datapath 为主的转发模块,以及与之相关联的数据库模块 ovsdb-server,控制面主要是由 ovs-ofctl 模块负责,基于 OpenFlow 协议与数据面进行交互。而管理面则是由 OVS 提供的各种工具来负责,这些工具的提供也是为了方便用户对底层各个模块的控制管理,提高用户体验。下面就对这些工具进行一个逐一的阐述。
1 A" w/ S" w) m4 `) Q" K! l1 ^. h3 x9 I- d
ovs-ofctl:这个是控制面的模块,但本质上它也是一个管理工具,主要是基于 OpenFlow 协议对 OpenFlow 交换机进行监控和管理,通过它可以显示一个 OpenFlow 交换机的当前状态,包括功能、配置和表中的项。使用时,有很多参数,我们可以通过 ovs-ofctl --help 查看。5 p1 B3 X; M1 G3 ~+ b) c
' R5 ~0 v3 N* G, |6 @
Copy
1 f# g: ~0 f: \0 Y常用命令:
( J; W; R  A) T6 N
6 ]8 \5 X- n' n- Z# ]6 ~ovs-ofctl show switch-name :输出交换机信息,包括其流量表和端口信息。
5 e7 r! m3 A. H; z2 F1 q
+ Q7 [0 \# w$ Z8 R! jovs-ofctl dump-ports switch-name:输出交换机的端口统计信息,包括收发包、丢包、错误包等数量。
/ _% T1 g6 j8 |( c: n, q+ e
  U( u; L% [% v$ S' f# aovs-ofctl add-flow switch-name:为交换机配置流策略。
& b; ^* I/ v  K+ f$ Govs-dpctl:用来配置交换机的内核模块 datapath,它可以创建,修改和删除 datapath,一般,单个机器上的 datapath 有 256 条(0-255)。一条 datapath 对应一个虚拟网络设备。该工具还可以统计每条 datapath 上的设备通过的流量,打印流的信息等,更过参数通过 ovs-dpctl --help 查看。
6 N8 f3 a) g5 I
, \/ H! F- g1 y% rCopy
1 h6 T8 P2 n, Z. \. M- |4 ~常用命令:4 H! [1 h8 b7 M( j+ P% d5 ?
! e# ^& z$ p/ \2 n" t! h7 A6 B
ovs-dpctl show :显示所有 datapath 的基本信息。
* t0 C1 D9 r9 Q( k, b# \; a  Q" J3 }) }+ r2 @6 f
ovs-dpctl dump-dps :显示所有 datapath 的名字。* D! K, E& I7 b- o% i
8 L+ v4 K9 ^0 y6 |2 G! s3 V4 m
ovs-dpctl dump-flows DP :显示一条 datapath DP 上的流信息。3 D8 H' l! r' u
ovs-appctl:查询和控制运行中的 OVS 守护进程,包括 ovs-switchd,datapath,OpenFlow 控制器等,兼具 ovs-ofctl、ovs-dpctl 的功能,是一个非常强大的命令。ovs-vswitchd 等进程启动之后就以一个守护进程的形式运行,为了能够很好的让用户控制这些进程,就有了这个命令。详细可以 ovs-appctl --help 查看。
+ g! q2 l0 Q2 P  ^0 \0 o2 N! Z
ovs-vsctl:查询和更新 ovs-vswitchd 的配置,这也是一个很强大的命令,网桥、端口、协议等相关的命令都由它来完成。此外,还负责和 ovsdb-server 相关的数据库操作。
& F2 t) b( I/ {+ W8 H% P( w/ ]( q6 ^  u- h4 Y& F- ?
Copy7 ?3 Q7 c- L. T' x
常用命令:
; J; v! r, r* z* d; I6 u/ Z, P, F& D# q+ `) G" M+ e1 {
ovs-vsctl show :显示主机上已有的网桥及端口信息。
  A' P2 P* d& @9 A) g5 f% s0 Q8 L/ _4 q1 o: j; v
ovs-vsctl add-br br0:添加网桥 br0。, A9 g& i: K! n" G. |: ?0 i5 P' g
ovsdb-client:访问 ovsdb-server 的客户端程序,通过 ovsdb-server 执行一些数据库操作。
! y; E3 T1 j0 _/ ?
9 c) y( F3 K( d6 [! bCopy
& b. p9 p% Q8 ?' }. R常用命令:
" O, f: S, Z" \0 O
. l* _/ R' Z9 ]. m: `( bovsdb-client dump:用来查看ovsdb内容。
% L' G* U9 ~+ b( @/ f4 ~0 U3 N% @2 r7 @( z
ovsdb-client transact :用来执行一条类 sql。
4 h: C  D$ A& H2 I" x: Sovsdb-tool:和 ovsdb-client 要借助 ovsdb-server 才能进行相关数据库操作不同,ovsdb-tool 可以直接操作数据库。
$ |! d# O  T0 x! V: n! H. J0 b* a+ B0 O! P3 D. v  V4 A
OVS 源码结构#
, O  f! [0 E" r7 u3 pOVS 源码结构中,主要包含以下几个主要的模块,数据交换逻辑在 vswitchd 和 datapath 中实现,vswitchd 是最核心的模块,OpenFlow 的相关逻辑都在 vswitchd 中实现,datapath 则不是必须的模块。ovsdb 用于存储 vswitch 本身的配置信息,如端口、拓扑、规则等。控制面部分采用的是 OVS 自家实现的 OVN,和其他控制器相比,OVN 对 OVS 和 OpenStack 有更好的兼容性和性能。2 {* d) J0 h; C; A% L/ V

! p0 C4 x7 D0 r6 ?& H) ?. R$ U% \$ e, Q

' l8 J4 B* d0 s$ L# u从图中可以看出 OVS 的分层结构,最上层 vswitchd 主要与 ovsdb 通信,做配置下发和更新等,中间层是 ofproto ,用于和 OpenFlow 控制器通信,并基于下层的 ofproto provider 提供的接口,完成具体的设备操作和流表操作等工作。; n. p1 Q: F) ]. a3 c  w+ B5 Z

( F2 u) f  {' g: {4 E& [' `& y# m$ ndpif 层实现对流表的操作。: I7 N) p; d, E2 @+ w( {& }; m8 P

3 t! N8 |8 x2 C# Lnetdev 层实现了对网络设备(如 Ethernet)的抽象,基于 netdev provider 接口实现多种不同平台的设备,如 Linux 内核的 system, tap, internal 等,dpdk 系的 vhost, vhost-user 等,以及隧道相关的 gre, vxlan 等。
* n" ], O! ~3 X$ b8 @4 s' w
% D  x1 z) I/ u1 }" ~. B$ i3 ^数据转发流程#" E( X( @) u1 Q# f* P
通过一个例子来看看 OVS 中数据包是如何进行转发的。# c& i! D2 c! j' K

, a: `6 h) p- H3 L
4 ~. ?1 z" }" e' j" f, H; v" M! c$ S* M8 X2 `
1)ovs 的 datapath 接收到从 ovs 连接的某个网络端口发来的数据包,从数据包中提取源/目的 IP、源/目的 MAC、端口等信息。& p0 [2 U# Y  J7 y% E: m: x

$ z$ P! J9 g  O& Q/ O2)ovs 在内核态查看流表结构(通过 hash),如果命中,则快速转发。
3 n- p/ `" ^! w4 }! Q
8 n- e; b/ I$ T% s8 u' N' W3)如果没有命中,内核态不知道如何处置这个数据包,所以,通过 netlink upcall 机制从内核态通知用户态,发送给 ovs-vswitchd 组件处理。" q. [: U, ^* Y9 r4 l: v+ d

$ Z' |4 M" r- o. D6 q$ x2 i4)ovs-vswitchd 查询用户态精确流表和模糊流表,如果还不命中,在 SDN 控制器接入的情况下,经过 OpenFlow 协议,通告给控制器,由控制器处理。
( T  S$ i2 B  h' m) y1 v4 j& }: T: D2 J" g3 `  g% e; D8 e
5)如果模糊命中, ovs-vswitchd 会同时刷新用户态精确流表和内核态精确流表,如果精确命中,则只更新内核态流表。
5 V; {! X  L& i' Q" l9 h. ]% N9 r2 h3 `1 j* ^. O
6)刷新后,重新把该数据包注入给内核态 datapath 模块处理。
8 k/ ^) _' P* G8 y% s0 c+ ~/ h8 o2 M( C. Q. ^. V: |
7)datapath 重新发起选路,查询内核流表,匹配;报文转发,结束。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:28 , Processed in 0.017329 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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