易陆发现互联网技术论坛

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

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

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

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

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

x
数据面就是以用户态的 ovs-vswitchd 和内核态的 datapath 为主的转发模块,以及与之相关联的数据库模块 ovsdb-server,控制面主要是由 ovs-ofctl 模块负责,基于 OpenFlow 协议与数据面进行交互。而管理面则是由 OVS 提供的各种工具来负责,这些工具的提供也是为了方便用户对底层各个模块的控制管理,提高用户体验。下面就对这些工具进行一个逐一的阐述。3 X; U! j8 j( L, g" U6 Y3 u/ v$ t
+ Q  N1 i3 o; K- {) `1 p
ovs-ofctl:这个是控制面的模块,但本质上它也是一个管理工具,主要是基于 OpenFlow 协议对 OpenFlow 交换机进行监控和管理,通过它可以显示一个 OpenFlow 交换机的当前状态,包括功能、配置和表中的项。使用时,有很多参数,我们可以通过 ovs-ofctl --help 查看。
2 k2 X' {% n7 F6 C
& P+ y1 P* l. rCopy  x7 k1 Q1 k6 q( u5 c, N" U
常用命令:
, d+ B. R3 R" l
, W; F( z( R9 ?" Z: n6 o0 C1 N- aovs-ofctl show switch-name :输出交换机信息,包括其流量表和端口信息。0 P9 G/ E8 V! Z; b; ~
3 K; `' I' T5 _! C9 ~% |: m
ovs-ofctl dump-ports switch-name:输出交换机的端口统计信息,包括收发包、丢包、错误包等数量。2 Z8 f/ Y& m; A$ _, m

9 J9 W" m/ }( _* h, K8 H. D  Dovs-ofctl add-flow switch-name:为交换机配置流策略。
2 r* y( Z6 h0 Fovs-dpctl:用来配置交换机的内核模块 datapath,它可以创建,修改和删除 datapath,一般,单个机器上的 datapath 有 256 条(0-255)。一条 datapath 对应一个虚拟网络设备。该工具还可以统计每条 datapath 上的设备通过的流量,打印流的信息等,更过参数通过 ovs-dpctl --help 查看。
# C1 J" N; Y( K' `8 s  {  W" W" ~' w+ s2 H2 P4 x
Copy
8 F6 ^9 A" h  e/ R& s" y常用命令:
$ @& _* \! _, M& K- u, P+ U# E" d6 X5 ]' `& o4 b+ n
ovs-dpctl show :显示所有 datapath 的基本信息。
/ E  k5 O5 A* m, n: A+ F+ t8 Q$ B3 Z) c, L6 ^5 }  n
ovs-dpctl dump-dps :显示所有 datapath 的名字。. M* V  y# O( I+ n3 N7 g

8 W- P% m( I; U% N6 F! ]% Zovs-dpctl dump-flows DP :显示一条 datapath DP 上的流信息。6 u6 \- N+ q5 ?3 q5 L
ovs-appctl:查询和控制运行中的 OVS 守护进程,包括 ovs-switchd,datapath,OpenFlow 控制器等,兼具 ovs-ofctl、ovs-dpctl 的功能,是一个非常强大的命令。ovs-vswitchd 等进程启动之后就以一个守护进程的形式运行,为了能够很好的让用户控制这些进程,就有了这个命令。详细可以 ovs-appctl --help 查看。- }5 D( a) Z  w
5 K2 b# X# G( j. L+ a; t$ W; `
ovs-vsctl:查询和更新 ovs-vswitchd 的配置,这也是一个很强大的命令,网桥、端口、协议等相关的命令都由它来完成。此外,还负责和 ovsdb-server 相关的数据库操作。# \$ t6 Z8 s" U6 h: O9 |

2 z1 v: [' E/ v% ]2 E3 ?% ECopy% `5 {! L+ {! _0 `
常用命令:
; g/ r: \' E6 u+ Y9 _6 l+ v" w
( O& I  O2 F3 \: u7 k% f& C8 qovs-vsctl show :显示主机上已有的网桥及端口信息。' `1 B3 Z* s9 x5 `& S4 K% A: S
" K; h* d! O0 _
ovs-vsctl add-br br0:添加网桥 br0。- D8 n- f" b, R% a, s# n: N% G( h2 ?
ovsdb-client:访问 ovsdb-server 的客户端程序,通过 ovsdb-server 执行一些数据库操作。
+ K  w1 B$ |, l" X/ v! V7 d  I! o! P7 t
Copy  t  A, r" \$ D6 r7 X1 J
常用命令:
. Q( X/ O! s  ~* r4 X
+ P; E( u4 X/ |) G; N. zovsdb-client dump:用来查看ovsdb内容。
$ d, ~( Z/ x9 p' x: ?) ]; t! K6 i) o5 w* q- X% x: t* H. M5 J8 o( X% @( B
ovsdb-client transact :用来执行一条类 sql。, n: [; k' t' j/ L. X9 L
ovsdb-tool:和 ovsdb-client 要借助 ovsdb-server 才能进行相关数据库操作不同,ovsdb-tool 可以直接操作数据库。% Z! N. x" L. K( _+ l  z1 e7 ~
' m0 K4 ]& \$ L. y) b
OVS 源码结构#, W, \. q3 }4 o; }. |5 n( e
OVS 源码结构中,主要包含以下几个主要的模块,数据交换逻辑在 vswitchd 和 datapath 中实现,vswitchd 是最核心的模块,OpenFlow 的相关逻辑都在 vswitchd 中实现,datapath 则不是必须的模块。ovsdb 用于存储 vswitch 本身的配置信息,如端口、拓扑、规则等。控制面部分采用的是 OVS 自家实现的 OVN,和其他控制器相比,OVN 对 OVS 和 openstack 有更好的兼容性和性能。' G% Y- a' A4 Q9 [7 F

2 X; Z5 j0 ^; I# U4 {# n6 ^9 P& P" J8 ^, d" T" s

, `+ U) F. y) ]4 U从图中可以看出 OVS 的分层结构,最上层 vswitchd 主要与 ovsdb 通信,做配置下发和更新等,中间层是 ofproto ,用于和 OpenFlow 控制器通信,并基于下层的 ofproto provider 提供的接口,完成具体的设备操作和流表操作等工作。* j3 x* Z; @: x5 @4 ?

+ p" w. |2 V0 c" l& Qdpif 层实现对流表的操作。; u2 X) x3 A! g& h/ Z- [3 Z
; O( q7 I" s# I
netdev 层实现了对网络设备(如 Ethernet)的抽象,基于 netdev provider 接口实现多种不同平台的设备,如 Linux 内核的 system, tap, internal 等,dpdk 系的 vhost, vhost-user 等,以及隧道相关的 gre, vxlan 等。
+ B( f8 m# R# y6 b7 T5 i$ x% E' p7 o" G
数据转发流程#1 m! {7 c! G( R/ U* {, F
通过一个例子来看看 OVS 中数据包是如何进行转发的。
3 e" o0 |! H" t- k4 t5 {2 W. d: G) L! T. a4 v

( a# T7 E3 G" i, Y
. i: A0 I+ T5 U1)ovs 的 datapath 接收到从 ovs 连接的某个网络端口发来的数据包,从数据包中提取源/目的 IP、源/目的 MAC、端口等信息。
' a9 P: v" Q7 R! D8 X' @8 @6 Z
4 c+ Q2 I/ f, p5 ?0 |2)ovs 在内核态查看流表结构(通过 hash),如果命中,则快速转发。
3 m; B( V- ^: o& R' D% ~& @, V2 W. ^3 z6 B+ }
3)如果没有命中,内核态不知道如何处置这个数据包,所以,通过 netlink upcall 机制从内核态通知用户态,发送给 ovs-vswitchd 组件处理。' N7 T$ O4 A( c6 F; I. Z3 t4 ?. _1 u
, t! x, \. T2 h$ ^3 ?: J
4)ovs-vswitchd 查询用户态精确流表和模糊流表,如果还不命中,在 SDN 控制器接入的情况下,经过 OpenFlow 协议,通告给控制器,由控制器处理。
! n% ~. r1 `; C1 R5 q& ], v% e
' {& w. d& B) g* {5)如果模糊命中, ovs-vswitchd 会同时刷新用户态精确流表和内核态精确流表,如果精确命中,则只更新内核态流表。9 K8 R- |+ C& `- ]% l* p- [% `( R
. m( K& H8 a6 y2 q; m6 H
6)刷新后,重新把该数据包注入给内核态 datapath 模块处理。3 C$ E, s4 o6 r% H, e" @* I

  z5 N3 n  K/ n# p  \! z7)datapath 重新发起选路,查询内核流表,匹配;报文转发,结束。
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-9 00:03 , Processed in 0.047829 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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