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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2019-10-18 11:00:53 | 显示全部楼层 |阅读模式
数据面就是以用户态的 ovs-vswitchd 和内核态的 datapath 为主的转发模块,以及与之相关联的数据库模块 ovsdb-server,控制面主要是由 ovs-ofctl 模块负责,基于 OpenFlow 协议与数据面进行交互。而管理面则是由 OVS 提供的各种工具来负责,这些工具的提供也是为了方便用户对底层各个模块的控制管理,提高用户体验。下面就对这些工具进行一个逐一的阐述。
1 T( F( x- g) b
+ V* O6 n8 l1 L8 M. {& yovs-ofctl:这个是控制面的模块,但本质上它也是一个管理工具,主要是基于 OpenFlow 协议对 OpenFlow 交换机进行监控和管理,通过它可以显示一个 OpenFlow 交换机的当前状态,包括功能、配置和表中的项。使用时,有很多参数,我们可以通过 ovs-ofctl --help 查看。" s- o2 D; u- d& ?& B$ V
' ^9 m' S6 C% x2 L7 R
Copy& r/ Z7 n  b* U: r, @
常用命令:
) ?7 |+ ~7 P- K* j
0 d, B$ t  g! a( ^ovs-ofctl show switch-name :输出交换机信息,包括其流量表和端口信息。
. O6 I) @- Z4 M  g$ M2 C! q& l
( i! K) \% j# K4 `( _ovs-ofctl dump-ports switch-name:输出交换机的端口统计信息,包括收发包、丢包、错误包等数量。! d. C( P4 F  {1 G# |+ M

5 u. N% @/ Y( f0 J  a. u2 ^ovs-ofctl add-flow switch-name:为交换机配置流策略。5 [7 f9 o& V3 G  p
ovs-dpctl:用来配置交换机的内核模块 datapath,它可以创建,修改和删除 datapath,一般,单个机器上的 datapath 有 256 条(0-255)。一条 datapath 对应一个虚拟网络设备。该工具还可以统计每条 datapath 上的设备通过的流量,打印流的信息等,更过参数通过 ovs-dpctl --help 查看。+ V5 L* m2 K  b: u5 z: u0 q" a
( }0 J% N0 P* N: N; n
Copy2 c$ I# l9 O7 F
常用命令:
( y" i9 m: ]; y% S+ r$ J, d; ]' _  K
ovs-dpctl show :显示所有 datapath 的基本信息。
- y, ]9 @. q9 ?2 |2 e5 @5 _: x' _
3 O7 E) i; @( ^  U4 T; }3 Y& Z& A* Oovs-dpctl dump-dps :显示所有 datapath 的名字。' B% n# ^; f; F4 Z

& I' r# F; m) Y& Eovs-dpctl dump-flows DP :显示一条 datapath DP 上的流信息。
9 u/ }8 |0 S' [+ s6 u( U8 L3 R% x' fovs-appctl:查询和控制运行中的 OVS 守护进程,包括 ovs-switchd,datapath,OpenFlow 控制器等,兼具 ovs-ofctl、ovs-dpctl 的功能,是一个非常强大的命令。ovs-vswitchd 等进程启动之后就以一个守护进程的形式运行,为了能够很好的让用户控制这些进程,就有了这个命令。详细可以 ovs-appctl --help 查看。" h& i, x  N% c2 l* h

7 F8 K! c- y9 o2 B5 ?8 Aovs-vsctl:查询和更新 ovs-vswitchd 的配置,这也是一个很强大的命令,网桥、端口、协议等相关的命令都由它来完成。此外,还负责和 ovsdb-server 相关的数据库操作。
' i% g7 o+ N8 N8 d! a* g) F/ N9 W  b3 [% k
Copy
, C$ R$ ], c# j2 [2 V常用命令:
( B/ Q" W" P- y* G
6 m3 {  |! M, A: @ovs-vsctl show :显示主机上已有的网桥及端口信息。
& Y+ f9 ^! z0 g9 N/ r, g8 j8 ], u7 z! f3 w
ovs-vsctl add-br br0:添加网桥 br0。- Y) c; f- l6 d; i
ovsdb-client:访问 ovsdb-server 的客户端程序,通过 ovsdb-server 执行一些数据库操作。  J2 {* X/ Z: h! f! B  X

, b: k! R. O+ @. g- tCopy8 ]8 s2 x' V* p& K# I
常用命令:
, ]' Y: J5 b. R! u# s. @. l
* b* A0 M' X$ S7 D4 ~9 ^ovsdb-client dump:用来查看ovsdb内容。' h6 K* Q0 U1 f' F/ k
  w; Y( |+ R4 ]0 e9 P# L" f
ovsdb-client transact :用来执行一条类 sql。5 X9 G; M9 U5 U. n, _' |
ovsdb-tool:和 ovsdb-client 要借助 ovsdb-server 才能进行相关数据库操作不同,ovsdb-tool 可以直接操作数据库。
$ ^! f) j9 z% c7 I! y( i, r: Y0 V( U3 X$ O; |/ x
OVS 源码结构#
4 K/ D7 U7 r; C+ x' bOVS 源码结构中,主要包含以下几个主要的模块,数据交换逻辑在 vswitchd 和 datapath 中实现,vswitchd 是最核心的模块,OpenFlow 的相关逻辑都在 vswitchd 中实现,datapath 则不是必须的模块。ovsdb 用于存储 vswitch 本身的配置信息,如端口、拓扑、规则等。控制面部分采用的是 OVS 自家实现的 OVN,和其他控制器相比,OVN 对 OVS 和 OpenStack 有更好的兼容性和性能。/ j' z. w/ g3 x

2 \- F2 @% B/ C! f1 t
8 |' i& `$ P0 U/ Q- U# `. k. A% k$ b' {" M3 W, ~9 u
从图中可以看出 OVS 的分层结构,最上层 vswitchd 主要与 ovsdb 通信,做配置下发和更新等,中间层是 ofproto ,用于和 OpenFlow 控制器通信,并基于下层的 ofproto provider 提供的接口,完成具体的设备操作和流表操作等工作。
* j* M% l) r; o+ z) L. K
! Y/ W3 k! Y4 l' ]+ Rdpif 层实现对流表的操作。0 ~! c6 r# l. H  _1 \$ T, O) G. v& q

  U# g. Z" t+ o' ~netdev 层实现了对网络设备(如 Ethernet)的抽象,基于 netdev provider 接口实现多种不同平台的设备,如 Linux 内核的 system, tap, internal 等,dpdk 系的 vhost, vhost-user 等,以及隧道相关的 gre, vxlan 等。
) p. Y" R. U( U. Y% k9 p* C
$ y) q5 n8 w& D6 z/ I数据转发流程#
9 u! Y8 W* u- Z3 {+ L9 D5 ?通过一个例子来看看 OVS 中数据包是如何进行转发的。
/ e/ q: ^1 ]9 k2 Y/ ^7 J
' @% b6 J* t2 L5 R; S2 B1 e: ]$ ]8 V2 x: Q# y$ u' N- h/ F8 g" m

+ [) y6 K: x0 `. \% w# S& Z1)ovs 的 datapath 接收到从 ovs 连接的某个网络端口发来的数据包,从数据包中提取源/目的 IP、源/目的 MAC、端口等信息。; |3 i9 J( J6 E/ c

! W7 ?- z+ T, E  N6 [' D. {2)ovs 在内核态查看流表结构(通过 hash),如果命中,则快速转发。+ A; M9 d- z& q: r3 o/ n7 N8 |
  D1 N0 G9 r; Q5 v0 `: q0 u3 Y
3)如果没有命中,内核态不知道如何处置这个数据包,所以,通过 netlink upcall 机制从内核态通知用户态,发送给 ovs-vswitchd 组件处理。3 v8 G- S& W$ `0 F- E

- W5 ]( {( Y8 H2 A! g/ k; C, m: V4)ovs-vswitchd 查询用户态精确流表和模糊流表,如果还不命中,在 SDN 控制器接入的情况下,经过 OpenFlow 协议,通告给控制器,由控制器处理。1 y* m! E3 n; R0 Y/ D
, h7 p+ h1 q. c! Z
5)如果模糊命中, ovs-vswitchd 会同时刷新用户态精确流表和内核态精确流表,如果精确命中,则只更新内核态流表。
/ V5 k/ o* H5 f, |0 E5 g& e. L
$ S$ O/ }9 s* G  o9 R. X+ e6)刷新后,重新把该数据包注入给内核态 datapath 模块处理。7 d9 ?% D: Z/ ]: I* v9 V% A

; [, n, k- {2 B7)datapath 重新发起选路,查询内核流表,匹配;报文转发,结束。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 01:20 , Processed in 0.019447 second(s), 21 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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