Не удается установить соединение между двумя хостами в минисети с помощью контроллера Ryu REST.

Я создаю пользовательскую топологию в Mininet с помощью Mininets Python-API. Код для создания пользовательской топологии:

#!/usr/bin/python

from mininet.net import Mininet
from mininet.node import Controller, RemoteController
from mininet.cli import CLI
from mininet.link import TCLink
from mininet.log import setLogLevel, info

def myNet():


    #OpenDayLight controller
    #    ODL_CONTROLLER_IP='10.0.0.4'

    #Floodlight controller
    #    FL_CONTROLLER_IP='10.0.0.5'

    net = Mininet( topo=None, build=False, link=TCLink)

    # Create nodes
    h1 = net.addHost( 'h1' )
    h2 = net.addHost( 'h2' )

    # Create switches
    s1 = net.addSwitch( 's1' )

    print "*** Creating links"
    net.addLink(h1, s1, port1=1, port2=1, bw=100 )
    net.addLink(s1, h2, port1=2, port2=1, bw=100 )


    # Add Controllers
    ryu_ctrl_rest = net.addController( 'c0', controller=RemoteController, ip='127.0.0.1', port=6633)

    #    fl_ctrl = net.addController( 'c1', controller=RemoteController, ip=FL_CONTROLLER_IP, port=6633)


    net.build()

    # Connect each switch to the controller
    s1.start( [ryu_ctrl_rest] )

    s1.cmdPrint('ovs-vsctl show')

    CLI( net )
    #    net.stop()

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

Я запускаю топологию с помощью следующей команды:

sudo python topo_small.py

Я использую контроллер Ryu «ofctl_rest.py», который обрабатывает REST-запросы. Запросы REST, отправляемые контроллеру, содержат информацию, которую контроллер использует для установки записей потока в коммутаторах. Запускаю контроллер следующей командой:

cd /usr/local/lib/python2.7/dist-packages/ryu/app
PYTHONPATH=. ryu-manager --verbose ofctl_rest.py

Я использую следующие команды для установки Flowentries в коммутаторы:

curl -X POST -d '{
    "dpid": 1,
    "cookie": 1,
    "cookie_mask": 1,
    "table_id": 0,
    "idle_timeout": 300,
    "hard_timeout": 300,
    "priority": 11111,
    "flags": 1,
    "match":{
        "nw_dst": "10.0.0.2",
        "dl_type": "2048"
    },
    "actions":[
        {
            "type":"OUTPUT",
            "port": 2
        }
    ]
}' http://localhost:8080/stats/flowentry/add

curl -X POST -d '{
    "dpid": 1,
    "cookie": 1,
    "cookie_mask": 1,
    "table_id": 0,
    "idle_timeout": 300,
    "hard_timeout": 300,
    "priority": 11111,
    "flags": 1,
    "match":{
        "nw_dst": "10.0.0.1",
        "dl_type": "2048"
    },
    "actions":[
        {
            "type":"OUTPUT",
            "port": 1
        }
    ]
}' http://localhost:8080/stats/flowentry/add

В коммутаторе установлены правила:

mininet@mininet-vm:~$ sudo ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
cookie=0x1, duration=16.327s, table=0, n_packets=0, n_bytes=0, idle_timeout=300, hard_timeout=300, idle_age=16, priority=11111,ip,nw_dst=10.0.0.2 actions=output:2
cookie=0x1, duration=16.317s, table=0, n_packets=0, n_bytes=0, idle_timeout=300, hard_timeout=300, idle_age=16, priority=11111,ip,nw_dst=10.0.0.1 actions=output:1

Но не могу установить связь. Если я выполню следующую команду в mininet-CLI:

mininet> h1 ping h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
From 10.0.0.1 icmp_seq=1 Destination Host Unreachable
From 10.0.0.1 icmp_seq=2 Destination Host Unreachable
From 10.0.0.1 icmp_seq=3 Destination Host Unreachable
^C
--- 10.0.0.2 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 3015ms
pipe 3

Если я использую switch-порты в соответствующей части REST-запросов, я могу установить соединение. Что я не так? Помогите пожалуйста мне.


person André    schedule 10.09.2015    source источник


Ответы (1)


Вы упускаете из виду то, что происходит до того, как хосты локальной сети (я предполагаю, что это локальная сеть из-за IP-адреса, который вы показываете в полях соответствия потока) смогут обмениваться IP-пакетами. Тот факт, что к хостам подключен коммутатор OpenFlow, не меняет сетевой стек хостов и способ выполнения разрешения адресов.

Когда вы пытаетесь сделать так, чтобы h1 пинговал IP-адрес h2, h1 должен знать Ethernet-адрес (то есть MAC) h2. Затем он будет транслировать в сеть кадры ARP-запросов со следующим вопросом: «У кого есть аппаратный адрес h2?».

фрейм ARP, как показано на Руководство по TCP/IP, не включает заголовок IP. Это означает, что указанное вами совпадение никогда не будет соответствовать пакету ARP, поскольку он ищет только IP-адрес назначения пакета. По этой причине вы не можете пинговать между хостами, как только запрос ARP будет отброшен или отправлен на контроллер (я не знаю, каково действие вашего коммутатора по умолчанию), что означает, что h1 никогда не получит ответ ARP от h2.

здесь хороший ресурс для понимания как работает ARP. Кроме того, я бы порекомендовал этот хороший учебник по OpenFlow. Прохождение этого руководства важно для понимания SDN и OpenFlow. Более того, вполне вероятно, что вы на практике поймете, почему у вас не получилось пропинговать хосты.

person ederlf    schedule 18.01.2016