我在Mininet 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请求的匹配部分中使用switch-ports,我可以建立连接。我错了什么?请帮帮我。
答案 0 :(得分:2)
您错过了本地网络主机之前发生的事情(我假设它是本地的,因为您在流匹配字段中显示的IP地址)能够交换IP数据包。连接到主机的OpenFlow交换机不会更改主机网络堆栈和执行地址解析的方式。
当你试图使h1 ping h2的IP地址时,h1需要知道h2的以太网地址(即:MAC)。然后,它将在网络ARP请求帧中广播以下问题:"谁具有硬件地址h2?"。
ARP frame中显示的TCP/IP guide不包含IP标头。这意味着您指定的匹配将永远不会匹配ARP数据包,因为它只查找数据包的目标IP。因此,一旦ARP请求被丢弃或发送到控制器(我不知道你的交换机的默认操作是什么),你就无法在主机之间执行ping操作,这意味着h1永远不会从h2获得ARP回复。 / p>
Here是了解ARP如何工作的好资源。另外,我会推荐这个好OpenFlow Tutorial。阅读本教程对于理解SDN和OpenFlow非常重要。此外,您可能会在实践中理解为什么您无法在主机之间ping通。