2-3多交换机静态流表控制原理与实现

news2024/11/19 22:53:12

实现目标环境下的静态流表设置:
1 单个ovs上实现多个主机hosts之间的通信
2多ovs上多主机之间的通信

1 单个ovs上实现多个主机hosts之间的通信
使用函数定义的方式创建一个如下的拓扑,并使用静态流表
在这里插入图片描述

from mininet.net import Mininet
from mininet.node import OVSSwitch, Host
from mininet.cli import CLI
from mininet.link import Link
import networkx as nx
import matplotlib.pyplot as plt

def create_network():
    net = Mininet()
        # 创建单个OVS交换机
    switch1 = net.addSwitch('s1', cls=OVSSwitch)
    
    
    # 创建2个主机
    host1 = net.addHost('h1', cls=Host, ip='192.168.0.1/24', defaultRoute='via 192.168.0.254')
    host2 = net.addHost('h2', cls=Host, ip='192.168.0.2/24', defaultRoute='via 192.168.0.254')
   
    
    # 连接主机到交换机
    net.addLink(host1, switch1)
    net.addLink(host2, switch1)
      
        
    # 启动网络
    net.start()
      
    
    # 在OVS交换机上添加静态流表
    switch1.cmd('ovs-ofctl add-flow s1 in_port=1,actions=output:2')
    switch1.cmd('ovs-ofctl add-flow s1 in_port=2,actions=output:1')
    
    
    # 构建拓扑图
    G = nx.DiGraph()
    for switch in net.switches:
        G.add_node(switch.name)
    for host in net.hosts:
        G.add_node(host.name)
    for link in net.links:
        G.add_edge(link.intf1.node.name, link.intf2.node.name)
    
    # 保存拓扑图
    nx.draw(G, with_labels=True, node_size=1000, node_color='lightblue', font_weight='bold')
    plt.savefig('topology1.png')
    
    plt.show() # 显示网络拓扑
    
    # 打开命令行界面
    CLI(net)
    
    # 关闭网络
    net.stop()

if __name__ == '__main__':
    create_network()

运行以及测试``在这里插入图片描述
2多ovs上多主机之间的通信
使用2_3_1.py代码修改成如下图2的拓扑结构
代码:

from mininet.net import Mininet
from mininet.node import OVSSwitch, Host
from mininet.cli import CLI
from mininet.link import Link
import networkx as nx
import matplotlib.pyplot as plt

def create_network():
 net = Mininet()
     # 创建单个OVS交换机
 switch1 = net.addSwitch('s1', cls=OVSSwitch)
 switch2 = net.addSwitch('s2', cls=OVSSwitch)
 
 
 # 创建2个主机
 host1 = net.addHost('h1', cls=Host, ip='192.168.0.1/24', defaultRoute='via 192.168.0.254')
 host2 = net.addHost('h2', cls=Host, ip='192.168.0.2/24', defaultRoute='via 192.168.0.254')
 host3 = net.addHost('h3', cls=Host, ip='192.168.0.3/24', defaultRoute='via 192.168.0.254')
 host4 = net.addHost('h4', cls=Host, ip='192.168.0.4/24', defaultRoute='via 192.168.0.254')


 
 # 连接主机到交换机
 net.addLink(host1, switch1)
 net.addLink(host2, switch1)
 net.addLink(host3, switch2)
 net.addLink(host4, switch2)
#交换机连接交换机
 net.addLink(switch1, switch2)

   
     
 # 启动网络
 net.start()
   
 
 # 在OVS交换机上添加静态流表
 switch1.cmd('ovs-ofctl add-flow s1 in_port=1,actions=output:2,3')
 switch1.cmd('ovs-ofctl add-flow s1 in_port=2,actions=output:1,3')
 switch1.cmd('ovs-ofctl add-flow s1 in_port=3,actions=output:1,2')
 switch2.cmd('ovs-ofctl add-flow s2 in_port=1,actions=output:2,3')
 switch2.cmd('ovs-ofctl add-flow s2 in_port=2,actions=output:1,3')
 switch2.cmd('ovs-ofctl add-flow s2 in_port=3,actions=output:1,2')
 
 # 构建拓扑图
 G = nx.DiGraph()
 for switch in net.switches:
     G.add_node(switch.name)
 for host in net.hosts:
     G.add_node(host.name)
 for link in net.links:
     G.add_edge(link.intf1.node.name, link.intf2.node.name)
 
 # 保存拓扑图
 nx.draw(G, with_labels=True, node_size=1000, node_color='lightblue', font_weight='bold')
 plt.savefig('topology1.png')
 
 plt.show() # 显示网络拓扑
 
 # 打开命令行界面
 CLI(net)
 
 # 关闭网络
 net.stop()

if __name__ == '__main__':
 create_network()

多个ovs时需要加入arp泛洪流允许
在交换机上允许arp广播流(请求和回复,跨交换机时如果arp包没有通过,一般每个ovs都需要来回)
s1.cmd(‘ovs-ofctl add-flow s1 table=0,priority=100,dl_type=0x0806,nw_proto=1,actions=flood’)
s1.cmd(‘ovs-ofctl add-flow s1 table=0,priority=100,dl_type=0x0806,nw_proto=2,actions=flood’)

在这里插入图片描述
使用静态流表优点是即使当前网络存在环路(假设给两个交换机之间增加一条链路,也不会产生广播风暴,流量的转发完全按照人为设定的流表转发。缺点是当节点增加时,流表配置工作量剧增。

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

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

相关文章

ENSP防火墙,解决不兼容及报错等问题,windows命令行修改网卡配置,配置cloud及防火墙连接,web连接防火墙

解决不兼容和报错等问题 原因1:VirtualBox版本太低(5.1.x)或太高(6.x.x)和eNSP不兼容 卸载virtualbox,下载virtualbox 5.2.28,安装稳定版本的virtualbox 删除原有程序:c:\用户\***\.…

Qt报错:C1083 无法打开包括文件: No such file or directory

我用的是VS2019 添加了一个继承自QTextEdit 的新类QMsgTextEdit, 就出现了这样的报错: 我双击ui_TalkWindow.h, 打开这个文件后, 发现: 我就试着打开qmsgtextedit.h,发现: 于是,我就在当前ui_TalkWindow.h文件的目…

数据可视化-地图可视化-Python

师从黑马程序员 基础地图使用 基础地图演示 视觉映射器 具体颜色对应的代码可以在http://www.ab173.com/中查询RGB颜色查询对照表 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts#准备地图对象 mapMap() #准备数据 data[("北京",…

数据结构学习——栈和队列

1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 …

YOLOv5实战记录05 Pyside6可视化界面

个人打卡,慎看。 指路大佬:【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决 yolov5-master文件夹我换位置后,无法pip install了。解决如下: activate.bat中修改…

关系型数据库与非关系型数据库、Redis数据库

相比于其他的内存/缓存数据库,redis可以方便的实现持久化的功能(保存至磁盘中) 一、关系数据库与非关系型数据库 1.1 关系型数据库 一个结构化的数据库,创建在关系模型基础上一般面向于记录 SQL语句 (标准数据查询语言) 就是一种…

11-pyspark的RDD的变换与动作算子总结

目录 前言 变换算子动作算子 前言 一般来说,RDD包括两个操作算子: 变换(Transformations):变换算子的特点是懒执行,变换操作并不会立刻执行,而是需要等到有动作(Actions)…

大语言模型落地的关键技术:RAG

1、什么是RAG? RAG 是检索增强生成(Retrieval-Augmented Generation)的简称,是当前最火热的大语言模型应用落地的关键技术,主要用于提高语言模型的效果和准确性。它结合了两种主要的NLP方法:检索&#xff…

【智能排班系统】AOP实现操作日志自动记录

文章目录 操作日志介绍自动保存操作日志基本实现思路定义注解枚举业务类型枚举操作人员类型枚举 AOP具体实现方法上添加注解 日志增删改查日志表sql实体类ServiceControllerVo 操作日志介绍 操作日志是对系统或应用程序中所有用户操作、系统事件、后台任务等进行详细记录的文本…

代码随想录算法训练营Day46|LC139 单词拆分

一句话总结:完全背包! 原题链接:139 单词拆分 动态规划之完全背包五部曲: 确定dp数组与下标含义:表示字符串长度为i时,dp[i] true 的话,可以拆分为一个或多个在字典中出现的单词。确定递归公…

贪心算法|122.买卖股票的最佳时机II

力扣题目链接 class Solution { public:int maxProfit(vector<int>& prices) {int result 0;for (int i 1; i < prices.size(); i) {result max(prices[i] - prices[i - 1], 0);}return result;} }; 贪心思路出来了&#xff0c;代码居然如此简单啊&#xff0…

16.Python多线程

如果想让我们的程序同时执行多个任务&#xff0c;就需要使用多线程技术了 。到目前为止&#xff0c;我们编写的程序都是单线程的&#xff0c;在运行时一次只能执行 一个任务。 1 线程相关的知识 1.1 进程 一个进程就是一个正在执行的程序&#xff0c;每一个进程都有自己独立…

软考高级架构师:嵌入式处理器体系结构

一、AI 讲解 嵌入式处理器体系结构中&#xff0c;冯诺依曼结构和哈佛结构是两种最基本的设计模式&#xff0c;它们各有特点和典型应用场景。 结构定义特点典型应用冯诺依曼结构一种将程序存储器和数据存储器合并在同一存储器中的计算机体系结构。这意味着指令和数据共享同一个…

基于javassm实现的水果销售管理网站

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

【C++航海王:追寻罗杰的编程之路】C++的类型转换

目录 1 -> C语言中的类型转换 2 -> 为什么C需要四种类型转换 3 -> C强制类型转换 3.1 -> static_cast 3.2 -> reinterpret_cast 3.3 -> const_cast 3.4 -> dynamic_cast 4 -> RTTI 1 -> C语言中的类型转换 在C语言中&#xff0c;如果赋值运…

【攻防世界】FlatScience

dirsearch 扫描发现四个文件 在login.php 中发现 输入 http://61.147.171.105:61912/login.php/?debug 发现源码 <?php if(isset($_POST[usr]) && isset($_POST[pw])){$user $_POST[usr];$pass $_POST[pw];$db new SQLite3(../fancy.db);$res $db->query(…

【STM32】存储器和位带映射(bit band mapping)

文章目录 0 前言1 关于地址和存储器2 STM32内部存储器3 位带映射&#xff08;bit band mapping&#xff09;4 扩展&#xff1a;IAP 0 前言 最近在研究stm32标准库&#xff0c;对使用宏定义实现位操作的函数非常感兴趣&#xff0c;简单的一句PAout(1) 0;就能实现某个引脚电平的…

【JavaWeb】Day35.MySQL概述——数据库设计-DDL(二)

表操作 关于表结构的操作也是包含四个部分&#xff1a;创建表、查询表、修改表、删除表。 1.创建 语法 create table 表名( 字段1 字段1类型 [约束] [comment 字段1注释 ], 字段2 字段2类型 [约束] [comment 字段2注释 ], ...... 字段n 字段n类型 [约束] [comment …

phpstorm设置头部注释和自定义注释内容

先说设置位置&#xff1a; PhpStorm中文件、类、函数等注释的设置在&#xff1a;setting-》Editor-》FIle and Code Template-》Includes-》PHP Function Doc Comment下设置即可&#xff0c;其中方法的默认是这样的&#xff1a; /** ${PARAM_DOC} #if (${TYPE_HINT} ! "…

SpringBoot新增员工模块开发

需求分析与设计 一&#xff1a;产品原型 一般在做需求分析时&#xff0c;往往都是对照着产品原型进行分析&#xff0c;因为产品原型比较直观&#xff0c;便于我们理解业务。 后台系统中可以管理员工信息&#xff0c;通过新增员工来添加后台系统用户。 新增员工原型&#xf…