quarta-feira, 4 de junho de 2014

Controlador SDN - Parte 1

Como parte de um trabalho para um disciplina do meu doutorado, estou desenvolvendo um controlador SDN, baseado justamente no POX (veja outros posts associados).

A idéia é que o controlador seja capaz de fazer o balanceamento de uma conexão TCP sobre diversos caminhos distintos.

Isso poderia ser feito ao natural, por exemplo, em uma rede onde os roteadores, em razão da configuração do seus protocolos e esquemas de roteamento, decidissem encaminhar pacotes por caminhos distintos. Porém, mesmo nesse caso, não haveria um controle explícito do encaminhamento de pacotes por caminhos diferentes para uma dada conexão TCP. Esse balanceamento seria feito apenas baseado na chegada dos pacotes, independente do conteúdos dos mesmos.

Bom, como essa idéia de trabalho visa mostrar as potencialidades de uso das SDNs, vale a pena ir descrevendo o desenvolvimento do mesmo aqui.

Inicialmente (e apenas inicialmente), iremos considerar uma topologia de referência para começar o desenvolvimento.

A topologia em questão pode ser vista abaixo.



Fácil notar que é uma rede bastante simples, porém que oferece diversas possibilidades de caminhos alternativos entre quaisquer dois hosts. Para facilitar a nomenclatura, os hosts (são dois por cada comutador) são nomeados na forma H1SX e H2SX, onde SX indica o switch SDN ao qual o host está conectado.

A partir dessa topologia, foi criado um script para iniciar o mininet, conforme indicado abaixo:
#!/usr/bin/python
#coding: utf-8 

"""
Cria a topologia inicial para testes com o controlador SDN. A topologia segue a
descrição e modelo proposto e documentado como topologia inicial, consistindo
em 8 switches interconectados de modo específico, conforme o diagrama
rede_topologia_inicial.jpg. Cada switch possui dois hosts, seguindo a
nomenclatura indicada no mesmo diagrama. 
Autor: Ricardo Balbinot
Data: junho/2014
"""

from mininet.topo import Topo

class Topologia_Inicial(Topo):
    """ Cria a tpologia indicada"""

    def __init__( self ):
        """ Inicializa a topologia"""

        # Inicializa a topologia
        Topo.__init__(self)

        # Adiciona os switches
        sw1 = self.addSwitch('sw1')
        sw2 = self.addSwitch('sw2')
        sw3 = self.addSwitch('sw3')
        sw4 = self.addSwitch('sw4')
        sw5 = self.addSwitch('sw5')
        sw6 = self.addSwitch('sw6')
        sw7 = self.addSwitch('sw7')
        sw8 = self.addSwitch('sw8')

        # Adiciona os hosts
        h1s1 = self.addHost('h1s1')
        h2s1 = self.addHost('h2s1')
        h1s2 = self.addHost('h1s2')
        h2s2 = self.addHost('h2s2')
        h1s3 = self.addHost('h1s3')
        h2s3 = self.addHost('h2s3')
        h1s4 = self.addHost('h1s4')
        h2s4 = self.addHost('h2s4')
        h1s5 = self.addHost('h1s5')
        h2s5 = self.addHost('h2s5')
        h1s6 = self.addHost('h1s6')
        h2s6 = self.addHost('h2s6')
        h1s7 = self.addHost('h1s7')
        h2s7 = self.addHost('h2s7')
        h1s8 = self.addHost('h1s8')
        h2s8 = self.addHost('h2s8')

        # Cria os enlaces dos hosts aos switches
        self.addLink(sw1,h1s1)
        self.addLink(sw1,h2s1)
        self.addLink(sw2,h1s2)
        self.addLink(sw2,h2s2)
        self.addLink(sw3,h1s3)
        self.addLink(sw3,h2s3)
        self.addLink(sw4,h1s4)
        self.addLink(sw4,h2s4)
        self.addLink(sw5,h1s5)
        self.addLink(sw5,h2s5)
        self.addLink(sw6,h1s6)
        self.addLink(sw6,h2s6)
        self.addLink(sw7,h1s7)
        self.addLink(sw7,h2s7)
        self.addLink(sw8,h1s8)
        self.addLink(sw8,h2s8)

        # Cria os enlaces entre os switches
        self.addLink(sw1, sw2)
        self.addLink(sw1, sw4)
        self.addLink(sw2, sw3)
        self.addLink(sw3, sw4)
        self.addLink(sw3, sw5)
        self.addLink(sw4, sw5)
        self.addLink(sw4, sw6)
        self.addLink(sw5, sw8)
        self.addLink(sw6, sw7)
        self.addLink(sw6, sw8)
        self.addLink(sw7, sw8)

topos = { 'topologia_inicial': ( lambda: Topologia_Inicial() ) }

Essa topologia inicial para o mininet foi criada a partir do próprio modelo oferecido na documentação do mininet (que pode ser visto aqui).

Nenhum comentário:

Postar um comentário