☰
基于Linux网络命名空间与Mininet的单机虚拟网络实验方案
2026/10/19 12:48:22 网站建设 项目流程

1. 项目缘起与整体设计思路

1.1 为什么要在单机上折腾虚拟网络

搞网络的人都有一个共同的痛点:想做个稍微复杂点的实验,比如模拟多机房互联、测试路由收敛、验证某个拥塞控制算法,手头没有一堆交换机和路由器根本玩不转。买硬件吧,成本高、占地方、噪音大;用云主机吧,网络拓扑不可控,底层网络被服务商锁死,想改个MTU都费劲。

我最早接触网络实验是在一台旧笔记本上装了一堆虚拟机,用虚拟网卡桥接来桥接去,结果宿主机网络配置被搞得一团糟,重启之后连不上网的情况发生过不止一次。后来接触到Linux网络命名空间这个概念,才发现原来操作系统本身就提供了网络隔离的能力,根本不需要开一堆笨重的虚拟机。再后来用上Mininet,才真正体会到什么叫“轻量级虚拟网络实验”——一台普通笔记本,几秒钟就能拉起一个包含十几台主机和交换机的网络拓扑,跑完实验一键清理,宿主机网络毫发无损。

这套方案的核心价值就三个字:轻、快、真。轻是指资源占用小,每个虚拟主机本质上就是一个进程加一个网络命名空间,内存开销以MB计;快是指拓扑搭建和销毁都是秒级完成,改个参数重新跑一遍完全不心疼;真是指实验环境用的是Linux内核真实的网络协议栈,不是模拟器里那种简化实现,实验结果有参考价值。

适合谁来参考呢?我觉得三类人最需要:一是网络方向的学生和研究人员,做协议验证、算法对比、教学演示都用得上;二是运维和开发人员,想复现某个网络故障、验证负载均衡策略、测试服务网格的流量走向,这套东西比在真实环境里试错安全得多;三是对Linux网络机制感兴趣的技术爱好者,通过动手搭建能真正理解命名空间、虚拟网卡、网桥这些概念到底是怎么回事。

1.2 技术选型的背后逻辑

整个方案建立在两个核心组件上:Linux网络命名空间和Mininet。这两个东西的关系需要先理清楚,不然后面操作容易迷糊。

Linux网络命名空间是内核提供的一种隔离机制。简单说,它让一个进程只能看到属于自己的那套网络资源——独立的网卡、独立的路由表、独立的iptables规则、独立的端口空间。你可以把它想象成给每个进程发了一个独立的“网络身份证”,不同命名空间里的进程互相看不到对方的网络配置,就像运行在两台不同的机器上一样。这个机制是容器技术网络隔离的基础,Docker每起一个容器就创建一个新的网络命名空间。

Mininet则是一个编排工具,它把创建命名空间、拉虚拟网卡、配IP地址、设路由规则这些繁琐操作封装成了Python API和命令行工具。没有Mininet的话,你得手动执行一堆ip netns add、ip link add veth、ip link set netns这些命令,拓扑一复杂就容易出错。Mininet的价值在于让你用几行代码描述拓扑,剩下的脏活累活它全包了。

那为什么不直接用Docker或者虚拟机呢?Docker的网络模型偏向于容器编排场景,做自定义拓扑实验不够灵活,而且Docker daemon本身占资源;虚拟机太重,启动慢、内存开销大,跑十个节点普通笔记本就扛不住了。Mininet配合网络命名空间,十个节点的拓扑内存占用通常不超过200MB,启动时间在两秒以内,这个效率是虚拟机和容器方案比不了的。

还有一个关键选择是使用Open vSwitch还是Linux网桥。Mininet默认用Open vSwitch,功能强大,支持OpenFlow协议,适合做SDN实验。但如果只是做基础的路由交换实验,Linux原生网桥更轻量,不需要额外安装OVS,内核直接支持。我的建议是:如果你的实验涉及OpenFlow流表编程,那就用OVS;如果只是验证路由协议、测试网络性能,Linux网桥足够了,还能省掉OVS的安装和配置麻烦。

2. 核心细节解析与实操要点

2.1 网络命名空间的关键操作

网络命名空间虽然概念简单,但实际操作中有几个细节不注意就会踩坑。先看最基本的创建和查看命令:

# 创建两个网络命名空间 ip netns add ns1 ip netns add ns2 # 查看已创建的命名空间 ip netns list

创建完之后,你可能会想看看命名空间里的网络配置。直接执行ip addr是看不到的,因为默认显示的是当前命名空间的网卡。要查看指定命名空间的网络配置,需要这样操作:

ip netns exec ns1 ip addr

这个命令的意思是“在ns1这个命名空间里执行ip addr”。刚创建好的命名空间里只有一个lo回环接口,而且是down状态,需要手动启用:

ip netns exec ns1 ip link set lo up

接下来是最关键的一步:连接两个命名空间。Linux提供了veth pair(虚拟网卡对)这个工具,它像一根网线,一头插在ns1里,另一头插在ns2里。创建和分配的完整命令如下:

# 创建一对虚拟网卡 ip link add veth1 type veth peer name veth2 # 把veth1这头放到ns1里 ip link set veth1 netns ns1 # 把veth2这头放到ns2里 ip link set veth2 netns ns2 # 分别启用两端的网卡 ip netns exec ns1 ip link set veth1 up ip netns exec ns2 ip link set veth2 up # 配置IP地址 ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth1 ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth2

配完之后测试连通性:

ip netns exec ns1 ping -c 3 10.0.0.2

注意:veth pair有个特性,当你把一端放到命名空间里之后,它在宿主机默认命名空间里就消失了。如果你执行ip link set veth1 netns ns1之后发现宿主机上找不到veth1了,别慌,这是正常现象,它已经在ns1里面了。

这里有个容易忽略的细节:veth pair的两端是成对存在的,删掉任何一端,另一端也会自动消失。这个特性在清理实验环境时很有用,但如果不小心误删了正在使用的veth,网络就会断掉。所以在生产环境操作命名空间时,建议先记录好当前的网络配置,避免误操作导致失联。

2.2 Mininet拓扑定义的几种写法

Mininet提供了多种定义拓扑的方式,从简单到复杂各有适用场景。最基础的是用命令行参数直接指定:

sudo mn --topo=linear,3

这一行命令就创建了一个线性拓扑:三台主机、三台交换机,依次串联。Mininet会自动分配IP地址(10.0.0.1到10.0.0.3)、MAC地址,并启动一个控制器。执行完之后你会进入Mininet的交互式命令行,可以执行pingall测试全网连通性,执行iperf测试带宽,执行dump查看节点信息。

但命令行参数能表达的拓扑很有限,稍微复杂一点就需要用Python脚本定义。Mininet的Python API设计得很直观,核心就是创建一个Topo类的子类,然后在build方法里添加主机、交换机和链路:

from mininet.topo import Topo from mininet.net import Mininet from mininet.node import OVSController class MyTopo(Topo): def build(self): # 添加两台主机 h1 = self.addHost('h1') h2 = self.addHost('h2') # 添加一台交换机 s1 = self.addSwitch('s1') # 添加链路 self.addLink(h1, s1) self.addLink(h2, s1) if __name__ == '__main__': topo = MyTopo() net = Mininet(topo=topo, controller=OVSController) net.start() net.pingAll() net.stop()

这段代码创建了一个最简单的星型拓扑。addHost可以指定IP地址、MAC地址、CPU限制等参数;addLink可以指定带宽、延迟、丢包率等链路属性。比如要模拟一个跨地域的广域网链路,可以这样写:

self.addLink(h1, s1, bw=10, delay='50ms', loss=2)

这表示链路带宽10Mbps、单向延迟50毫秒、丢包率2%。这些参数在Mininet内部是通过tc(流量控制)工具实现的,效果相当真实。

实操心得:在定义拓扑时,主机和交换机的命名最好有规律,比如h1、h2、h3表示主机,s1、s2、s3表示交换机,这样在后续调试时不容易搞混。另外,Mininet默认给主机分配的IP是10.0.0.x/8,这个网段很大,做子网划分实验时要注意手动指定更精确的网段。

2.3 控制器选择与连接方式

Mininet本身只是一个拓扑编排工具,真正决定网络行为的是控制器。控制器负责计算路由、下发流表、响应网络事件。Mininet支持多种控制器,选择哪种取决于你的实验目标。

如果只是做基础的二层交换实验,用Mininet自带的OVSController就够了,它本质上是一个简单的学习型交换机控制器,不需要额外安装任何东西。启动方式:

sudo mn --controller=ovsc

如果要测试自定义的SDN应用,就需要连接外部控制器。以Ryu为例,先在一个终端启动Ryu:

ryu-manager simple_switch.py

然后在另一个终端启动Mininet并指定远程控制器:

sudo mn --controller=remote,ip=127.0.0.1,port=6653

这样Mininet创建的交换机就会连接到Ryu控制器,由Ryu来决定转发行为。你可以修改simple_switch.py的逻辑,实现自定义的转发策略,比如根据源IP做负载均衡、根据端口做访问控制等。

还有一种情况是完全不用控制器,让交换机工作在“独立模式”下,像普通的二层交换机一样自己学习MAC地址表。这种方式适合做纯性能测试,因为不涉及控制器通信开销:

sudo mn --controller=none

但要注意,没有控制器的情况下,跨子网的路由是不通的,因为主机之间没有路由协议交互。如果需要路由功能,要么手动配置静态路由,要么在Mininet里启用路由进程。

3. 完整实操流程与核心环节实现

3.1 环境准备与依赖安装

在开始搭建之前,需要确认系统环境。这套方案对系统要求不高,主流Linux发行版都可以,内核版本建议3.10以上(网络命名空间的支持比较完善)。我用的是Ubuntu 20.04,内核5.4,实测很稳。

首先安装Mininet。Ubuntu的官方源里就有,直接apt安装最省事:

sudo apt update sudo apt install mininet

安装完成后验证一下:

sudo mn --version

如果显示版本号就说明安装成功了。但apt源里的Mininet版本可能比较旧,如果你需要最新特性,可以从源码安装:

git clone https://github.com/mininet/mininet.git cd mininet sudo util/install.sh -a

这个安装脚本会把Mininet本体、Open vSwitch、OpenFlow工具、Wireshark等一并装好,省去逐个安装的麻烦。不过安装时间比较长,取决于网络速度。

注意:Mininet需要root权限才能创建网络命名空间和操作虚拟网卡,所以所有Mininet相关命令都要加sudo。如果不想每次都输密码,可以配置sudo免密,但生产环境不建议这么做。

安装完成后,建议先跑一下自带的测试用例,确认环境没问题:

sudo mn --test pingall

这个命令会创建一个最简单的拓扑(一台交换机、两台主机),执行全网ping测试,然后自动清理。如果输出显示0%丢包,说明环境正常。

3.2 搭建一个多子网路由实验拓扑

下面用一个具体的实验场景来演示完整流程。目标是搭建一个包含三个子网的网络,中间用一台路由器连接,验证子网间的路由可达性。拓扑结构是这样的:

  • 子网A:10.0.1.0/24,包含h1、h2
  • 子网B:10.0.2.0/24,包含h3、h4
  • 子网C:10.0.3.0/24,包含h5、h6
  • 路由器r1连接三个子网

用Mininet Python脚本实现:

from mininet.topo import Topo from mininet.net import Mininet from mininet.node import Node from mininet.cli import CLI from mininet.log import setLogLevel class Router(Node): def config(self, **params): super(Router, self).config(**params) # 启用IP转发 self.cmd('sysctl -w net.ipv4.ip_forward=1') def terminate(self): self.cmd('sysctl -w net.ipv4.ip_forward=0') super(Router, self).terminate() class MultiSubnetTopo(Topo): def build(self): # 创建路由器 r1 = self.addNode('r1', cls=Router) # 创建三台交换机 s1 = self.addSwitch('s1') s2 = self.addSwitch('s2') s3 = self.addSwitch('s3') # 创建六台主机 h1 = self.addHost('h1', ip='10.0.1.1/24', defaultRoute='via 10.0.1.254') h2 = self.addHost('h2', ip='10.0.1.2/24', defaultRoute='via 10.0.1.254') h3 = self.addHost('h3', ip='10.0.2.1/24', defaultRoute='via 10.0.2.254') h4 = self.addHost('h4', ip='10.0.2.2/24', defaultRoute='via 10.0.2.254') h5 = self.addHost('h5', ip='10.0.3.1/24', defaultRoute='via 10.0.3.254') h6 = self.addHost('h6', ip='10.0.3.2/24', defaultRoute='via 10.0.3.254') # 连接主机到交换机 self.addLink(h1, s1) self.addLink(h2, s1) self.addLink(h3, s2) self.addLink(h4, s2) self.addLink(h5, s3) self.addLink(h6, s3) # 连接交换机和路由器 self.addLink(s1, r1, intfName2='r1-eth1', params2={'ip': '10.0.1.254/24'}) self.addLink(s2, r1, intfName2='r1-eth2', params2={'ip': '10.0.2.254/24'}) self.addLink(s3, r1, intfName2='r1-eth3', params2={'ip': '10.0.3.254/24'}) if __name__ == '__main__': setLogLevel('info') topo = MultiSubnetTopo() net = Mininet(topo=topo, controller=None) net.start() CLI(net) net.stop()

这个脚本有几个关键点需要解释。Router类继承自Node,在config方法里启用了IP转发,这是路由器能转发跨子网流量的前提。addLink时通过intfName2和params2给路由器侧的接口指定了名称和IP地址,这样路由器就成为了三个子网的网关。主机配置了defaultRoute指向各自子网的网关地址。

保存为multi_subnet.py后运行:

sudo python3 multi_subnet.py

进入Mininet CLI后,先测试同子网连通性:

h1 ping -c 2 h2

再测试跨子网连通性:

h1 ping -c 2 h3 h1 ping -c 2 h5

如果都能通,说明路由配置正确。你还可以在路由器上查看路由表:

r1 route -n

应该能看到三条直连路由,分别对应三个子网。

3.3 链路参数调优与性能测试

Mininet最强大的功能之一是能精确控制链路参数。通过tc工具,可以模拟各种网络条件,这对测试应用在不同网络环境下的表现非常有价值。

在拓扑定义时指定链路参数:

self.addLink(h1, s1, bw=100, delay='10ms', loss=0, max_queue_size=1000)

bw是带宽,单位Mbps;delay是延迟,支持us、ms、s等单位;loss是丢包率,百分比;max_queue_size是队列长度,影响缓冲行为。这些参数在链路两端都会生效,实际效果是双向的。

如果想在运行过程中动态修改链路参数,可以在Mininet CLI里操作:

# 把h1到s1的链路带宽改为10Mbps link h1 s1 bw 10 # 把延迟改为100ms link h1 s1 delay 100ms # 查看当前链路状态 link h1 s1

性能测试通常用iperf。Mininet内置了iperf命令的封装:

# h1作为服务端,h2作为客户端,测试TCP带宽 h1 iperf -s & h2 iperf -c 10.0.1.1 -t 10

如果要测试UDP性能,加上-u参数:

h2 iperf -c 10.0.1.1 -u -b 100M -t 10

-b参数指定发送速率,测试在指定速率下的丢包和延迟情况。

实操心得:做性能测试时,建议先跑一次不做任何限制的基线测试,记录带宽和延迟数据,然后再逐步调整链路参数,观察性能变化。这样能排除主机本身性能瓶颈的干扰。另外,Mininet里的主机共享宿主机的CPU资源,如果宿主机负载高,测试结果会有波动,建议在空闲时段做性能测试。

4. 常见问题与排查技巧实录

4.1 连通性故障排查思路

网络实验最常遇到的问题就是ping不通。遇到这种情况,不要慌,按照从底层到高层的顺序逐层排查。

第一步,确认接口状态。在Mininet CLI里执行:

h1 ip link show

检查网卡是否处于UP状态。如果显示DOWN,手动启用:

h1 ip link set h1-eth0 up

第二步,检查IP地址配置:

h1 ip addr show

确认IP地址和子网掩码是否正确。常见错误是子网掩码写错,比如把/24写成/16,导致路由判断异常。

第三步,检查路由表:

h1 route -n

确认默认路由或特定路由是否存在。如果目标地址不在直连子网内,又没有默认路由,包就发不出去。

第四步,检查ARP表:

h1 arp -n

如果ARP表里没有目标IP的MAC地址,说明ARP请求没有得到响应。可能是目标主机没启用、IP配错、或者中间链路有问题。

第五步,用tcpdump抓包分析:

h1 tcpdump -i h1-eth0 -n

同时在另一台主机上发起ping,观察包是否发出、是否有回应。如果只看到请求没有回应,问题可能在目标端或中间路径;如果连请求都看不到,问题在源端。

下面这张表整理了常见故障现象和对应的排查方向:

故障现象可能原因排查命令
ping不通同子网主机接口DOWN、IP配错、ARP失败ip link、ip addr、arp
ping不通跨子网主机路由缺失、IP转发未启用route -n、sysctl net.ipv4.ip_forward
ping通但延迟异常高链路参数限制、队列溢出link show、tc -s qdisc show
丢包严重链路丢包率设置、缓冲区不足link show、iperf -u
DNS解析失败/etc/resolv.conf未配置cat /etc/resolv.conf

4.2 Mininet启动与清理的坑

Mininet启动失败最常见的原因是残留的命名空间或OVS配置没有清理干净。如果你上次实验异常退出(比如直接Ctrl+C或者kill -9),Mininet可能来不及清理它创建的资源。下次启动时就会报“namespace already exists”或者“OVS bridge already exists”之类的错误。

清理命令:

sudo mn -c

这个命令会删除所有Mininet创建的命名空间、虚拟网卡、OVS网桥和控制器进程。建议每次实验前都执行一次,养成习惯。

另一个常见问题是端口冲突。Mininet默认使用6653端口连接控制器,如果这个端口被其他程序占用了,控制器就连不上。查看端口占用:

sudo lsof -i :6653

如果有残留的控制器进程,手动kill掉。

还有一种情况是宿主机网络被影响。虽然Mininet设计上不会修改宿主机的网络配置,但如果你在脚本里手动操作了宿主机的网卡,或者创建了同名网桥,就可能出问题。比如你创建了一个叫“br0”的网桥,而宿主机上已经有一个叫“br0”的网桥,就会冲突。解决办法是给Mininet创建的网桥加前缀,比如“mn-br0”。

注意:在Mininet运行时,不要手动删除它创建的命名空间或网卡,这会导致Mininet状态不一致,后续操作可能报错。如果需要修改配置,尽量通过Mininet的API或CLI命令操作。

4.3 性能调优与资源限制

当拓扑规模变大时,比如超过20个节点,可能会遇到性能瓶颈。主要瓶颈通常在CPU和内存上。每个命名空间和veth pair都会消耗一定的内核资源,节点越多,开销越大。

优化建议:

  • 减少不必要的veth pair。如果两台主机之间不需要直接通信,就不要创建直连链路,通过交换机中转即可。
  • 使用Linux网桥代替OVS。OVS的功能更强但开销也更大,纯二层转发场景用Linux网桥更划算。
  • 限制主机资源。Mininet支持给主机设置CPU限制:
h1 = self.addHost('h1', cpu=0.5)

这表示h1最多使用50%的CPU。在测试CPU密集型应用时很有用,可以模拟不同性能的设备。

  • 调整内核参数。对于大规模拓扑,可能需要增大ARP缓存、路由缓存等:
sysctl -w net.ipv4.neigh.default.gc_thresh1=1024 sysctl -w net.ipv4.route.max_size=131072
  • 使用轻量级控制器。如果不需要复杂的SDN逻辑,用ovsc或者甚至不用控制器,能省下不少CPU。

内存方面,每个命名空间大约占用几MB,veth pair的开销更小。20个节点的拓扑通常不超过500MB内存,普通开发机完全够用。但如果每个节点里跑内存密集型应用,就要注意总内存不要超过宿主机可用内存。

4.4 实验复现与结果验证

做网络实验最怕的就是结果不可复现。同样的拓扑、同样的参数,两次跑出来结果不一样,那就没法写论文也没法做对比。Mininet本身是确定性的,但有几个因素会影响复现性。

第一是时间因素。涉及超时、重传的实验,对时间敏感。Mininet里的虚拟时钟和真实时钟可能有偏差,建议在脚本里加入足够的等待时间,不要依赖精确的时序。

第二是随机因素。TCP的初始序列号、ARP请求的发送时机、控制器的流表下发顺序,这些都有随机性。如果实验对这些敏感,需要固定随机种子或者多次运行取平均值。

第三是宿主机负载。前面提到过,Mininet共享宿主机CPU,宿主机负载变化会影响实验结果。建议在实验脚本里加入CPU负载检测,负载过高时暂停或重跑。

验证实验结果时,除了看ping和iperf的输出,还应该抓包分析。Wireshark可以抓取Mininet里任意接口的流量:

# 在宿主机上抓取h1-eth0的流量 sudo tcpdump -i h1-eth0 -w h1.pcap

或者直接在Mininet CLI里启动Wireshark:

h1 wireshark &

但Mininet环境里没有图形界面,通常是把包抓下来传到宿主机分析。抓包文件可以用Wireshark打开,逐包分析协议交互过程,这对理解网络行为非常有帮助。

5. 进阶玩法与扩展方向

5.1 接入自定义协议栈

Mininet默认使用Linux内核的网络协议栈,但如果你在研究新的传输层协议或者路由协议,可能需要替换掉内核的实现。有两种方式可以实现。

一种是用用户态协议栈。比如用DPDK或者netmap接管网卡,在用户态实现完整的协议处理。这种方式性能高,但和Mininet的集成比较复杂,需要修改Mininet的节点创建逻辑。

另一种是用Linux的TUN/TAP设备。在命名空间里创建一个TUN设备,把流量导入用户态程序处理,处理完再写回TUN设备。这种方式对Mininet的改动小,适合快速验证协议逻辑。具体做法是在主机启动后,在命名空间里执行:

ip netns exec h1 ip tuntap add dev tun0 mode tun ip netns exec h1 ip link set tun0 up ip netns exec h1 ip addr add 10.0.0.1/24 dev tun0

然后你的用户态程序打开/dev/net/tun,读写这个设备就能收发包了。

5.2 与容器编排系统联动

Mininet创建的网络命名空间和容器使用的命名空间本质上是同一种东西。这意味着你可以把Mininet创建的命名空间“交给”容器运行时使用,让容器直接跑在Mininet拓扑里。

具体做法是先用Mininet创建拓扑但不启动主机进程,然后通过docker run的--net参数指定使用已有的命名空间:

# 假设Mininet创建了名为h1的命名空间 sudo docker run --net=container:h1 -it ubuntu bash

这样容器里的网络配置就和Mininet里的h1完全一致,容器产生的流量会走Mininet定义的链路。这个玩法在做微服务网络测试时特别有用,可以精确控制服务之间的网络条件。

5.3 大规模拓扑的自动化生成

手工写几十个节点的拓扑定义不现实,需要自动化生成。Mininet支持从参数生成拓扑,比如:

sudo mn --topo=tree,depth=3,fanout=2

这会生成一个三层的树形拓扑,每个节点有两个子节点,总共14个交换机加8台主机。类似的还有linear、reversed、single等预定义拓扑。

如果需要更复杂的拓扑,比如数据中心常见的Fat-Tree或者Leaf-Spine结构,可以写一个生成函数:

def fat_tree_topo(k): topo = Topo() # 核心层交换机 cores = [] for i in range((k//2)**2): cores.append(topo.addSwitch(f'c{i}')) # 汇聚层和接入层 # ... 省略具体实现 return topo

这种生成方式适合做大规模网络的性能评估和收敛性测试。

5.4 实验脚本的版本管理

网络实验脚本也是代码,应该纳入版本管理。建议把拓扑定义、控制器逻辑、测试脚本、结果分析脚本放在同一个Git仓库里,每次实验对应一个commit。这样实验结果可追溯,也方便和别人协作。

目录结构可以这样组织:

network-experiments/ ├── topologies/ │ ├── simple_linear.py │ └── multi_subnet.py ├── controllers/ │ └── custom_switch.py ├── tests/ │ ├── ping_test.sh │ └── iperf_test.sh ├── results/ │ └── 2024-01-15/ └── README.md

每次实验前先git pull确保代码最新,实验后把结果文件提交上去。如果实验结果和预期不符,可以回退到之前的版本对比,快速定位是代码改动还是环境变化导致的问题。

我个人在实际操作中的体会是,Mininet这套工具最大的价值在于把网络实验的门槛降到了极低。以前需要一屋子设备才能做的实验,现在一台笔记本就能搞定。但工具越方便,越容易忽略底层原理。我的建议是,在用Mininet的同时,偶尔也手动用ip netns和veth pair命令搭一下最基础的拓扑,感受一下Mininet到底帮你做了哪些事情。理解了底层机制,遇到问题时排查起来会快很多。

最后再分享一个小技巧:Mininet的CLI支持Python交互模式,在CLI里输入py followed by Python代码,可以直接操作Mininet的Python对象。比如想批量修改所有主机的某个配置,用CLI命令一个个改很麻烦,用Python一行就能搞定:

mininet> py [h.cmd('sysctl -w net.ipv4.tcp_congestion_control=reno') for h in net.hosts]

这个功能在调试复杂实验时特别省时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询