zoukankan      html  css  js  c++  java
  • OpenDaylight二层转发机制实验

    一、实验目的

    • 掌握OpenDaylight的安装、启动及使用
    • 掌握基于OpenDaylight的二层转发原理

    二、实验原理

      在SDN网络中,处于末端的主机并不知道其连接的网络是SDN,某台主机要发送数据包到另一台主机,仍然需要进行IP到MAC地址的ARP解析。SDN网络中由于引入了控制器的角色,其二层数据转发的机制与普通二层以太交换机洪泛+MAC地址学习机制存在很大的差异。当源IP要与目的IP通信时,会将ARP请求转发到控制器,由控制器帮助询问目的主机的MAC并将结果返回给源主机。

      本实验在SDN环境中配置相同网段的两台主机,通过测试二者之间的数据转发来理解和掌握二层转发机制。

    三、实验步骤:

      1、创建一台ODL控制器,一台mininet主机。

      2、对于ODL控制器,启动opendaylight    

    cd /home/openlab/openlab/distribution-karaf-0.3.0-Lithium/bin/
    sudo ./karaf

      3、对于mininet主机 创建拓扑topo2.py  

     1 """Custom topology example
     2 Two directly connected switches plus two hosts for each switch:
     3    host1 --- switch1 --- switch2 --- host3
     4                |            |
     5                |            |
     6              host2        host4
     7 """
     8 from mininet.topo import Topo
     9 
    10 class MyTopo( Topo ):
    11     "Simple topology example."
    12 
    13     def __init__( self ):
    14         "Create custom topo."
    15 
    16         # Initialize topology 
    17         Topo.__init__( self )
    18          
    19         # Add hosts and switches
    20         Host1 = self.addHost( 'h1' )
    21         Host2 = self.addHost( 'h2' )
    22         Host3 = self.addHost( 'h3' )
    23         Host4 = self.addHost( 'h4' )
    24         Switch1 = self.addSwitch( 's1' )
    25         Switch2 = self.addSwitch( 's2' )
    26     
    27         # Add links
    28         self.addLink( Host1, Switch1 )
    29         self.addLink( Host2, Switch1 )
    30         self.addLink( Switch2, Host3 )
    31         self.addLink( Switch2, Host4 )
    32         self.addLink( Switch1, Switch2 )
    33 
    34 topos = { 'mytopo': ( lambda: MyTopo() ) }

      执行命令生成拓扑

    screen mn --custom /home/mininet/topo-2sw_2host.py --topo mytopo --controller=remote,ip=10.0.0.226,port=6633 --switch ovsk,protocols=OpenFlow10

      各参数解释:

      --controller:指定控制器,remote为远程控制器,并指定IP地址、端口号。

      --custom:指定自定义拓扑

      --topo:指定拓扑的名字

      --switch:指定虚拟交换机类型,ovsk表示交换机类型为ovs kernel mode

      4、在ODL控制器上打开浏览器,输入http://localhost:8181/index.html进行登录,账号密码都为admin。

      5、Topology可以查看当前拓扑。图中拓扑没有显示主机。

         Nodes查看节点信息:

       可以查看具体统计数据:

       6、使用mininet主机进行h1 ping h3操作。再用ovs-ofctl dump-flows s1来查看流表

      

       7、抓包查看二层转发机制过程

     (1)源主机h1(10.0.0.1)发出ARP请求h3(10.0.0.3)的MAC,交换机SW1并不知道如何转发该包,因此将其通过Packet In消息发送到Controller处理。

    (2)Controller收到ARP请求后,将h1的mac和交换机id、入端口绑定,并要求每一台SW所对应10.0.0.0/8网段的非SW互联端口(只有这些端口是连接主机或传统网络的)发出ARP来请求10.0.0.3的MAC地址。这里Controller并不是简单的将收到ARP原封不动的发出,而是将源IP改为默认网关IP地址,然后发出。

    (3)只有h3(10.0.0.3)才会响应ARP,它将ARP Response发送到SW2。SW2也不知道如何处理,因此将ARP封装在Packet In中发送到Controller。

    (4)Controller发现这是h3发的ARP响应,将h3mac和交换机id、入端口绑定,并且确认这是之前10.0.0.1发送的ARP请求,因此它会将该ARP通过OF协议发到SW1,同时指示SW1将其送出的端口(也就是h1对应的端口)。SW1执行该操作。

    (5)Controller在收到h3的ARP后也得知了10.0.0.3的位置,它根据网络拓扑计算,可以得到全网到达10.0.0.3和10.0.0.1的转发路径,并将流表通过OF Flow Modify消息推送到每一台交换机上。

    (6)h1收到ARP Response后完成ARP解析过程,然后它构造ICMP PING Request数据包,其中源和目MAC分别为h1和h3的MAC,源和目IP分别为h1和h3的IP。由于SW1和SW2都已经成功的装载了到h3(10.0.0.3)的流表,因此该数据包将被顺利发送到h3。

    (7)h3收到该ICMP PING Request,源是h1,但是此时它尚未有h1的MAC,于是还要进行一次ARP解析,SW2再次将ARP请求封装成Packet In消息发送Controller。

    (8)Controller已经得知h1的MAC,可直接响应,并通过OF向SW2返回ARP结果和所需要送出的端口。

    (9)h3学到ARP后,即可构造ICMP Response包,发送到SW2,SW2根据h1目的地址匹配转发表将其转发到SW1,SW1根据h1目的地址匹配转发表将其发送到h1对应的端口。h1到h3的双向通道至此完全打通。

       

  • 相关阅读:
    模块化利器:RequireJS常用知识
    移动端适配:font-size设置的思考
    样式化复选框
    jquery tmpl 详解
    移动前端相关解决方案整理
    常用页面布局方式介绍
    移动端制作的常见问题及解决方法
    手机端页面自适应:rem布局
    React工程化之PWA之serviceWorker
    React之JSX循环遍历方法对比
  • 原文地址:https://www.cnblogs.com/kl107/p/13235920.html
Copyright © 2011-2022 走看看