多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测

时间:2024-03-30 14:18:17

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测

目录

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测

一. 实验目的

二. 实验原理

三. 实验任务

四 实验步骤

4.1 实验环境

4.2 实验步骤操作

4.3 实验拓扑图

五 拓扑检测原理

5.1 网络拓扑检测原理

5.2 全局拓扑检测方案


网络拓扑检测对于网络策略的执行十分重要,本题主要考察对拓扑检测原理的理解以及对全局拓扑的检测,同时介绍了多控制器集群环境下的网络拓扑发现原理。

 

一. 实验目的

1.掌握网络拓扑检测相关原理

2.熟悉SDN网络中拓扑发现机制

3.掌握控制器集群原理

二. 实验原理

在SDN网络中拓扑检测是相当重要的,LLDP以及其他拓扑检测协议广泛应用于网络拓扑检测中,通过本实验掌握其检测原理,了解其原理实现过程。同时针对SDN网络中通过openflow协议将底层网络交由控制器处理,可以通过控制器集群操作实现,控制器可以彼此分享各自的运行状态,当底层Openflow交换机连接多个控制器时,由交换机确定主备控制器,这对于容错和高可用性是非常有用的。

三. 实验任务

1.搭建下图中所示环境,给出控制器web界面拓扑截图,并分析上述环境中采用的控制器网络拓扑检测原理。

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测

2.在上述网络环境中,给出一种全局拓扑检测方案,用简洁的流程图描述检测拓扑的过程。

四. 实验步骤

4.1 实验环境

采用的环境如下所述:

  • Ubuntu14.04LTS虚机中安装2.2.1版本的mininet网络仿真软件(IP地址为192.168.88.136)
  • 2台ubuntu16.04LTS虚机分别安装ONOS1.10.13版本的控制器(IP地址分别为controller 1: 192.168.88.128、controller 2: 192.168.88.139)

采用mininet网络仿真软件实现底层网络拓扑,在脚本中指定其控制器等。同时由于题中需要使用两台控制器,因此我们采取两台虚机分别搭建ONOS1.10.13版本的方案。在两台虚机中分别开启控制器,利用python脚本设置拓扑连接对应的控制器,完成上述环境的搭建。同时,鉴于题中使用两台控制器,所以借用ONOS中的onos-form-cluster脚本实现ONOS控制器的分布式集群,可以使得发生事件被分布式存储与集群中的所有节点共享。同时,我们也可以在集群状态中点击各个控制器查看各个控制器下的WEB界面拓扑。

4.2 实验步骤操作

1)首先我们需要开启两台ONOS控制器,不过本题采用的是ONOS源码编译完成后生成的onos.tar.gz部署开启onos,和基础题中的开启方法有所区别,具体的步骤如后文所述。

2)在两台虚拟机中生成ssh**,将**拷贝到两台虚机中,实现两个虚机的免密访问,具体操作百度即可(最常用的命令为ssh-******和ssh-copy-id)。

3)在onos源代码编译完成后会在buck-out文件夹中生成一个onos.tar.gz,将此文件夹拷贝到home目录下,并解压到/tmp目录下,如下图中所示:

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图1 onos.tar.gz解压

4)在该压缩包解压完成后,执行/tmp/onos-1.10.5-SNAPSHOT/apache-karaf-3.0.8/bin/start即可开启控制器。

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图2 onos开启命令

5)执行/tmp/onos-1.10.5-SNAPSHOT/apache-karaf-3.0.8/bin/client命令即可登入ONOS的经典karaf界面。

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图 3 登录onos的karaf界面

6)在另一台ONOS控制器的虚机中重复操作3~5,完成两台ONOS控制器的开启工作。

7)分别在两台控制器中**的基本app模块(否则之后mininet创建的ovs交换机无法连接到控制器),如下图中所示:

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图4 **对应的app模块

8)在mininet虚机中根据题中拓扑创建对应的python脚本文件:

#!/usr/bin/env python
# coding=utf-8  
from mininet.net import Mininet  
from mininet.node import RemoteController  
from mininet.node import Host  
from mininet.node import OVSSwitch  
from mininet.cli import CLI  
from mininet.log import setLogLevel, info  
#from mininet.link import TCLink, Intf  
#from subprocess import call  
  

def myNetwork():  
    #创建一个mininet网络,其中build表示是否立即从topo构建网络,默认为True  
    #ipBase表示设置网络的ip地址段  
    net = Mininet(topo=None, build=False, ipBase='10.0.0.0/8')  
    #显示通知  
    info('*****Adding Controller*****\n')  
    #设定远程控制器的信息,使用TCP模式连接  

    c0 = net.addController(name='c0',controller=RemoteController, ip='192.168.88.128', port=6653, protocol='tcp')  
    #指定第二个控制器      c1 = net.addController(name='c1',controller=RemoteController, ip='192.168.88.139', port=6653, protocol='tcp') 

    #添加交换机  

    info('*****Adding Switches*****\n')  
    s1 = net.addSwitch('s1', cls=OVSSwitch, dpid='1')  
    s2 = net.addSwitch('s2', cls=OVSSwitch, dpid='2')  
    s3 = net.addSwitch('s3', cls=OVSSwitch, dpid='3')  
    s4 = net.addSwitch('s4', cls=OVSSwitch, dpid='4')  
    s5 = net.addSwitch('s5', cls=OVSSwitch, dpid='5')  
    s6 = net.addSwitch('s6', cls=OVSSwitch, dpid='6')  
    s7 = net.addSwitch('s7', cls=OVSSwitch, dpid='7') 

    #添加主机  
    info('*****Adding Hosts*****\n')  h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', mac="00:00:00:00:00:01", defaultRoute=None)     h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', mac="00:00:00:00:00:02", defaultRoute=None)  
h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', mac="00:00:00:00:00:03", defaultRoute=None)  


    #连接拓扑  
    info('*****Adding Links*****\n')  
    net.addLink(s1, s2, 2, 1)  
    net.addLink(s2, s3, 2, 1)  
    net.addLink(s3, s4, 2, 1)  
    net.addLink(s4, s5, 2, 1)  
    net.addLink(s5, s6, 2, 2)  
    net.addLink(s5, s7, 3, 2)  
    net.addLink(h1, s1, 1, 1)  
    net.addLink(h2, s7, 1, 1)  
    net.addLink(h3, s6, 1, 1)  

  
    #构建网络  
    info('*****Starting Network*****\n')  
    net.build()  
    info('*****Starting Controllers*****\n')  
    for controller in net.controllers:  
        controller.start()  

    #开启交换机  
    info('*****Starting Switches*****\n')  
    net.get('s1').start([c0])  
    net.get('s2').start([c0])  
    net.get('s3').start([c0])  
    net.get('s4').start([c1])  
    net.get('s5').start([c1])  
    net.get('s6').start([c1])  
    net.get('s7').start([c1])  
    CLI(net)  
    net.stop()  

if __name__ == '__main__':  
    setLogLevel('info')  
     myNetwork()

9)执行脚本文件使其连接两个控制器,如下图中所示:

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图5 Mininet脚本执行

10)进行pingall操作则可以使得控制器一侧通过对应的协议获取到主机信息,得到底层网络的完整拓扑信息。

 

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图6 pingall操作

11)完成后则可以在控制器的UI界面获取相应的拓扑并进行分析。

4.3 实验拓扑图

各控制器web界面拓扑截图

1)打开controller 1的web界面192.168.88.128:8181/onos/ui/index.html,可得到如下网络拓扑。

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图7 controller 1拓扑图

2)打开controller 2的web界面192.168.88.139:8181/onos/ui/index.html,可得到如下网络拓扑。

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图8 controller 2拓扑图

采用ONOS集群的web界面拓扑截图

1)在实验步骤的第六步之后可以开启集群脚本。在Controller 1中执行onos-form-cluster脚本,实现两个控制器的集群,我们在IP地址为192.168.88.128的机器中执行脚本命令/tmp/onos-1.10.5-SNAPSHOT/bin/onos-form-cluster 192.168.88.128 192.168.88.139,如下图中所示:

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图9 执行onos集群脚本

2)首先打开192.168.88.128:8181/onos/ui/index.html界面,可以查看到此时的控制器拓扑,其中深蓝色为连接192.168.88.128控制器的交换机,淡蓝色为连接192.168.88.139控制器的交换机,如下图中所示:

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图10 集群后控制器拓扑

五 拓扑检测原理

5.1 网络拓扑检测原理

在本网络环境采用的ONOS控制器,其网络拓扑检测分为三部分:链路发现、交换机发现、主机发现。

交换机发现:使用的OPENFLOW协议。具体过程主要分为三个阶段:控制器启动监听6633端口、交换机与控制器建立连接、控制器与交换机版本协商。首先,打开控制器,启动OpenFlowAgent,监听端口,等待交换机建立连接;接着,使用OpenFlow PipelineFactory,新建channel使交换机与控制器建立连接,等待交换机发送hello消息;最后,控制器收到OPENFLOW Hello的消息,便会调用processOFHello方法进行版本协商,如果协商失败,控制器则会主动断开连接,如果协商成功,则连接成功。

以下主要阐述链路发现原理和主机发现原理。

5.1.1 链路发现原理

链路发现主要应用的是LLDP和BDDP协议(仅在有非OF交换机时),首先阐述这两个协议的链路发现原理,再从控制器层面分析对应的网络拓扑检测方法。

LLDP链路发现原理
LLDP用于检测两个OF交换机是否直连,其检测原理如下图中所示:

1)控制器首先向switch1下发packet_out消息,即是一个LLDP包,此时switch1将这个包从指定的的端口转发出去,此时别的交换机switch2收到该LLDP封包时,会通过PACKET_IN消息上报给控制器,这个时候控制器就可以知道switch1和switch2是相连的,完成一次链路发现检测。

2)如果PACKET_OUT的LLDP包并未PACKET_IN给控制器,则会下发BDDP包或者判定端口和主机相连,见后文分析。

3)LLDP包只有一跳存活时间的特性,也即是只存在于两个相邻的交换机中。

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图11 LLDP检测原理图

 

BDDP检测原理(监测网络中非OF交换机)
BDDP用于检测OF交换机互联中是否存在非OF交换机,通过下图进行分析阐述:

1)首先在SDN控制器中会优先通过PACKET_OUT消息下发LLDP包给switch1,此时OF1会根据指定的LLDP包中指定的端口将封包转发出去,此时经过的非OF交换机,则该LLDP包会被丢弃,控制器无法收到这个包的PACKET_IN消息。

2)然后,控制器会给switch1通过PACKET_OUT消息下发一个BDDP包,此时通过switch1对应的端口转发出去后,通过非OF交换机转发后会在switch2通过PACKET_IN消息上传给控制器,此时控制器可以判定在switch1和switch2之间存在着非OF交换机。

3)此外,还存在一种情况为LLDP封包丢失,BDDP包也并没有PACKET_IN上报给控制器,此时则可以判定switch1的2端口连接的是一个主机,并没有连接交换机。

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图12 BDDP检测原理

5.1.2 ARP检测原理(主机发现)
在SDN中有一项很重要的检测原理是ARP请求,用于节点IP地址解析其MAC地址,然后进行局域网内部通信。其解析过程如下:

 

1)H1 ping H2时,即10.0.0.1 ping 10.0.0.2,此时没有H2的MAC,因此需做一次ARP解析,此时ARP请求会被switch1以packet_in消息的形式上报给controller;
2)Controller收到ARP请求后会记录H1的位置,并且向同一网段中所有的交换机请求H2的位置,以泛洪的形式packet_out给所有的交换机;
3)所有的交换机收到请求后会检查是否存在该主机,此时只有switch2会以packet_in的形式给controller一个ARP回复;
4)Controller收到switch2的回复时会记录H2的位置,并将ARP回复以packet_out消息发送给switch1,此时switch1再发送给H1主机。
5)ARP请求完成后再开始传输ICMP请求报文。事实上ARP请求在网络拓扑中也是属于发现主机的一种方式,通过LLDP和BDDP可以发现交换机的拓扑关系,但是主机记录并不完善,需要ARP请求将整个网络拓扑请求完善。

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图13 ARP请求解析原理

 

5.2 全局拓扑检测方案

在上述网络环境中有两个控制器,我们将一个控制器直连和管控的网络称为一个集群(cluster),所以本题中有两个独立的控制平面相邻的集群。在通常情况下,控制器不能发现其他集群网络的设备和链路,所以需要不同集群的控制器进行拓扑信息的交互,来解决全局拓扑的检测问题。

本方案的主要思路是首先使用指纹信息(fingerprint)来标注设备和链路是属于哪一个集群。然后各控制器使用LLDP协议进行拓扑发现,并将连接两个集群之间的链路标记为边缘链路。最后各控制器间交换本集群的拓扑信息,收到后匹配边缘链路将不同集群的拓扑连接成全局拓扑,并使用pinall发现所有主机。具体方案如下:
准备工作:打开ONOS,在Controller 1中执行onos-form-cluster脚本,实现两个控制器的集群,具体步骤见上文。

多控制器集群环境下,基于LLDP和OpenFlow的网络拓扑检测
图14 全局拓扑监测方案流程图

 

1.首先为每一个集群生成一个不重复的集群名称,由集群名称进行稳定散列编码可以得到一个指纹信息(fingerprint),指纹信息可以唯一代表这个集群;

2.进行LLDP探测,以探测与交换机3相连的链路为例,由控制器构造一个探针,其中需要将指纹信息编码到源mac地址(即交换机3的MAC地址)中,探针的其他内容与普通的LLDP一致;

3.控制器通过packet-out消息将探针下发给交换机3,交换机3收到将收到的消息发送到所有端口;

4.与交换机3相连的其他交换机收到来自3的探针,通过packet-in消息发送回控制器(这个控制器可能不是交换机3所属的控制器了,交换机2将收到的探针上报给控制器1,而交换机4上报给控制器2);

5.各控制器接收各交换机发上来的探针,并解析LLDP探针,并从源MAC地址中解析出源交换机所属集群的指纹信息,进行判断:

(1)若指纹信息与本控制器的指纹信息一致,将此链路标记为本集群的链路;

(2)若指纹信息与本控制器的指纹信息不一致,将此链路标记为边缘链路;

6.重复步骤2、3、4、5,直至遍历完所有的交换机,此时每个控制器都储存有本集群的拓扑信息:本集群交换机,源端和目的端都在本集群的链路,边缘链路;

7.控制器之间互相发送自己的拓扑信息,此时各控制器存储了自己和其他集群的拓扑信息;

8.针对边缘链路,控制器通过匹配源MAC地址和目的MAC地址,将不同集群的拓扑进行连接,得到全局的交换机拓扑;

9.进行pingall操作,通过arp协议发现网络中的所有主机,最终得出全局拓扑。

本文转载自:https://www.sdnlab.com/21008.html