繁体   English   中英

无法使用 Ryu REST 控制器在 mininet 中的两台主机之间建立连接

[英]Can't establish a conection between two hosts in mininet using a Ryu REST controller

我在 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

我使用 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

如果我在 REST 请求的匹配部分使用交换机端口,我可以建立连接。 我怎么了? 请帮我。

您错过了在本地网络的主机(我假设它是本地网络,因为您在流匹配字段中显示的 IP 地址)能够交换 IP 数据包之前发生的事情。 存在连接到主机的 OpenFlow 交换机这一事实不会改变主机网络堆栈和地址解析的执行方式。

当你试图让 h1 ping h2 的 IP 地址时,h1 需要知道 h2 的以太网地址(即:MAC)。 然后它将在网络中广播 ARP 请求帧,其中包含以下问题:“谁拥有 h2 的硬件地址?”。

ARP 帧,如TCP/IP 指南中所见,不包括 IP 标头。 这意味着您指定的匹配项永远不会匹配 ARP 数据包,因为它只查找数据包的目标 IP。 出于这个原因,您无法在主机之间 ping,一旦 ARP 请求将被丢弃或发送到控制器(我不知道您的交换机的默认操作是什么),这意味着 h1 将永远不会从 h2 获得 ARP 回复。

是了解 ARP 工作原理的好资源。 另外,我会推荐这个好的OpenFlow 教程 阅读本教程对于理解 SDN 和 OpenFlow 很重要。 此外,您可能会在实践中理解为什么无法在主机之间进行 ping 操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM