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