SRv6项目实践(一):环境与工具介绍

news2024/12/25 0:53:12

在一切开始之前,首先介绍一下我们要做什么,做这个要有什么基础,以及实现的环境

1,实验目标与实验基础

我们要在图下图所示的拓扑中,完成在如以下拓扑所示的网络中,配合ONOS实现基本的L2L3转发以及SRv6,项目总体实现功能较为复杂,因此分为多张准备。

本项目要求的基础:Python、Java、P4\P4runtime、ONOS、YANG以及基本的网络协议

2,实验环境与工具

2.1数据平面的拓扑

首先,给大家看一下完整的代码,有几个重要的角色:

  • IPv6Host:这是一个支持IPv6的主机,主要实现了一个ip地址更新的功能,并继承了mininet的Host类,config函数主要是完成对它的超类属性的配置和额外属性的配置

  • TutorialTopo:实验拓扑图,就是如上图所示的那个图,定义了两个叶交换机和两个脊交换机,并增设链路,然后给各个主机赋予配置

  • 主函数:创建一个Mininet网络,开启它的cli

import argparse

from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.net import Mininet
from mininet.node import Host
from mininet.topo import Topo
from stratum import StratumBmv2Switch

CPU_PORT = 255


class IPv6Host(Host):
    """Host that can be configured with an IPv6 gateway (default route).
    """

    def config(self, ipv6, ipv6_gw=None, **params):
        super(IPv6Host, self).config(**params)
        self.cmd('ip -4 addr flush dev %s' % self.defaultIntf())
        self.cmd('ip -6 addr flush dev %s' % self.defaultIntf())
        self.cmd('ip -6 addr add %s dev %s' % (ipv6, self.defaultIntf()))
        if ipv6_gw:
            self.cmd('ip -6 route add default via %s' % ipv6_gw)
        # Disable offload
        for attr in ["rx", "tx", "sg"]:
            cmd = "/sbin/ethtool --offload %s %s off" % (self.defaultIntf(), attr)
            self.cmd(cmd)

        def updateIP():
            return ipv6.split('/')[0]

        self.defaultIntf().updateIP = updateIP

    def terminate(self):
        super(IPv6Host, self).terminate()


class TutorialTopo(Topo):
    """2x2 fabric topology with IPv6 hosts"""

    def __init__(self, *args, **kwargs):
        Topo.__init__(self, *args, **kwargs)

        # Leaves
        # gRPC port 50001
        leaf1 = self.addSwitch('leaf1', cls=StratumBmv2Switch, cpuport=CPU_PORT)
        # gRPC port 50002
        leaf2 = self.addSwitch('leaf2', cls=StratumBmv2Switch, cpuport=CPU_PORT)

        # Spines
        # gRPC port 50003
        spine1 = self.addSwitch('spine1', cls=StratumBmv2Switch, cpuport=CPU_PORT)
        # gRPC port 50004
        spine2 = self.addSwitch('spine2', cls=StratumBmv2Switch, cpuport=CPU_PORT)

        # Switch Links
        self.addLink(spine1, leaf1)
        self.addLink(spine1, leaf2)
        self.addLink(spine2, leaf1)
        self.addLink(spine2, leaf2)

        # IPv6 hosts attached to leaf 1
        h1a = self.addHost('h1a', cls=IPv6Host, mac="00:00:00:00:00:1A",
                           ipv6='2001:1:1::a/64', ipv6_gw='2001:1:1::ff')
        h1b = self.addHost('h1b', cls=IPv6Host, mac="00:00:00:00:00:1B",
                           ipv6='2001:1:1::b/64', ipv6_gw='2001:1:1::ff')
        h1c = self.addHost('h1c', cls=IPv6Host, mac="00:00:00:00:00:1C",
                           ipv6='2001:1:1::c/64', ipv6_gw='2001:1:1::ff')
        h2 = self.addHost('h2', cls=IPv6Host, mac="00:00:00:00:00:20",
                          ipv6='2001:1:2::1/64', ipv6_gw='2001:1:2::ff')
        self.addLink(h1a, leaf1)  # port 3
        self.addLink(h1b, leaf1)  # port 4
        self.addLink(h1c, leaf1)  # port 5
        self.addLink(h2, leaf1)  # port 6

        # IPv6 hosts attached to leaf 2
        h3 = self.addHost('h3', cls=IPv6Host, mac="00:00:00:00:00:30",
                          ipv6='2001:2:3::1/64', ipv6_gw='2001:2:3::ff')
        h4 = self.addHost('h4', cls=IPv6Host, mac="00:00:00:00:00:40",
                          ipv6='2001:2:4::1/64', ipv6_gw='2001:2:4::ff')
        self.addLink(h3, leaf2)  # port 3
        self.addLink(h4, leaf2)  # port 4


def main():
    net = Mininet(topo=TutorialTopo(), controller=None)
    net.start()
    CLI(net)
    net.stop()
    print '#' * 80
    print 'ATTENTION: Mininet was stopped! Perhaps accidentally?'
    print 'No worries, it will restart automatically in a few seconds...'
    print 'To access again the Mininet CLI, use `make mn-cli`'
    print 'To detach from the CLI (without stopping), press Ctrl-D'
    print 'To permanently quit Mininet, use `make stop`'
    print '#' * 80


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description='Mininet topology script for 2x2 fabric with stratum_bmv2 and IPv6 hosts')
    args = parser.parse_args()
    setLogLevel('info')

    main()

2.2实验工具

其次介绍一下项目的工具,虽然很枯燥,但是一定要看:

M

ake command

Description
make depsbuild 所有需要的依赖
make p4-buildbuild P4程序
make p4-test运用p4测试
make start主角:创建Mininet网络和创建ONOS容器
make stop关闭所有容器
make restart重新打开先前创建的容器
make onos-cli进入ONOS-cli的命令行
make onos-log显示onos的日志信息
make mn-cli进入mininet的命令行
make mn-log显示mininet的日志信息
make app-buildbuild onos的APP
make app-reload装载APP到onos上
make netcfg把网络配置文件装载到onos上

其中start的打开一看,实际上就是区分不同的拓扑的py脚本,然后在后台创建所有容器。

_start:
	$(info *** Starting ONOS and Mininet (${NGSDN_TOPO_PY})... )
	@mkdir -p tmp/onos
	@NGSDN_TOPO_PY=${NGSDN_TOPO_PY} docker-compose up -d

start: NGSDN_TOPO_PY := topo-v6.py
start: _start

 yml文件如下所示:

  • 可以看到,两个服务的镜像分别是opennetworking/ngsdn-tutorial:stratum_bmv2,传参是刚才的拓扑文件
  • 和onosproject/onos:2.2.2,有一个关键的links:- mininet,可以将mininet的ip记录到onos中,这样就可以访问到它,实际上这里的ip都是127.0.0.1
version: "3"

services:
  mininet:
    image: opennetworking/ngsdn-tutorial:stratum_bmv2
    hostname: mininet
    container_name: mininet
    privileged: true
    tty: true
    stdin_open: true
    restart: always
    volumes:
      - ./tmp:/tmp
      - ./mininet:/mininet
    ports:
      - "50001:50001"
      - "50002:50002"
      - "50003:50003"
      - "50004:50004"
    # NGSDN_TOPO_PY is a Python-based Mininet script defining the topology. Its
    # value is passed to docker-compose as an environment variable, defined in
    # the Makefile.
    entrypoint: "/mininet/${NGSDN_TOPO_PY}"
  onos:
    image: onosproject/onos:2.2.2
    hostname: onos
    container_name: onos
    ports:
      - "8181:8181" # HTTP
      - "8101:8101" # SSH (CLI)
    volumes:
      - ./tmp/onos:/root/onos/apache-karaf-4.2.8/data/tmp
    environment:
      - ONOS_APPS=gui2,drivers.bmv2,lldpprovider,hostprovider
    links:
      - mininet

环境介绍完了,接下来开始第一个实验吧!

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

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

相关文章

港联证券|券商再迎利好!这一比例大幅下调,释放300亿资金

券商利好接二连三。 4月10日,即日起下调证券公司转融通保证金份额。资信优质的公司,保证金份额由20%下调至5%;资信杰出的公司,由20%下调至10%;其余公司由25%下调至15%。中证金融预计,保证金份额下调后&…

Linux系统之tomcat的安装方法

Linux系统之tomcat的安装方法一、tomcat介绍1.tomcat简介2.tomcat官网二、本次环境规划三、安装jdk1.下载jdk包2.安装jdk3.检查jdk版本四、安装tomcat1.下载tomcat2.解压tomcat软件包3.设置环境变量4.查看tomcat版本五、启动tomcat1.启动tomcat服务2.检查tomcat服务状态3.访问t…

原来情感可以这样影响用户体验设计

🔥情绪的基本情况 Emotion:即刻的生理反应, Feeling:物理的或者心理上的,是emotion经过思考后的 Mood:持续时间更长,是一种状态,受到很多因素影响(天气、睡眠&#x…

92-TCP三次握手及TCP四次挥手

TCP三次握手及TCP四次挥手1.tcp三次握手(1)tcp的特点(2)tcp三次握手发生在什么阶段(3)tcp协议报头(4)tcp三次握手的流程2.tcp四次挥手(1)tcp四次挥手发生在什么阶段(2)tcp四次挥手的流程(3)能不能将服务器发端发送的ACK和FIN放在一起发送呢1.tcp三次握手 (1)tcp的特点 TCP 协…

十六、市场活动:查看市场活动明细(二)

功能需求 点击市场活动名称链接,跳转到明细页面,查看市场活动明细 -市场活动的基本信息 -市场活动下所有的备注信息 功能分析 流程图 代码实现 一、ActivityRemarkMapper 1.ActivityRemarkMapper接口 /*** 根据市场活动id查询备注*/List<ActivityRemark> selectActivi…

贪吃蛇小项目

1.总体程序 #include <curses.h> #include <stdlib.h> #include <pthread.h> #include <math.h> #include <time.h> struct Snake //贪吃蛇身子节点 {char node; //节点序号int row; //行坐标int column; //列坐标stru…

探索实践低光照场景下YOLOv5s模型上限,融合CBAM注意力机制开发构建基于改进YOLOv5s的低光照条件下目标检测识别分析系统

在现实生活场景里面&#xff0c;很多场景下光线光照条件都是比较差的&#xff0c;比如夜晚、室内等&#xff0c;这时候以往的目标检测模型是否还能够胜任我们所需的目标检测任务呢&#xff1f;这里主要的想法就是基于地光线条件下的数据集来开发构建目标检测系统&#xff0c;探…

Flowable6.x导出/查看/跟踪流程图(续)

书接上回 项目源码仓库 无论是待办、已办&#xff0c;亦或是流转中、已结束的流程实例&#xff0c;通过使用JS绘制SVG格式的交互式流程图&#xff0c;与以上篇博文中三种方式相比&#xff0c;在效果上都具有明显优势。 运行效果如下图所示&#xff1a; 整合、改造Flowable中…

110.【23种设计模式--创建者模式】

Java 23种设计模式 (一)、设计模式相关内容介绍1.软件设计模式概述(1).软件设计模式的产生背景(2).软件设计模式的概念(3).学习设计模式的重要性(4).设计模式分类 2.UML图(1).类图概述(2).类图的作用(3).类图表示法 3.软件设计原则(1).开闭原则 (重写不修改)(2).里氏代换原则 (…

node的安装与卸载

node的安装与卸载 今天遇到个问题 使用npm命令时报错显示栈溢出&#xff0c;所以将node重装了一下&#xff0c; 一.卸载node&#xff1a; 1.在程序与功能里卸载node.js&#xff0c;然后删除node相关文件夹&#xff0c;此次安装我将node安装在C盘里&#xff0c;将他的全局缓存…

10万字信用大数据一体化监管平台建设方案word

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 1.1、 系统主要功能需求分析 XX公共信用信息管理系统的主要业务流程包括信用信息资源编录管理流程、信用信息归集流程、信用信息服务流程和信用信息异议处理流程。 一.1.1…

NLP作业01:利用HMM实现词性标注

作业头 这个作业属于哪个课程自然语言处理这个作业要求在哪里利用HMM实现词性标注作业要求我在这个课程的目标实现词性标注这个作业在哪个具体方面帮助我实现目标代码实现参考文献1.隐马尔科夫模型 2.基于HMM的词性标注  3.基于HMMViterbi算法的词性标注 Python 文章目录 作…

【LeetCode: 673. 最长递增子序列的个数 | 动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

LeetCode 热题 HOT 100:从前序与中序遍历序列构造二叉树、二叉树展开为链表、二叉树中的最大路径和

LeetCode 热题 HOT 100 105. 从前序与中序遍历序列构造二叉树 题目&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c; 请构造二叉树并返回其根节点。 示例 1&#xff1…

webassembly——同源策略问题的处理(浏览器不能加载本地资源的问题)

原因&#xff1a;在用chatGPT生成可视化地图前端文件后&#xff0c;打开不能正常显示 WebAssembly是一种新的二进制代码格式&#xff0c;它可以提供更高的性能和更好的安全性。WebAssembly遵循同源策略&#xff0c;这意味着只有与运行WebAssembly代码相同域名下的JavaScript代码…

Linux --- 常用命令

一、常用命令 1.1、常用命令演示 在这一部分中&#xff0c;我们主要介绍几个常用的命令&#xff0c;让大家快速感受以下Linux指令的操作方式。主要包含 以下几个指令&#xff1a; 1.2、Linux命令使用技巧 在我们使用Linux系统命令时&#xff0c;可以使用以下几个技巧&#x…

丹麦PR electronics信号隔离器3185A1 3185A2安全栅

应用 1:1 标准电流信号隔离&#xff0c;信号范围 0(4)...20 mA。标准 DIN 导轨安装。无论在技术或是成本上&#xff0c;都是电流信号电气隔离的选择。能有效抑制浪涌电流&#xff0c;保护控制系统远离信号噪声和瞬变的影响。消除接地环路和测量浮地信号。安装于安全区域或 Zon…

03、Cadence使用记录之超多引脚元器件的快速创建方法(OrCAD Capture CIS)

03、Cadence使用记录之超多引脚元器件的快速创建方法&#xff08;OrCAD Capture CIS&#xff09; 参考的教程是B站的视频&#xff1a;allegro软件入门视频教程全集100讲 前置教程&#xff1a; 01、Cadence使用记录之新建工程与基础操作&#xff08;原理图绘制&#xff1a;OrC…

个人建议:真的不要去小公司...

软件测试人员如果想要有更好的发展真的不要去小公司&#xff01; 为什么&#xff1f; 小公司的测试团队相对较小&#xff0c;往往只有一两个人&#xff0c;缺乏资源和技术支持&#xff0c;难以优化测试流程和提高测试效率。 小公司一般缺乏完善的软件开发流程和质量管理体系&a…

基于LSTM神经网络的通用股票预测源代码+模型+数据集

基于神经网络的通用股票预测模 下载地址&#xff1a;基于LSTM神经网络的通用股票预测源代码模型数据集 0 使用方法 How to use 使用getdata.py下载数据&#xff0c;或者使用自己的数据源&#xff0c;将数据放在stock_daily目录下 使用data_preprocess.py预处理数据&#xff…