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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2019-10-18 11:00:53 | 显示全部楼层 |阅读模式
数据面就是以用户态的 ovs-vswitchd 和内核态的 datapath 为主的转发模块,以及与之相关联的数据库模块 ovsdb-server,控制面主要是由 ovs-ofctl 模块负责,基于 OpenFlow 协议与数据面进行交互。而管理面则是由 OVS 提供的各种工具来负责,这些工具的提供也是为了方便用户对底层各个模块的控制管理,提高用户体验。下面就对这些工具进行一个逐一的阐述。
" f, K+ O+ Q# u, A+ c, {2 e6 x1 o# x
ovs-ofctl:这个是控制面的模块,但本质上它也是一个管理工具,主要是基于 OpenFlow 协议对 OpenFlow 交换机进行监控和管理,通过它可以显示一个 OpenFlow 交换机的当前状态,包括功能、配置和表中的项。使用时,有很多参数,我们可以通过 ovs-ofctl --help 查看。
3 B2 N$ s: _. v4 O6 r. z5 ~6 m) T3 ^; b8 {$ P
Copy
. {4 n9 z8 U; q, U8 V1 B常用命令:
. P+ D' ?) M4 K& T, o! T" y5 W( s8 ^1 a1 d& T( t$ D
ovs-ofctl show switch-name :输出交换机信息,包括其流量表和端口信息。, c9 s( _* m6 b! z4 \5 H( o
! s9 b) S. v2 F/ ]  T9 H5 u. h
ovs-ofctl dump-ports switch-name:输出交换机的端口统计信息,包括收发包、丢包、错误包等数量。
' C5 @/ r; E$ t. Z9 z
9 W5 g! {$ t; Bovs-ofctl add-flow switch-name:为交换机配置流策略。3 [' i2 r7 M& h, ^5 V( S* I
ovs-dpctl:用来配置交换机的内核模块 datapath,它可以创建,修改和删除 datapath,一般,单个机器上的 datapath 有 256 条(0-255)。一条 datapath 对应一个虚拟网络设备。该工具还可以统计每条 datapath 上的设备通过的流量,打印流的信息等,更过参数通过 ovs-dpctl --help 查看。" H. y0 V  o& x) M# `1 S
- C& |  w2 Y: \; }
Copy+ l' \  }5 g* b* R3 H. n* C- P
常用命令:6 g9 L" u' Q, ]  G
* j) z: R- S0 F# r% V- k+ E
ovs-dpctl show :显示所有 datapath 的基本信息。4 r7 l2 S! I0 n; J+ [; j
4 N' e5 j- U: ]' z+ j
ovs-dpctl dump-dps :显示所有 datapath 的名字。. B/ L/ Z3 r& G0 s7 G& y' S
4 z% m( T% f2 ~) K2 n8 r( r* I
ovs-dpctl dump-flows DP :显示一条 datapath DP 上的流信息。6 L- F3 ]. W5 g! I  a1 p9 E
ovs-appctl:查询和控制运行中的 OVS 守护进程,包括 ovs-switchd,datapath,OpenFlow 控制器等,兼具 ovs-ofctl、ovs-dpctl 的功能,是一个非常强大的命令。ovs-vswitchd 等进程启动之后就以一个守护进程的形式运行,为了能够很好的让用户控制这些进程,就有了这个命令。详细可以 ovs-appctl --help 查看。8 Y8 q; Y. K. O
: t* }4 o( L4 D
ovs-vsctl:查询和更新 ovs-vswitchd 的配置,这也是一个很强大的命令,网桥、端口、协议等相关的命令都由它来完成。此外,还负责和 ovsdb-server 相关的数据库操作。# Z0 D# {/ K4 f9 G. @) R% t/ h  Q

6 b* p- C( z' L) T  ]! ]7 _Copy
/ i1 \) t0 W/ {, O' e常用命令:
& l7 N) D" y+ P( {. A, `
4 X1 Z: E2 V  f, ~) o/ r- i3 Vovs-vsctl show :显示主机上已有的网桥及端口信息。
6 ?. G: V. f0 I) E7 ]* ~  U) Y$ ~, W% _; }! k9 f1 g  u% a3 ^3 m
ovs-vsctl add-br br0:添加网桥 br0。
, K2 n6 c0 X, ~: f! B5 s6 o7 novsdb-client:访问 ovsdb-server 的客户端程序,通过 ovsdb-server 执行一些数据库操作。2 U$ R6 \6 d/ [! @- {$ J
2 \8 D# O. ]6 ^+ j
Copy  b" `, M; ]5 C6 {3 E
常用命令:5 g& ~! d! C5 a" A1 e5 R6 H
5 }# ]1 s# c# x2 K  g
ovsdb-client dump:用来查看ovsdb内容。
6 O" O) [* F" s1 T/ A' I1 `  S4 e+ O
ovsdb-client transact :用来执行一条类 sql。7 w* l; X% X1 g# T1 y
ovsdb-tool:和 ovsdb-client 要借助 ovsdb-server 才能进行相关数据库操作不同,ovsdb-tool 可以直接操作数据库。- H- ~8 q6 p$ R! V+ a! R" A  L

9 x, l. e! Z, ]/ aOVS 源码结构#
: w. y& Y% f- eOVS 源码结构中,主要包含以下几个主要的模块,数据交换逻辑在 vswitchd 和 datapath 中实现,vswitchd 是最核心的模块,OpenFlow 的相关逻辑都在 vswitchd 中实现,datapath 则不是必须的模块。ovsdb 用于存储 vswitch 本身的配置信息,如端口、拓扑、规则等。控制面部分采用的是 OVS 自家实现的 OVN,和其他控制器相比,OVN 对 OVS 和 OpenStack 有更好的兼容性和性能。
9 Q# H7 F1 i. _$ _9 q' j% R1 Z7 O. I) f  `
9 D; I8 W+ R! p. K" L, F
  Y9 |( z4 n1 f! T- s: R
从图中可以看出 OVS 的分层结构,最上层 vswitchd 主要与 ovsdb 通信,做配置下发和更新等,中间层是 ofproto ,用于和 OpenFlow 控制器通信,并基于下层的 ofproto provider 提供的接口,完成具体的设备操作和流表操作等工作。& c# T2 K8 k$ p

. a. A; [" B: d/ E2 q5 mdpif 层实现对流表的操作。
, u8 N$ e7 A% i6 C2 h8 b( d; ?8 p( Y! |; [2 |* P# |
netdev 层实现了对网络设备(如 Ethernet)的抽象,基于 netdev provider 接口实现多种不同平台的设备,如 Linux 内核的 system, tap, internal 等,dpdk 系的 vhost, vhost-user 等,以及隧道相关的 gre, vxlan 等。, p& D$ r9 F2 j+ {! _$ o

! J$ V6 o6 Z" w7 T& H& M5 c7 w# }8 u数据转发流程#" f# r9 G6 P! P, M, P9 X0 l
通过一个例子来看看 OVS 中数据包是如何进行转发的。
  M; u0 Y6 }6 G# X* P: A0 \' O5 {0 `, ^
) c+ K# S5 o7 n! |
+ _( ], X! s& H8 e3 Y
1)ovs 的 datapath 接收到从 ovs 连接的某个网络端口发来的数据包,从数据包中提取源/目的 IP、源/目的 MAC、端口等信息。/ o; R: x. u# p

& O, B4 G/ z" d* J: d; g2 t% Y2)ovs 在内核态查看流表结构(通过 hash),如果命中,则快速转发。$ E/ t; V3 `4 x

, E2 W. b5 X8 k$ R( x3)如果没有命中,内核态不知道如何处置这个数据包,所以,通过 netlink upcall 机制从内核态通知用户态,发送给 ovs-vswitchd 组件处理。
) j* d& ~) j2 t( Y" h/ A/ Q5 p
3 S% D6 {2 ]" h, \5 _0 Q4)ovs-vswitchd 查询用户态精确流表和模糊流表,如果还不命中,在 SDN 控制器接入的情况下,经过 OpenFlow 协议,通告给控制器,由控制器处理。
7 g* U& v. U/ r. Y5 f. P, S) F( O- _% |0 _" V2 E+ y9 Y
5)如果模糊命中, ovs-vswitchd 会同时刷新用户态精确流表和内核态精确流表,如果精确命中,则只更新内核态流表。  s' V9 {* |0 H* ]3 m

9 v  @# O4 E: d" g. p+ i6)刷新后,重新把该数据包注入给内核态 datapath 模块处理。
$ n  V0 n0 B9 z5 a
2 y9 V9 f7 @% ^7)datapath 重新发起选路,查询内核流表,匹配;报文转发,结束。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 00:13 , Processed in 0.021214 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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