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的双向通道至此完全打通。

   

原文地址:https://www.cnblogs.com/kl107/p/13235920.html