期末项目

代码仓库:传送门
视频:组长已经发送给朱老师


  • 选题:负载均衡场景3

  • 选题内容:

    该拓扑是数据中心拓扑的一部分,其中h1是数据中心外的一台客户机,h2-h5是数据中心内的服务器,请根据该拓扑实现一个负载均衡的北向程序,实现h1访问数据中心中四台服务器时能根据链路状况动态改变路径。


  • 项目名称:A P4-based Network Load Balancing Application (基于P4的网络负载均衡项目)

  • 项目设计思路:首先设置一个阈值及查询时间间隔,并且预先记录下所有可走的路径。每隔一段时间计算每个底层交换机每秒的处理速率,即多少数据报每秒,当发现有交换机的处理能力超过设置的阈值,动态调整流量路径,选择一条合适的路径。


  • 实践步骤描述

    • 启动mininet拓扑
    • 设置流量初始默认转发路径
    • 启动控制器,设置阈值及查询时间间隔
    • 令主机h1发送高速率流量,观察可知交换机过载,动态变更转发路径
    • 令主机h1发送低速率流量,观察可知交换机不过载,路径不变更
    • 启动端口嗅探器,验证转发路径变更;服务器端口数据变化,表明控制器实时变更路径

  • 个人分工:

    table l3_forward{
        reads{
            ipv4.dstAddr : lpm;
        }
        actions{
            _nop; _drop; forward;
            update_sw1; update_sw2;
        }
    }

    基于p4程序中流表匹配字段,流表如上,编写八条路径的控制规则
    例如:路径1(s1-s2-s3-h5)的控制规则为path1中的三个文件,l1.txt 是第一层控制规则,l2.txt 是第二层,l3.txt 是第三层
    八条路径如下:

    path1: 1-2-3-h5
    path2: 1-2-3-h4
    path3: 1-2-4-h3
    path4: 1-2-4-h2
    path5: 1-5-3-h5
    path6: 1-5-3-h4
    path7: 1-5-4-h3
    path8: 1-5-4-h2

课程总结

  • 了解什么是SDN
    概述:SDN 是一种集中控制的新网络架构,支持动态弹性管理,其将数据平面和控制平面解耦分离,抽象了数据平面网络资源,并支持通过统一的开放接口对网络直接进行编程控制。一般来说, SDN 网络体系结构主要包括 SDN 网络应用、北向接口、 SDN 控制器、南向接口和 SDN 数据平面共五部分。

  • 学习使用mininet
    概述:Mininet起源于斯坦福大学,是一个非常强大的网络仿真平台,通过此平台,我们可以方便的模拟真实环境的网络操作与架构。
    测试连通性:pingall
    查看链路状态:links
    显示所有链路:net
    查看某台主机信息:xx ifconfig
    通过源码安装mininet:Native Installation from Source

  • 学习了几种常用OVS命令对流表进行操作
    概述:

    • 查看流表:sudo ovs-ofctl -O OpenFlow13 dump-flows xx
    • 按匹配项删除流表:sudo ovs-ofctl -O OpenFlow13 del-flows xx "in_port=1"

  • 利用可视化界面、字符串命令及简单Python脚本创建拓扑
    概述:

    • 可视化界面创建拓扑后连接控制器,控制器类型设置为 Remote Control,设置控制器的IP地址(如果控制器和mininet在同一PC上设置成127.0.0.1)
    • 字符串命令创建简单拓扑:
      线性拓扑:sudo mn --topo=linear,4 # 主机数=交换机数=4
      树形拓扑:sudo mn --topo=tree,depth=2,fanout=2 # 深度为2,设备下挂设备数为2
    • Python脚本创建拓扑:注意要点,利用Python创建拓扑,建立链路的时候不能重复使用同一个端口
      API:
      增加主机:addHost('hostname')
      增加交换机:addSwitch('switchname')
      增加链路:addLink(node1,node2,node1_port,node2_port)
      连接控制器命令:sudo mn --custom topo.py --topo mytopo --controller=remote,ip=控制器IP,port=6633(topo.py为源程序文件名)

  • openflow多级流表机制的优点
    概述:单流表可支持的程序逻辑过于简单,无法满足复杂的业务逻辑要求,而多级流表将数据包的处理逻辑划分为多个子逻辑,由多张流表分别匹配和处理,使数据包的处理以流水线方式进行。多级流表的设计使得流表项聚合成为可能,节省了流表空间,也提高了编程处理逻辑的灵活性。

  • 了解了几种SDN控制器,并初步学习使用 Floodlight 控制器和 OpenDayLight 控制器
    概述:

    • Ryu控制器
      采用Python编写,基于组件的框架,这些组件均以Python模块形式存在,上层为OpenStack和Web提供了编程接口,中间为Ryu自行研发的应用组件,最下层为Ryu底层实现的基本组件。
    • ONOS控制器
      采用Java编写,其设计架构将服务提供商放在首位,由一系列功能模块组成,每个功能模块由一个或多个组件组成,对外提供一种特定服务,核心功能主要包含:北向接口抽象层APIs,分布式核心,南向接口抽象层APIs,软件模块化。
    • OpenDayLight控制器
      采用Java编写,支持OSGI框架和REST接口,支持多种协议,不是正确的抽象化,暴露设备的细节给应用程序,运行时模块化和可拓展,支持服务抽象层(SAL),支持多种南向协议,采用YANG作为模块语言。
      ODL安装
    • Floodlight
      Floodlight是Apache授权并且基于JAVA开发的企业级OpenFlow控制器,稳定、易用,并且开源。
      Floodlight安装

  • Wiresharke抓包验证
    概述:因为这门课,第一次接触了抓包,以前一直听到这词,总觉得很神秘,目前懂得还不是很多,算是初步了解大概,能根据抓包来验证实验结果的正确性。
    wireshark是非常流行的网络封包分析软件,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。

  • 使用ODL下发流表、组表
    概述:Yang UI>Opendaylight-inventory>config>nodes>table>flow设置规则,下发流表
    几个字段解释及值:

    node/openflow:1 交换机编号
    table/0 流表编号
    flow/任意,不冲突即可 流表项编号
    ethernet-type:以太网类型0x0800表示以太网帧是ip协议
    layer-3-match:ipv4-match 三层匹配为ipv4匹配
    ipv4-source:数据包源ip匹配项(这里由于port1进入的数据包只可能是h3发送的所以可以不填)
    ipv4-destination:数据包目的ip匹配项
    flow-name 流表项名字,可不填
    priority 流表项优先级,要大于odl下发的默认流表,这里设置成最大65535
    hard-timeout 硬超时,流表项下发后生效时长
    cookie 可不填,为方便在ovs中查找下发成功的流表项可以设置成容易找的到值如0x02(要填16进制)
    table_id 流表id 默认为0

    opendaylight-inventory->config->nodes->node->group下发组表
    在组表项中设置几个桶,weight代表每个bucks的优先级,之后下发流表使组表生效。


  • 借助Postman通过ODL的北向接口下发流表项

  • 初步学习了解P4
    概述:P4是一门SDN数据平面的编程语言,用于定义转发设备处理数据报的整个过程。
    三大特性:协议无关性、平台独立性、可重配置性
    组成:

    • 首部(header): 定义数据报首部结构
    • 解析器(parser): 根据首部定义解析数据包
    • 流表(table): 用于处理数据报的流表结构
    • 动作(action): 用于处理数据报的动作
    • 控制程序(control program): P4语言的“main”函数

  • 学习了解ECMP
    概述:等价多路径路由(Equal-cost multi-path routing,ECMP),一种路由技术,实现将数据包在不同的路径上传输,其原理是计算出网络中两个节点的最短路径,如果有多条等价最短路径,进行负载均衡。
    优势:

    • 提高链路利用率
    • 路径冗余备份
    • 增加传输带宽
      劣势:
    • 网络中各条路径的实际状况不同可能导致报文乱序
    • 爆炸性增长的问题是算法复杂度过高,难以求取最短路径最优解

  • 实验中遇到几个问题的总结

    • 由于是在自己的机子进行实验,因此并不会像机房的虚拟机一样每次重置至初始状态,在进行基于ODL的实验中,之前下发的流表会重复下发,是因为第二次实验中的拓扑图与上次的拓扑图一致,由于ODL内部机制重复下发了这个流表,因此进行第二次有着与上一次相同拓扑结构的实验的时候,要在ODL中将原先的节点删除。Yang UI>Opendaylight-inventory>config>nodes>Delete
    • 使用mininet的可视化界面搭建拓扑后,要结束实验应该先在命令行窗口使用指令使其终止,再在可视化界面点击进行结束,顺序如果饭回来,程序容易无响应直至崩溃
    • 使用控制器查看建立的拓扑图的时候,有可能出现链路断掉的情况,其中较为简单的解决方案是先建立拓扑然后再开启控制器

  • 感受:这门课的学习,让我对于SDN有了初步了解,也接触了之前从来没听过的一些理论及知识,像是开启了另外一扇门。整个课程下来,应该算只是了解了一些概念性的东西,也是这些知识,让我对于网络的印象有了一些另外的改观。在每次上机实验的时候总是感觉时间流走的很快,还没开始怎么进行实验了,铃声就响了,因为知识储备不够,每次总是在一些地方卡壳,总之还是要努力啊。

SDN期末作业的更多相关文章

  1. SDN 期末作业验收

    前言 SDN 期末作业验收我们是采用的参考场景一,我们在此场景的基础上来做负载均衡,下面是我们搭建的拓扑图 演示视频 https://pan.baidu.com/s/1htkKLPM 负载均衡程序 相 ...

  2. SDN期末作业验收

    作业链接:https://edu.cnblogs.com/campus/fzu/SoftwareDefinedNetworking2017/homework/1585 负载均衡程序 1.github链 ...

  3. SDN期末作业——负载均衡

    作业链接 期末作业 1.负载均衡程序 代码 2.演示视频 地址 3.小组分工 小组:incredible five 构建拓扑:俞鋆 编写程序:陈绍纬.周龙荣 程序调试和视频录制:陈辉.林德望 4.个人 ...

  4. SDN期末作业-通过SDN的应用实现负载均衡

    负载均衡程序 1.程序链接:https://github.com/424baopu/software/tree/master/LoadBalance 2.场景 topo: 场景描述: 服务器host ...

  5. SDN期末作业博客

    一.项目描述 A P4-based Network Load Balancing Application 基于P4的网络负载均衡项目 二.个人分工 The Controller : Acquire t ...

  6. 《SDN期末作业——实现负载均衡》

    队名:取个队名真难 一.网络拓扑(场景二) 二.负载均衡程序 1.建立拓扑的代码 拓扑 2.下发组表流表的代码 下发组表流表 三.演示视频 1.目的 服务器h2,h3,h4上各自有不同的服务,h1是客 ...

  7. SDN课程作业总结

    SDN 期末作业总结 设计场景 我们采用参考场景一,实现负载均衡,拓扑图及端口示意如下: 演示视频 视频地址 关键代码 package loadBalance; import java.io.Buff ...

  8. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  9. 2017秋 FZU SDN 课程作业汇总

    课程: SDN课程上机作业:SDN上机作业 参考作业: deepYY SDN作业: SDN作业 faberry的博客:faberry peiqiaoWang的博客:peiqiaoWang 相关博客汇总 ...

随机推荐

  1. UEP-按钮控制及时间

    按钮的判断 var record = ajaxgrid.getAllRecords(); if(record.length>0){ var isPack=record[0].get(" ...

  2. Centos7安装docker-compse踩过的坑

    一.概要 ​ 本文,我们介绍如何在centos7环境下安装docker-compose, 记录下安装过程步骤以及遇到的问题还有解决办法. 二.安装方式 1.官方安装方式 sudo curl -L ht ...

  3. Vs自定义设置

    1.固定选项卡独立行显示设置 效果如下 2.语言设置 可以从官网寻找所需版本语言包 https://my.visualstudio.com/downloads 3.代码段设置 可以对现有的进行一些改造 ...

  4. Android开发之漫漫长途 XII——Fragment详解

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  5. java垃圾回收的分类

    1.线程数 分为串行垃圾回收器和并行垃圾回收器.串行垃圾回收器一次只使用一个线程进行垃圾回收:并行垃圾回收器一次将开启多个线程同时进行垃圾回收.在并行能力较强的 CPU 上,使用并行垃圾回收器可以缩短 ...

  6. Java数据持久层框架 MyBatis之API学习六(Mapper XML 文件详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  7. 记录linux tty的一次软锁排查2

    在复现tty的死锁问题的时候,文洋兄使用了如下的方式: #include <fcntl.h> #include <unistd.h> #include <stdio.h& ...

  8. ImmutableMap

    不可变集合,为什么使用它呢?线程安全\更有效的利用内存\可作为常量 ImmutableMap.<String, Object> builder().put("yananList& ...

  9. 自己写的日志框架--linkinLog4j--日志框架的必要性

    OK,在开始研究Log4j的源码之前,我们先来自己模拟一个日志工具,名字就叫linkinlog4j好了. 在软件开发过程中,出现bug总是在所难免:事实上,以我个人经验,即使在实际开发阶段,fix b ...

  10. linkin大话面向对象--多态

    java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...