Mininet 圆形拓扑

Mininet circular topology

为什么 mininet 不能处理圆形拓扑?以下代码工作正常。但是,如果我取消注释 #net.addLink( s3, s1 ) 然后我得到 100% CPU 使用率和 100% 下降 net.pingAll() 测试。

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()

如果您有环形拓扑,则数据包可以在网络中循环而不到达目的地,最终淹没网络。如果网络设备不知道拓扑中存在循环,则会发生这种情况。

您的数据包发送逻辑应考虑到拓扑中存在环路,并在意识到这一点的情况下发送数据包。例如,控制器可以使用最短路径算法为交换机设置正确的路由规则,使数据包到达目的地。

您也可以为此设置自己的路由算法,或在交换机上安装转发规则,以便将匹配的数据包发送到特定目的地,而不是在网络中循环。

这是旧的,但我遇到了同样的问题,并最终了解到您可以通过在开关中使用 Spanning Tree Protocol 来处理循环。

从上面的代码看起来像

net.addSwitch('s1', stp=True, failMode='standalone')

构造函数部分可以看到参数OVS Switch API Docs

三天来,我在 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")