为什么mininet不能处理循环拓扑?以下代码工作正常。但是,如果我取消注释#net.addLink( s3, s1 )
,那么我会在net.pingAll()
测试中获得100%的CPU使用率和100%的下降。
from mininet.net import Mininet
from mininet.node import OVSController
from mininet.log import setLogLevel, info
def test():
net = Mininet( controller = OVSController)
net.addController( 'c0' )
s1 = net.addSwitch( 's1' )
s2 = net.addSwitch( 's2' )
s3 = net.addSwitch( 's3' )
net.addLink( s1, s2 )
net.addLink( s2, s3 )
#net.addLink( s3, s1 )
h1 = net.addHost( 'h1' )
h2 = net.addHost( 'h2' )
h3 = net.addHost( 'h3' )
net.addLink( s1, h1 )
net.addLink( s2, h2 )
net.addLink( s3, h3 )
net.start()
net.pingAll()
net.stop()
if __name__ == '__main__':
setLogLevel( 'info' )
test()
答案 0 :(得分:2)
如果您使用循环拓扑,则数据包可以在网络中传播而无法到达目的地,最终会使网络泛滥。如果网络设备不知道拓扑中存在循环,则会发生这种情况。
您的数据包发送逻辑应考虑到拓扑中存在一个周期并发送数据包并意识到这一点。例如,控制器可以使用最短路径算法来为交换机设置正确的路由规则,以便数据包到达目的地。
您也可以为此设置自己的路由算法,或在交换机上安装转发规则,以便匹配的数据包将被发送到特定目的地,而不会在网络中传播。
答案 1 :(得分:1)
这很老了,但我遇到了同样的问题,并最终得知您可以通过在开关中使用Spanning Tree Protocol
来处理循环。
上面的代码看起来像
net.addSwitch('s1', stp=True, failMode='standalone')
您可以在构造器部分OVS Switch API Docs
中看到参数答案 2 :(得分:0)
三天来,我在Mininet中实现循环拓扑时遇到了麻烦。网络已建立,但不幸的是,当我调用 pingall 方法时,所有网络数据包均被丢弃。 最终,我意识到手动设置主机IP地址就足够了。 例如:
host1 = net.addHost('h1' , ip = "127.0.0.2")
host2 = net.addHost('h2' , ip = "127.0.0.3")
host3 = net.addHost('h3' , ip = "127.0.0.4")