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")
为什么 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")