• 2019 SDN大作业


    简单的负载均衡

    1.分组情况

    组名:蓝蓝的大白牙

    学号 姓名 贡献度
    031702507 黄皓 13%
    031702508 石晓楠 24%
    031702511 古力亚尔 13%
    031702525 周鑫煌 20%
    031702532 陈聪(组长) 30%

    2.作业内容

    Github仓库

    视频链接

    3.实现关键

    以如下拓扑为基础

    img

    搭建拓扑的代码如下:

    from mininet.topo import Topo
    
    class MyTopo( Topo ):
    
        def __init__( self ):
        
            # initilaize topology   
            Topo.__init__( self )
        
            # add hosts and switches
            host1 = self.addHost( 'h1' )
            host2 = self.addHost( 'h2' )
        host3 = self.addHost( 'h3' )
            switch1 = self.addSwitch( 's1' )
            switch2 = self.addSwitch( 's2' )
            switch3 = self.addSwitch( 's3' )
    
    
            # add links
            self.addLink(host1,switch1)
            self.addLink(switch1,switch2)
            self.addLink(switch1,switch3)
            self.addLink(switch2,switch3)
            self.addLink(switch2,host2)
            self.addLink(switch2,host3)
    
    
    topos = { 'mytopo': ( lambda: MyTopo() ) }
    

    针对s2这个交换机来看,初始情况下来自h2和h3的数据包都往是s2的1端口通过,欲实现在s2端口1满载时来自h3的数据包改为往s2-eth2通过。

    端口的满载状态通过该端口的数据率得以判断。

    #获取s2端口1的流量 
    uri = 'http://127.0.0.1:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:2/node-connector/openflow:2:1'
    
    response, content = http.request(uri=uri, method='GET')
    
    content = json.loads(content)
    
    statistics = content['node-connector'][0]['opendaylight-port-statistics:flow-capable-node-connector-statistics']
    
    bytes1 = statistics['bytes']['transmitted']
    #间隔1s后获取bytes2
    speed=float(bytes2-bytes1)/1
    

    下发的流表项代码:

    	#s2流表
    	#在检测h2发包的时候s2的1口流量空闲时发的流表
    	h2_to_s2_1 ='{"flow": [{"id": "0","match": {"ethernet-match":'
               		'{"ethernet-type": {"type": "2048"}},'
    				'"ipv4-source":"10.0.0.2/32","ipv4-destination": "10.0.0.1/32"},'
            		'"instructions": {"instruction": [{"order": "0",'
            		'"apply-actions": {"action": [{"output-action": {'
                	'"output-node-connector": "1"},"order": "0"}]}}]},'
            		'"priority": "101","cookie": "1","table_id": "0"}]}'
    	#在检测h3发包的时候s2的1口流量空闲时发的流表
    	h3_to_s2_1 ='{"flow": [{"id": "1","match": {"ethernet-match":'
               		'{"ethernet-type": {"type": "2048"}},'
    				'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
            		'"instructions": {"instruction": [{"order": "0",'
                	'"apply-actions": {"action": [{"output-action": {'
                	'"output-node-connector": "1"},"order": "0"}]}}]},'
            		'"priority": "101","cookie": "1","table_id": "0"}]}'
    	h3_to_s2_1_full ='{"flow": [{"id": "1","match": {"ethernet-match":'
                		'{"ethernet-type": {"type": "2048"}},'
    	 			'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
             		'"instructions": {"instruction": [{"order": "0",'
                	'"apply-actions": {"action": [{"output-action": {'
                	'"output-node-connector": "1"},"order": "0"}]}}]},'
             		'"priority": "100","cookie": "1","table_id": "0"}]}'
    	#在检测h3发包的时候s2的1口流量满载时发的流表	
    	h3_to_s2_2 ='{"flow": [{"id": "2","match": {"ethernet-match":'
               		'{"ethernet-type": {"type": "2048"}},'
    				'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
            		'"instructions": {"instruction": [{"order": "0",'
                	'"apply-actions": {"action": [{"output-action": {'
                	'"output-node-connector": "2"},"order": "0"}]}}]},'
            		'"priority": "101","cookie": "1","table_id": "0"}]}'
    	h3_to_s2_2_full ='{"flow": [{"id": "2","match": {"ethernet-match":'
                		'{"ethernet-type": {"type": "2048"}},'
    	 			'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
             		'"instructions": {"instruction": [{"order": "0",'
                 	'"apply-actions": {"action": [{"output-action": {'
                	'"output-node-connector": "2"},"order": "0"}]}}]},'
            		'"priority": "100","cookie": "1","table_id": "0"}]}'
    	#s3流表
    	s3_1='{"flow": [{"id": "0","match": {"ethernet-match":'
            '{"ethernet-type": {"type": "2048"}},'
    		'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
            '"instructions": {"instruction": [{"order": "0",'
            '"apply-actions": {"action": [{"output-action": {'
            '"output-node-connector": "1"},"order": "0"}]}}]},'
            '"priority": "101","cookie": "1","table_id": "0"}]}'
    	#s1流表
    	s1_h2_To_h1='{"flow": [{"id": "0","match": {"ethernet-match":'
            	'{"ethernet-type": {"type": "2048"}},'
    			'"ipv4-source":"10.0.0.2/32","ipv4-destination": "10.0.0.1/32"},'
            	'"instructions": {"instruction": [{"order": "0",'
            	'"apply-actions": {"action": [{"output-action": {'
            	'"output-node-connector": "1"},"order": "0"}]}}]},'
            	'"priority": "101","cookie": "1","table_id": "0"}]}'
    	s1_h3_To_h1='{"flow": [{"id": "1","match": {"ethernet-match":'
            	'{"ethernet-type": {"type": "2048"}},'
    			'"ipv4-source":"10.0.0.3/32","ipv4-destination": "10.0.0.1/32"},'
            	'"instructions": {"instruction": [{"order": "0",'
            	'"apply-actions": {"action": [{"output-action": {'
            	'"output-node-connector": "1"},"order": "0"}]}}]},'
            	'"priority": "101","cookie": "1","table_id": "0"}]}'
    	headers = {'Content-type': 'application/json'}
    

    操作步骤:

    1. 在创建拓扑前,先打开opendaylight控制器
    2. 创建拓扑,并查看拓扑结构
    3. 测试主机之间的连通
    4. wireshark抓包监控流量
    5. 调用负载均衡程序controller.py,使用sudo python controller.py命令执行
    6. 查看交换机s2流表项

    此时s2-eth1通畅,h3数据包从1端口出的优先级高
    img

    此时s2-eth1满载,h3数据包从2端口出的优先级高
    img

    4.心得体会

    1.黄皓
    SDN这门课本就是创新课,很多知识都很新,有很高的实用性和很强的实践性。老师上课的时候也觉得很有意思,结合上课时的知识再加上实验课马上动手操作实践,对于这门课了解的也更加深刻,还知道了P4语言,边缘计算,SVN,ryu控制器,opendaylight控制器,postman的使用,Wireshark的抓包等。在小组汇报中选择了SDN+机器学习的课题,虽然在最后的大作业中没有选择这个题目,但是还是对机器学习和SDN二者的发展和结合有了浅层的了解。负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。负载均衡有许多种算法可以用在各种各样的场景下,本次大作业因为时间考试等关系,选择了比较简单的应用场景,但还是从中学习了很多,切实了解了负载均衡的思想。

    2.陈聪
    上学期刚把计算机网络学完,还在感叹创造者的智慧,这学期的SDN课就让我拓开了眼界。通过它较为短暂的发展史我也逐步了解的SDN究竟为何物,是否以某个不为人知的事物影响并服务着我们的生活。这门课程学习中的几个实验也着实让我找寻到了乐趣,即使有些时候因学习资料的匮乏和不确定性而心烦意乱(无能狂怒)。由此看来,还得好好培养艰苦奋斗的精神。
    今后我也会深入学习网络方面的知识,从繁杂纷乱中找到美好。

    3.石晓楠
    在本学期SDN的第一节课,老师问我们对SDN了解多少的时候,说实话我对SDN是真的一无所知,想着又是软件又是网络的,应该很难吧。随着课程的深入,我掌握了越来越多的东西,了解了mininet的使用方法,建拓扑啊之类的,还学会了下发流表,RYU控制器的一些基础的使用方法。老师发布的“阅读作业”也让我了解了一些SDN的知识。平时的作业有时候做的并不是特别好,但还是有所收获。课程虽然短暂,但也算学习了一些新的知识。期末做的有关机器学习和SDN联系的汇报,也让我对这方面内容有了更深的了解和理解。最后的大作业,让我对这门课的理解也更深入了一些,是有关负载均衡的内容,我们的组长带领着我们完成了这个实验,可算是收获了很多,希望以后还有机会能够深入的了解,接触SDN。

    4.古力亚尔·艾山
    通过本学期SDN的课程学习,接触到了比较前沿的与SDN相关的新概念和新知识,最大的收获就是通过实践熟悉了一些陌生的朋友,例如openflow,控制器,mininet,抓包分析等。Openflow,是南向协议的一种,当下比较主流,它只负责对流的管理,不涉及交换设备属性的管理。控制器有RYU、NOX、POX、Floodlight(FL)、OpenDayLight(ODL)、ONOS等等,不同的控制器设计思路不同、消息/事件机制不同、性能不同、编程语言不同,在本学期主要掌握ODL和RYU两个控制器。Mininet是一个拓扑仿真工具,对我们来说,它就是帮我们虚拟地搭建了一个硬件网络,网络中有交换机,有主机,有相互之间的线路连接,通过它我们就得到了一张网。最后抓包分析,Wireshark,它通过监听网卡,把收发的数据包全部列出来供我们查看,我们可以通过抓包,找出是哪个环节出了问题,进而可以发现是我们在Openflow上的操作不对,还是我们对传统协议的兼容出了问题,亦或是我们在传统的通信环节上出了岔子。
    通过一学期的学习,我拓宽了我的眼界,储备新知识,收获很大,当然也很开心。最后要夸一下老师的教学方式,理论和实践的结合,这样的教学方式对学生学习新知识有很大的帮助。还要夸一下我的队友们,大家都很优秀,在和大家相处的过程中,我发现了自身很多的不足之处,我会努力向大家看齐。

    5.周鑫煌
    起初选择SDN这门课的时候,对什么SDN真的是没有什么概念,只是为了学分而迫不得已的选择。但是随着课程的讲解,发现这门课被选为创新课程不是没有原因的,课程的知识非常高端前沿。起初自己什么都不懂,一些实验的配置没有大佬的指导的话晕头转向根本都不懂。随着对一些陌生的概念有了初步的了解,自己通过实验也学到了很多东西。用mininet创建拓扑,使用ovs虚拟交换机查看流表、下发流表,利用Wireshark抓包分析报文,使用OpenDayLight,RYU,了解了p4语言等等等等,对网络方面的知识也有了更宽广的了解。目前sdn的发展还属于朝阳阶段,网络上的相关资料也少之又少,但这也给了我们留下了对知识更多的探索空间。希望自己未来可以沉淀下心来,找到一个适合自己的研究方向,探索更多不一样的未知。

  • 相关阅读:
    HashMap深度解析:一文让你彻底了解HashMap
    阿里十年技术大咖,教你如何分析1.7中HashMap死循环
    HashMap 底层实现、加载因子、容量值及死循环
    HashMap为什么是线程不安全的
    一文搞定HashMap的实现原理和面试
    @面试中常问的List去重问题,你都答对了吗?
    不按套路出牌,HashMap负载因子超过1会怎样?
    HashMap是如何工作的
    Jdk7与Jdk8 中的 HashMap 和 ConcurrentHashMap 全解析
    深入理解HashMap+ConcurrentHashMap的扩容策略
  • 原文地址:https://www.cnblogs.com/Jamwong/p/12158743.html
Copyright © 2020-2023  润新知