通俗说Openvswitch

2023-05-16

Openvswitch,顾名思义,Open,开源的,v,virtual,虚拟的,switch交换机。

通俗的讲就是一款开源的软件,可以创建虚拟的交换机。

为啥需要个虚拟的交换机呢?

这还要从一个概念SDN说起,全称Software Defined Network,软件定义网络。

软件定义有啥好处呢?

想象你有一个大的数据中心,里面有很多的网络设备,光交换机就有很多,你希望在交换机上配置一些网络的策略,例如某个口应该属于某个VLAN。

怎么配置呢?登到这台交换机上去,敲几行命令就搞定了。

如果要配置100台交换机呢?头大了吧,难不成登陆100台?

想不想有一个集中的地方,能看到整个网络的拓扑图,统一配置一下,然后一回车,配置的策略就通过管理网络平面下发到100台交换机上。

这样整个网络的拓扑结构就不是硬的了,也即不是通过插线,拔线,登陆盒子配置的,而是变成了软的,也即通过软件统一控制,这个统一控制的地方我们称为SDN Controller控制器,这样的网络拓扑结构,我们称为软件定义的网络。

控制器控制网络设备的协议是啥呢?对于硬件设备来讲,由于利益纠葛,大家谁也不肯完全统一协议,所以各家用各家的。

但是还是有了一个子集的协议OpenFlow,虽然功能不如各家的协议强大,总算达成了部分共识。

OpenFlow的架构如图所示,和SDN的定义是一样的,要求交换机支持OpenFlow的协议。

有些物理的交换机是遵守这个协议的,将物理机连接起来。

也有些虚拟的交换机是遵守这个协议的,可以将虚拟机连接起来。

因为有了虚拟机,虚拟机的创建,删除,迁移比物理机灵活的多,所以很难像物理的交换机一样,用网线将交换机和物理机连接起来,就不怎么变了。虚拟机就不一样了,所以需要虚拟交换机,也即通过软件模拟一个交换机,用软件模拟一根网线,一头插在虚拟机上,一头插在虚拟交换机上,一会儿创建五个虚拟机,要插到一个交换机上,一会儿其中两个虚拟机迁移到了另外的物理机上,则他们两个的网口要从上一台交换机上拔下来,插到新的虚拟交换机上,这样做没有问题,因为都是软件实现的,很灵活。

Openvswitch就是虚拟交换机的一种实现。

在一台Linux机器上安装了Openvswitch之后,就可以用手机号转让命令行不费吹灰之力创建虚拟交换机了。

ovs-vsctl add-br ubuntu_br

一个虚拟交换机就创建出来了,名字叫ubuntu_br,不信你ifconfig就能看到了。

ip link add first_br type veth peer name first_if

ip link add second_br type veth peer name second_if

ip link add third_br type veth peer name third_if

创建三根虚拟的网线,一头叫first_br,second_br和third_br,对应的另一头叫first_if, second_if和third_if。

ovs-vsctl add-port ubuntu_br first_br

ovs-vsctl add-port ubuntu_br second_br

ovs-vsctl add-port ubuntu_br third_br

 将三根网线的一头插到虚拟交换机上,就形成了下面的图

看你不用买硬件,就能创建复杂的网络拓扑图。

例如你想做TCP/IP详解里面如此复杂的图,本来你应该有一个实验室的,但是用Openvswitch和容器,就能够很容易的模拟了。

Openvswitch是怎么用软件模拟交换机的呢?

如图是Openvswitch的架构图,Openvswitch是通过如此多的组件来模拟交换机的。

例如上面的那个拓扑图,如此的复杂,创建了交换机,添加了很多的网卡,所有这些信息肯定要有一个地方保存,而不能机器重启了就不见了,保存在哪里呢?在图中明眼人一眼就能看到ovsdb这个进程,对啊,人家是数据库,所有的虚拟交换机的创建,网卡的添加等,都给这个进程,然后这个进程保存在一个文件里面,不至于丢了。

ovsdb仅仅起一个数据库的作用,还需要一个进程真的能够起到创建虚拟交换机的作用,这就是vswitchd。这个进程从数据库里面读取你创建的虚拟交换机和添加的网卡,然后真的创建他们,这个进程在,虚拟交换机是工作的,这个进程宕机了,虚拟交换机就不工作了。

vswtichd这个进程还可以接受openflow协议,如前面SDN描述的一样,其实vswtichd是openflow swtich的具体实现。

vswtichd起到交换的作用,那面网络包从哪里来呢?一般都会从内核里面来,因而需要一个内核的模块,能够监听网卡,将包拿进来,交给虚拟交换机处理。因而内核模块为Datapatch,是一个openvswitch.ko加载到内核里面的。

当openvswtich.ko加载到内核里面的时候,会在网卡上注册一个函数,每当有网络包到达网卡的时候,这个函数就会被调用。

这个函数将网络包开始层层拆包,MAC层,IP层,TCP层等,然后查看有没有已经定义好的策略,来处理网络包,例如修改MAC,修改IP,修改TCP端口,从哪个网卡发出去等策略,如果找到了策略,则直接就从网卡发出去了。

这个处理过程非常快,因为全部在内核里面,因而称为fastpath。

然而内核态,大家都知道,没有多少内存,所以内核态能够保持的策略是很少的,往往有新的策略到来,老的策略就丢弃了。

然而在内核态找不到策略,则不代表没有配置过策略,需要到用户态去寻找,也即将包通过netlink,一种内核态和用户态交互的机制,发送给vswitchd,vswitchd有一个线程一直在监听,发现有从内核态发过来的包,就进入了自己的处理流程,称为slow path。

vswtichd里面就包含了所有的策略,这些策略都是controller通过openflow协议下发给他的。vswtichd会根据网络包的信息层层匹配,总能找到一款策略进行处理,如果实在找不到,则一般会有一个默认策略,例如丢弃这个包。

当找到了一个策略匹配之后,为了下一个相同类型的包能够从内核就匹配到,则通过netlink协议,将这个策略下发给内核。

当这个策略下发给内核后,如果内核空间不足,可能会淘汰一部分老的策略,没关系,由于近因效应,接下来的网络包,应该都是能够匹配这个策略的,例如传输一个文件,同类型的网络包会源源不断的到来,所以放在内核里面是划算的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通俗说Openvswitch 的相关文章

随机推荐

  • 一文搞定 Visual Studio 配置 OpenCV环境

    文章目录 前言准备工作系统环境变量配置VS项目环境配置检验补充 前言 在 Visual Studio 上配置 OpenCV 环境是极其恼人的事情 xff0c 尤其是对于初学者 xff0c 经常几个小时过去了都配不好 xff0c 将我们对代码
  • PyTorch 轻松节省显存的小技巧

    文章目录 前言一 大幅减少显存占用方法1 模型2 数据 二 小幅减少显存占用方法1 使用inplace2 加载 存储等能用CPU就绝不用GPU3 低精度计算4 torch no grad5 及时清理不用的变量6 分段计算 总结 前言 如今的
  • 【OpenCV经验总结】——视频篇

    文章目录 前言一 视频读写二 视频参数的获取和设置 前言 本篇汇总了本人在OpenCV使用过程中总结的关于视频处理的一些函数使用经验及Bug处理经验 xff0c 会根据后续使用情况逐步更新 一 视频读写 span class token k
  • 【OpenCV经验总结】——图片预处理篇

    文章目录 前言一 图片读写二 调整大小和填充三 滤波四 边缘提取五 腐蚀和膨胀 xff0c 开闭运算 前言 本篇汇总了本人在OpenCV使用过程中总结的关于图片的一些函数使用经验及Bug处理经验 xff0c 会根据后续使用情况逐步更新 一
  • 【DEBUG日记】torch.unique() 报错

    问题描述 在模型输出数据的后处理中 xff0c 在使用torch unique 时报以下错误 xff1a RuntimeError isDifferentiableType variable scalar type INTERNAL ASS
  • 如何在go中执行python3代码

    go python3使用指南与踩坑记录 简介 在开发工作中有时候会有需要和其他语言进行交互的需求 xff0c 笔者前段时间就接到了需要在go中调用python3的需求 xff0c 这种需求笔者想到了两种解法 xff0c 一是直接在代码中调用
  • ios开发-语音识别(科大讯飞)

    在记录事件的时候 xff0c 用户在不方便手写的时候 xff0c 我们可以利用语音录入 xff0c 转成文字的形式记录时间 xff0c 是不是既方便又只能 xff0c 现在做语音识别的有一些不错的开放平台供我们使用 xff0c 科大讯飞平台
  • 用 estimatedRowHeight 对UITableViewCell自动布局的问题?

    iOS8 中通过 UITableViewAutomaticDimension 常量支持自适应高度的单元格 self tableView estimatedRowHeight 61 100 self tableView rowHeight 6
  • Rust VS JS,Rust 已开始渗入前端~

    本文翻译自 xff1a Rust Is The Future of JavaScript Infrastructure Lee Robinson 1 xff0c 已获得作者授权 xff0c 原文略做修改以符合中文语境 xff08 图片镇楼
  • 查看cookie的3种方式

    1 application中查看 2 network中查看 3 console中通过js查看 4 设置cookie document cookie 61 34 age 61 12 34
  • 关于Hadoop中reducer端combiner的一些思考

    什么是Combiner Functions Many MapReduce jobs are limited by the bandwidth available on the cluster so it pays to minimize t
  • Unity新版ECS框架简介:ECS有什么不同?

    了解过ECS的开发者都知道ECS与Unity原本的开发理念相差很大 xff0c 需要所有Unity开发者重新去学习和适应新的开发框架的代价还是很大的 xff0c Unity为何要做出这么大跨度的尝试呢 xff1f Unity正在尝试解决什么
  • Python 爬取 3 万条游戏评分数据,找到了程序员最爱玩的游戏(附代码)

    本文爬取了游戏网站上所有可见的游戏评分数据进行分析 xff0c 全文包括以下几个部分 xff1a 数据获取数据总览游戏类型分析游戏平台分析游戏名称分析高分游戏汇总代码汇总 全文数据获取及分析均基于python3 6完成 数据获取过程 页面内
  • 手游外挂分类及原理介绍

    一 前言 移动游戏市场近几年突然爆发 xff0c 收入规模快速增长 根据第三方数据统计 xff0c 如图所示 xff0c 国内移动游戏2015年市场规模已达514 6亿 如此火热的市场 xff0c 必然会吸引大量图谋不轨的坏人 外挂已在移动
  • 常见游戏外挂分类及原理概述

    外挂基本概念 要理解外挂 xff0c 首先需要理解网络游戏的数据流 这里所说的数据流定义为游戏本地客户端与游戏后台服务器之间的数据流通 一个数据的产生需要玩家做出对应的操作 xff0c 然后经过网络传输同步到服务器后台 xff0c 服务器后
  • 揭秘《英雄联盟》的游戏数据服务器

    Hey xff0c 大家好 xff01 我是 Bill LtRandolph Clark xff0c 一名英雄联盟的游戏工程师 许多 Rioter 工程师关注大量的内容需要直接发送给玩家问题 这是两个我最近最喜欢的例子之一 xff0c 包括
  • 从纹理中生成法线贴图

    概要 本为主要讲解生成法线贴图的基本方法 xff0c 并在 unity 中进行实现和测试 预备知识 法线贴图和基本的图形学知识 xff0c 基本的向量和极限的知识 高度图或灰度图 一张二维纹理有两个维度 u 和 v xff0c 但其实 xf
  • MySQL死锁产生原因和解决方法

    Mysql 锁类型 一 锁类型介绍 xff1a MySQL有三种锁的级别 xff1a 页级 表级 行级 表级锁 xff1a 开销小 xff0c 加锁快 xff1b 不会出现死锁 xff1b 锁定粒度大 xff0c 发生锁冲突的概率最高 并发
  • Flink 动态实时流计算

    xff08 先给个预告 xff0c 下一期关于Flink的文章会讲如何将机器学习融入Flink中 xff09 摘要 本文提供了一种在流计算中不停机动态加载代码来做到敏捷而快速的开发的思路 代码提供在 Lofka 的 lofka night
  • 通俗说Openvswitch

    Openvswitch xff0c 顾名思义 xff0c Open xff0c 开源的 xff0c v xff0c virtual xff0c 虚拟的 xff0c switch交换机 通俗的讲就是一款开源的软件 xff0c 可以创建虚拟的交