You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 23:05:06