软件定义网络-OpenvSwitch

news2024/11/25 3:53:33

软件定义网络(SDN)。它主要有以下三个特点:

  • 控制与转发分离:转发平面就是一个个虚拟或者物理的网络设备,就像小区里面的一条条路。控制平面就是统一的控制中心,就像小区物业的监控室。它们原来是一起的,物业管理员要从监控室出来,到路上去管理设备,现在是分离的,路就是走人的,控制都在监控室。
  • 控制平面与转发平面之间的开放接口:控制器向上提供接口,被应用层调用,就像总控室提供按钮,让物业管理员使用。控制器向下调用接口,来控制网络设备,就像总控室会远程控制电梯的速度。这里经常使用两个名词,前面这个接口称为北向接口,后面这个接口称为南向接口,上北下南嘛。
  • 逻辑上的集中控制:逻辑上集中的控制平面可以控制多个转发面设备,也就是控制整个物理网络,因而可以获得全局的网络状态视图,并根据该全局网络状态视图实现对网络的优化控制,就像物业管理员在监控室能够看到整个小区的情况,并根据情况优化出入方案。

OpenFlow 是 SDN 控制器和网络设备之间互通的南向接口协议,OpenvSwitch 用于创建软件的虚拟交换机。OpenvSwitch 是支持 OpenFlow 协议的,当然也有一些硬件交换机也支持 OpenFlow 协议。它们都可以被统一的 SDN 控制器管理,从而实现物理机和虚拟机的网络连通。

在 OpenvSwitch 里面,有一个流表规则,任何通过这个交换机的包,都会经过这些规则进行处理,从而接收、转发、放弃。

那流表长啥样呢?其实就是一个个表格,每个表格好多行,每行都是一条规则。每条规则都有优先级,先看高优先级的规则,再看低优先级的规则。

对于每一条规则,要看是否满足匹配条件。这些条件包括,从哪个端口进来的,网络包头里面有什么等等。满足了条件的网络包,就要执行一个动作,对这个网络包进行处理。可以修改包头里的内容,可以跳到任何一个表格,可以转发到某个网口出去,也可以丢弃。

通过这些表格,可以对收到的网络包随意处理。

通过上面的表格可以看出,简直是想怎么处理怎么处理,可以覆盖 TCP/IP 协议栈的四层。

对于物理层

  • 匹配规则包括从哪个口进来;
  • 执行动作包括从哪个口出去。

对于 MAC 层:

  • 匹配规则包括:源 MAC 地址是多少?(dl_src),目标 MAC 是多少?(dl_dst),所属 vlan 是多少?(dl_vlan);
  • 执行动作包括:修改源 MAC(mod_dl_src),修改目标 MAC(mod_dl_dst),修改 VLAN(mod_vlan_vid),删除 VLAN(strip_vlan),MAC 地址学习(learn)。

对于网络层

  • 匹配规则包括:源 IP 地址是多少?(nw_src),目标 IP 是多少?(nw_dst)。
  • 执行动作包括:修改源 IP 地址(mod_nw_src),修改目标 IP 地址(mod_nw_dst)。

对于传输层:

  • 匹配规则包括:源端口是多少?(tp_src),目标端口是多少?(tp_dst)。
  • 执行动作包括:修改源端口(mod_tp_src),修改目标端口(mod_tp_dst)。

总而言之,对于 OpenvSwitch 来讲,网络包到了手里,就是一个 Buffer,想怎么改怎么改,想发到哪个端口就发送到哪个端口。

在 OpenvSwitch 里面,有个 bond_mode,可以设置为以下三个值:

  • active-backup:一个连接是 active,其他的是 backup,只有当 active 失效的时候,backup 才顶上;
  • balance-slb:流量按照源 MAC 和 output VLAN 进行负载均衡;
  • balance-tcp:必须在支持 LACP 协议的情况下才可以,可根据 L2、L3、L4 进行负载均衡(L2、L3、L4 指的是网络协议 2、3、4 层)

OpenvSwitch 包含很多的模块,在用户态有两个重要的进程,也有两个重要的命令行工具。

  • 第一个进程是 OVSDB 进程。ovs-vsctl 命令行会和这个进程通信,去创建虚拟交换机,创建端口,将端口添加到虚拟交换机上,OVSDB 会将这些拓扑信息保存在一个本地的文件中。
  • 第二个进程是 vswitchd 进程。ovs-ofctl 命令行会和这个进程通信,去下发流表规则,规则里面会规定如何对网络包进行处理,vswitchd 会将流表放在用户态 Flow Table 中。

在内核态,OpenvSwitch 有内核模块 OpenvSwitch.ko。他会在网卡上注册一个函数,每当有网络包到达网卡的时候,这个函数就会被调用。

在内核的这个函数里面,会拿到网络包,将各个层次的重要信息拿出来,例如:

  • 在物理层,会拿到 in_port,即包是从哪个网口进来的;
  • 在 MAC 层,会拿到源和目的 MAC 地址;
  • 在 IP 层,会拿到源和目的 IP 地址;
  • 在传输层,会拿到源和目的端口号。

在内核中,还有一个内核态 Flow Table。接下来内核态模块在这个内核态的流表中匹配规则,如果匹配上了,就执行相应的操作,比如修改包,或者转发,或者放弃。如果内核没有匹配上,这个时候就需要进入用户态,用户态和内核态之间通过 Linux 的一个机制叫 Netlink,来进行相互通信。

内核通过 upcall,告知用户态进程 vswitchd,在用户态的 Flow Table 里面去匹配规则,这里面的规则是全量的流表规则,而内核态的 Flow Table 只是为了做快速处理,保留了部分规则,内核里面的规则过一段时间就会过期。

当在用户态匹配到了流表规则之后,就在用户态执行操作,同时将这个匹配成功的流表通过 reinject 下发到内核,从而接下来的包都能在内核找到这个规则,来进行转发。

这里调用 openflow 协议的,是本地的命令行工具。当然你也可以是远程的 SDN 控制器来进行控制,一个重要的 SDN 控制器是 OpenDaylight。

下面这个图就是 OpenDaylight 中看到的拓扑图。

我们可以通过在 OpenDaylight 里,将两个交换机之间配置通,也可以配置不通,还可以配置一个虚拟 IP 地址为 VIP,在不同的机器之间实现负载均衡等等,所有的策略都可以灵活配置。

此文章为9月Day25学习笔记,内容来源于极客时间《趣谈网络协议》,推荐该课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[python 刷题] 853 Car Fleet

[python 刷题] 853 Car Fleet 哎……周赛第三题解应该用 monotonic stack 做优化的,没写出来,所以多刷两题 monotonic stack 的题目找找感觉…… 题目: There are n cars going to the same destination along a one-lane road. The destin…

【操作系统笔记九】并发安全问题

用户态抢占和内核态抢占 内核中可以执行以下几种程序: ① 当前运行的进程:陷阱程序(系统调用) 和 故障程序(page fault) ,进程运行在内核态的时候,其实就是在执行进程在用户态触发的…

如何扫描MSI安装文件的路径

今天有个需求,需要扫描已经安装应用, 其中有个华云桌面 其中的UninstallString 值是 MsiExec.exe /X{D20A661B-0CBA-4DE3-A1F6-353D8153725D} 无法直接获取其安装目录, MsiGetProductInfoW 等API INSTALLPROPERTY_INSTALLLOCATION 也不好使 自己写一个…

Supervisor进程管理

Supervisor进程管理 概述:supervisor 是一个用 python 语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor 监听到进程死后,可以很方便的让进程自动恢复,…

区块链实验室(26) - 区块链期刊Blockchain: Research and Applications

Elsevier出版物“Blockchain: Research and Applications”是浙江大学编审的期刊。该期刊自2020年创刊,并出版第1卷。每年出版4期,最新期是第4卷第3期(2023年9月)。 目前没有官方的IF,Elsevier的引用因子Citescore是6.4。 虽然是新刊&#xf…

《开发实战》18 | 数据存储:NoSQL与RDBMS如何取长补短、相辅相成?

取长补短之 Redis vs MySQL 做一个简单测试,分别填充 10 万条数据到 Redis 和 MySQL 中。MySQL 中的 name字段做了索引,相当于 Redis 的 Key,data 字段为 100 字节的数据,相当于 Redis 的Value。在我的电脑上,使用 wr…

免费的视频剪辑素材,可商用。

找免费可商用的视频剪辑素材,就上这6个网站,强推,赶紧收藏! 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富,网站主要还是以设计类素材为主,高清视频素材也很多&am…

【软件测试】黑盒测试用例的四种设计方法

一、输入域测试用例设计方法 输入域测试法是一种综合考虑了等价类划分、边界值分析等方法的综合方法,针对输入域测试法中可能出现的各种情况,输入域测试法主要考虑三个方面:  (1)极端测试(ExtremalTesting),要求在输入域中选择…

汽车数字化转型:存储驱动创新未来

通过在存储领域持续不断的技术创新,西部数据正在助力汽车行业打造更加辉煌灿烂的未来。 汽车数字化转型大会上的创新存储 近日,作为智能汽车领域的行业盛宴,2023第二届汽车数字化转型大会在上海揭幕。 本届汽车数字转型大会不但聚集了全球汽车…

Python+selenium自动化生成测试报告

批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。 unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一、导入HTMLT…

springboot如何接入netty,实现在线统计人数?

springboot如何接入netty,实现在线统计人数? Netty 是 一个异步事件驱动的网络应用程序框架 ,用于快速开发可维护的高性能协议服务器和客户端。 Netty ​ 是一个 NIO 客户端服务器框架 ​,可以快速轻松地开发协议服务器和客户端等…

使用富斯i6遥控器设置6种飞行模式

使用富斯i6遥控器设置6种飞行模式 将富斯i6遥控器的SWC和SWD分别设置为ch5和ch6,然后使用混控功能设置6段开关,以实现6种飞行模式 一、设置辅助通道 进入系统菜单,选择 Functions Setup 选项,进入 Aux. channels 进行设置。将 Channel 5设置为 SwC,Channel 6 设置为 Sw…

CompletableFuture-CompletionStage接口源码分析和四大静态方法初讲

2.3 CompletableFuture对Future的改进 2.3.1 CompletableFuture为什么会出现 get()方法在Future计算完成之前会一直处在阻塞状态下,阻塞的方式和异步编程的设计理念相违背。 isDene()方法容易耗费cpu资源(cpu空转), 对于真正的…

SpringBoot @value注解动态刷新

参考资料 Spring系列第25篇:Value【用法、数据来源、动态刷新】【基础系列】SpringBoot配置信息之配置刷新【基础系列】SpringBoot之自定义配置源的使用姿势【基础系列】SpringBoot应用篇Value注解支持配置自动刷新能力扩展Spring Boot 中动态更新 Value 配置 一. …

完成“重大项目”引进签约,美创科技正式落户中国(南京)软件谷

近日,美创科技正式入驻中国(南京)软件谷,并受邀出席中国南京“金洽会"之“雨花台区数字经济创新发展大会”。美创科技副总裁罗亮亮作为代表,在活动现场完成“重大项目”引进签约。 作为国家重要的软件产业与信息服…

Redis之set类型

文章目录 Redis之set类型1. 添加元素/获取集合中的所有元素/获取集合中元素个数2. 删除元素3. 判断元素是否在集合中3. 从集合中随机弹出一个元素,元素不删除4. 从集合中随机弹出元素,出一个删一个5. 将元素从一个集合转移到另外一个集合6. 集合的差集7.…

周记之重新开始

对于这周的学习,我进行了深刻的反思: 先来说说每天做了什么: 9.18号:把这个顶部的个人信息画出来了;然后记了两个单词(这是能说的吗,这两个单词还是之前复习的)现在都记忆犹新&…

31.下一个排列

方法:两遍扫描 举例: 4 5 2 6 3 1排列中较小数为2,较大数为3,交换两者得:4 5 3 6 2 1,将[i1,n)区间改成升序:得下一个排列: 4 5 3 1 2 6。 若第一步找不到较小数,即当前排…

基础算法--区间合并

区间合并简介 区间合并模型是一种竞赛里比较常见的模型,他的含义是,给你n个区间,要你合并所有有交集的区间,并求出合并后剩下的区间个数,如区间[1, 4]和[2, 3]可以合并成[1, 4],但是[1, 2] 和 [3, 4] 不可…

SLAM从入门到精通(rviz的使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在ros开发当中,rviz和tf都是用的比较多的一个工具。前者是为了实现传感器数据和计算结果的可视化,后者主要是为了显示各个传…