3

Mininets Python-API を使用して、Mininet でカスタム トポロジを作成します。カスタム トポロジを作成するコードは次のとおりです。

#!/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

REST リクエストを処理する Ryu コントローラー「ofctl_rest.py」を使用します。コントローラに送信される REST 要求には、スイッチにフロー エントリをインストールするためにコントローラが使用する情報が含まれています。次のコマンドでコントローラーを起動します。

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

次のコマンドを使用して、スイッチにフローエントリをインストールします。

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

REST 要求の一致する部分でスイッチ ポートを使用すると、接続を確立できます。私は何を間違っていますか?私を助けてください。

4

1 に答える 1

2

ローカル ネットワークのホスト (フロー マッチ フィールドに表示されている IP アドレスのため、ローカルと仮定しています) が IP パケットを交換できるようになる前に何が起こるかを見逃しています。ホストに OpenFlow スイッチが接続されているという事実は、ホストのネットワーク スタックとアドレス解決の実行方法を変更しません。

h1 に h2 の IP アドレスを ping させようとすると、h1 は h2 のイーサネット アドレス (つまり、MAC) を知る必要があります。次に、「h2 のハードウェア アドレスを持っているのは誰ですか?」という質問を含む ARP 要求フレームをネットワークでブロードキャストします。

TCP/IP ガイドに示されているように、ARP フレームにはIPヘッダーが含まれていません。これは、パケットの宛先 IP のみを検索するため、指定した一致が ARP パケットと一致しないことを意味します。このため、ホスト間で ping を実行することはできません。一度 ARP 要求が破棄されるかコントローラーに送信されると (スイッチのデフォルトの動作がわかりません)、h1 が h2 から ARP 応答を受信することはありません。

ARP の仕組みを理解するには、次のリソースが役立ちますまた、この優れたOpenFlow チュートリアルをお勧めします。このチュートリアルを実行することは、SDN と OpenFlow を理解するために重要です。さらに、ホスト間で ping を実行できなかった理由を実際に理解できる可能性があります。

于 2016-01-18T16:06:07.697 に答える