Mininet自定义拓扑h1.cmd()执行失败及链路参数测试问题
Mininet自定义拓扑问题解答
问题1:KeyError: 'h1' 错误排查
你的代码核心问题是创建Mininet实例时传入了默认Topo()而非自定义的MyTopo(),导致网络未初始化h1、h2等自定义节点,net.get('h1')自然找不到节点抛出KeyError。
另外还有两处细节需要修正:
- 代码中
self.addLink( s4, server2,1,1,cls=TClink,bw=1000 )一行的TClink拼写错误,需改为TCLink - ARP配置需放在网络启动后,确保节点完全初始化
修正后的核心代码
from mininet.topo import Topo from mininet.cli import CLI from mininet.net import Mininet from mininet.link import TCLink class MyTopo( Topo ): def __init__( self ): "Create custom topo" Topo.__init__( self ) # Add hosts and switches h1 = self.addHost( 'h1', ip='10.0.0.1/24' ) h2 = self.addHost( 'h2', ip='10.0.0.2/24' ) h3 = self.addHost( 'h3', ip='10.0.0.3/24' ) h4 = self.addHost( 'h4', ip='10.0.0.4/24' ) server1 = self.addHost( 'server1', ip='10.0.0.5/24' ) server2 = self.addHost( 'server2', ip='10.0.0.6/24' ) s1 = self.addSwitch( 's1') s2 = self.addSwitch( 's2') s3 = self.addSwitch( 's3') s4 = self.addSwitch( 's4') # Add links self.addLink( h1, s1,1,1 ) self.addLink( h2, s1,1,2 ) self.addLink( h3, s2,1,1 ) self.addLink( h4, s2,1,2 ) self.addLink( s1, s2,3,3,cls=TCLink,bw=200,delay='10ms' ) self.addLink( s1, s3,4,4,cls=TCLink,bw=500,delay='10ms' ) self.addLink( s2, s4,4,4,cls=TCLink,bw=500,delay='10ms' ) self.addLink( s3, s4,3,3,cls=TCLink,bw=500,delay='10ms' ) self.addLink( s3, server1,1,1,cls=TCLink,bw=1000 ) self.addLink( s4, server2,1,1,cls=TCLink,bw=1000 ) # 修正拼写错误 self.addLink( s3, server2,2,2,cls=TCLink,bw=1000 ) self.addLink( s4, server1,2,2,cls=TCLink,bw=1000 ) # 使用自定义拓扑创建网络,而非默认Topo() net = Mininet( topo=MyTopo() ) net.start() # 配置ARP条目 h1 = net.get('h1') h1.cmd('arp -s 10.0.0.2 00:00:00:00:00:02') # 可选:配置其他节点的ARP h2 = net.get('h2') h2.cmd('arp -s 10.0.0.1 00:00:00:00:00:01') CLI(net) net.stop() topos = { 'mytopo': ( lambda: MyTopo() ) }
拓扑初始化时自动配置ARP的方法
如果想让ARP在拓扑构建完成后自动配置,可以在MyTopo类中添加postBuild方法:
class MyTopo(Topo): def __init__(self): # 原有的拓扑初始化代码... def postBuild(self, net): # 自动配置ARP h1 = net.get('h1') h1.cmd('arp -s 10.0.0.2 00:00:00:00:00:02') h2 = net.get('h2') h2.cmd('arp -s 10.0.0.1 00:00:00:00:00:01')
问题2:除iperf外的链路参数测试方法
测试延迟
- ping命令:在Mininet CLI中执行
h1 ping -c 10 10.0.0.2,查看输出的平均延迟,验证链路delay配置是否生效 - mtr工具:执行
h1 mtr 10.0.0.6,结合traceroute和ping功能,查看路径每一跳的延迟与丢包率 - tcpping:通过TCP握手测试延迟,更贴近实际TCP业务的延迟表现
测试带宽
- 大文件传输:在server1启动HTTP服务
server1 python3 -m http.server 80,然后在h1执行h1 wget http://10.0.0.5/large_file,通过传输速度验证带宽限制 - tc命令查看配置:在宿主机或Mininet节点执行
tc qdisc show或tc class show,直接查看链路的带宽、延迟等配置是否正确(Mininet的TCLink基于tc实现) - iperf3:iperf的升级版,支持多线程测试、UDP带宽测试等更丰富的功能
路径验证
- traceroute:执行
h1 traceroute 10.0.0.6,查看路径上各跳的延迟,验证跨交换机链路的delay配置
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

