
简介一份适合网络工程/SDN课程学生的Mininet实验报告范例整合了可视化工具Miniedit创建拓扑、命令行与交互式界面构建主机交换机以及Python脚本搭建网络拓扑等核心实验内容同时涵盖ping测试、节点连通性验证等环节并附Mininet特性说明和常用命令速查。报告来源于西安财经大学信息学院《网络应用设计与系统集成》课程以图文步骤记录了从启动miniedit、配置交换机主机到保存并运行拓扑的完整过程也给出linear、single、tree等典型拓扑的Python构建示例。资源共1个doc文档压缩包大小1.37MB结构完整清晰既适合课程实验参考也可作为初学者理解软件定义网络仿真平台的入门材料。现已有1067人学习该资源。1. 用 Mininet 搭网络拓扑为什么一个虚拟环境能把人卡住一整天第一次接触 Mininet 的人多半是卡在同一个地方照着实验手册敲sudo mn拓扑是出来了但一到pingall就丢包或者 miniedit 可视化界面根本起不来。这个工具本身不复杂复杂的是它依赖的虚拟化环境——OpenvSwitch 内核模块没加载、Python 版本不对、甚至 VMware 网卡模式选错都会让一个本来几秒就能跑通的拓扑变得莫名其妙。本篇文章要落地的是 Mininet 环境搭建与三种拓扑构建方式可视化工具 miniedit、交互式命令行、Python 脚本。这套环境是 SDN 实验的常见起点也是很多网络课程报告里必写的一环。读完你可以照着步骤从零建出 linear、single、tree 三类拓扑并且知道每个命令背后的参数含义遇到报错也能自己排查。适合正在做实验、写报告、或者刚接触 SDN 想动手跑通的开发者。2. 环境准备与拓扑创建方式先分清三条路再动手2.1 运行环境选型虚拟机、物理机还是云主机Mininet 官方支持 Ubuntu 系系统最省事的方式是直接在 VMware 里装一个 Ubuntu 镜像。做实验的人经常在物理机上折腾半天最后发现内核模块编译不过去玄学问题一大堆其实虚拟机反而是最稳的路径。原因很简单Mininet 依赖 OpenvSwitch 和 cgroups虚拟机里可以随时快照装坏了恢复成本几乎为零。我一般建议用 Ubuntu 16.04 或 18.04 的 64 位镜像内存分配 2GB 以上网络适配器选 NAT 模式。NAT 模式下虚拟机可以访问外网下载依赖包同时又和宿主机网络隔离不会出现网段冲突的问题。硬盘给 20GB 就够Mininet 本体加依赖包全部装完不到 3GB。sudo apt-get update sudo apt-get install -y mininet安装完成后先验证一下版本确认装的是可用的版本而不是一个半残的旧包。mn --version如果提示找不到命令说明 apt 源里没有这个包需要走源码安装先git cloneMininet 仓库然后运行util/install.sh。这个脚本会一并装好 OpenvSwitch、Wireshark 等配套工具缺点是耗时长网络不好的时候容易中断。装完再用mn --version验证能输出版本号就说明核心安装成功。2.2 三种拓扑创建方式对比可视化、命令行、脚本各适合什么场景Mininet 创建拓扑有三条路对应的场景完全不同。可视化工具 miniedit 适合教学演示和报告截图鼠标拖拽就能画拓扑还能导出 Python 脚本命令行sudo mn --topo适合快速验证一个已知拓扑一条命令拉起来就测交互式界面适合在已有拓扑上动态加节点不改脚本直接操作Python 脚本则是最正式的方式适合复现实验、修改参数、批量跑测试。从实验报告的角度看三种方式都要会因为老师验收时可能随机让你用其中一种现场建拓扑。从实际工程角度看Python 脚本最值得花时间因为只有它能精确控制带宽、延迟、丢包率这些网络参数。后面几章会把这三种方式逐个走一遍每一条命令都给出参数说明。3. 命令行创建拓扑sudo mn 背后的参数与拓扑类型3.1 最小拓扑一个交换机挂两个主机命令行方式是 Mininet 最直接的入口sudo mn默认就会创建一个最小拓扑一个交换机s1连接两个主机h1、h2。这个默认行为很多人不知道以为必须加参数才能建拓扑其实直接敲sudo mn就已经在跑一个完整的 OpenFlow 网络了。sudo mn进入 Mininet 交互界面后可以用net命令查看当前的拓扑结构用nodes查看所有节点。这两个命令是验证拓扑是否正确的最快方式。如果看到 h1、h2、s1 三个节点并且 h1 和 h2 都连到了 s1 上说明默认拓扑已经就绪。mininet net mininet nodesnet输出的每一行代表一个节点及其连接的端口信息格式是节点名 接口名:对端节点(对端接口)。nodes会按类型列出所有主机、交换机、控制器。这两个命令在后面的所有实验里都会反复用到建议把输出格式记熟排查拓扑错误时第一眼就能看出哪里连错了。3.2 三种内置拓扑single、linear、tree 的参数写法Mininet 内置了三种常用拓扑类型参数格式都是--topo 类型,参数。这里的参数是英文逗号分隔没有空格写错一个标点就会报错。下面把三种写法一次性列出来每条都标注参数含义。sudo mn --topo single,3 sudo mn --topo linear,4 sudo mn --topo tree,depth2,fanout2single,3表示 1 个交换机连接 3 台主机所有主机挂在同一个交换机上适合测试广播和冲突域场景。linear,4表示 4 台交换机串联每台交换机下挂 1 台主机形成一条链适合测试多跳转发和延迟累积。tree,depth2,fanout2表示深度为 2、扇出为 2 的树形拓扑第一层 1 个根交换机第二层 2 个交换机第三层 4 台主机总共 3 层设备。注意tree拓扑的 depth 是指交换机层数不是总层数。depth2 时实际设备层数是 3根交换机组、中间交换机组、主机组。很多人在这个参数上踩坑以为 depth2 就两层设备结果主机数量和自己预期对不上。跑完对照实验报告里的拓扑图应该是 4 台主机连接 2 台中间交换机2 台中间交换机再连接 1 台根交换机。4. miniedit 可视化创建拓扑拖出一个能导出脚本的网络4.1 启动 miniedit 并完成基本配置miniedit 是 Mininet 自带的图形化拓扑编辑工具本质是一个 Python 脚本路径通常在examples/miniedit.py目录下。不同版本安装路径略有差异最稳妥的查找方式是直接用find命令定位。sudo find / -name miniedit.py 2/dev/null找到路径后用sudo python启动。注意这里必须有 root 权限否则 OpenvSwitch 无法创建虚拟网卡界面能打开但建拓扑时会报权限错误。cd /usr/lib/python2.7/dist-packages/mininet/examples sudo python miniedit.py启动后界面会弹出一个空白画布左侧是节点类型面板包括 Host、Switch、Controller 等图标。用鼠标拖拽节点到画布上再用连线工具把主机和交换机连起来。连线时注意顺序先点击交换机端口再点击主机端口顺序反了可能导致端口映射混乱。4.2 节点属性配置与导出 Python 脚本拖出拓扑后右键点击节点选择 Properties 可以配置参数。主机需要配置 IP 地址交换机需要配置 OpenFlow 协议版本控制器要选择远程还是本地。这些配置直接决定了拓扑能否正常通信。# 主机配置示例 h1: 10.0.0.1/8 h2: 10.0.0.2/8 # 交换机配置示例 OpenFlow 1.3配置完成后通过菜单栏的 File 选择 Export Level 2 Script会生成一个 Python 脚本文件。这个脚本可以在命令行里直接运行效果和在可视化界面里创建的拓扑完全一样。导出后用sudo python 脚本名运行脚本会自动创建相同的拓扑结构并且如果勾选了 Start CLI 选项运行后还会进入 Mininet 交互界面可以直接执行 ping 测试。这里有个常见坑导出时如果没有勾选 Edit 菜单里的 Start CLI脚本运行完会直接退出无法进入交互界面。做实验时一定要记得勾选这个选项否则后面没法测试连通性。另外导出的脚本文件名最好用英文中文文件名在部分版本的 Python 2 环境下会报编码错误。5. 交互式界面与 Python 脚本动态改拓扑和批量建拓扑5.1 交互式 CLI在已有拓扑中动态添加主机和交换机sudo mn进入交互界面后除了执行 pingall、net 这些常规命令还可以通过py前缀直接执行 Python 代码操作 Mininet 对象。这是在现有拓扑上动态加设备的常用方式不需要退出重进。mininet py net.addHost(h3) mininet py net.addLink(s1, net.get(h3)) mininet py s1.attach(s1-eth3) mininet py net.get(h3).cmd(ifconfig h3-eth0 10.3)第一条命令添加一个名为 h3 的主机节点第二条命令把 h3 连接到交换机 s1 上第三条命令把 s1 的 eth3 端口加入 OpenvSwitch 管理第四条命令给 h3 配置 IP 地址。这四步缺一不可只 addHost 不 addLinkh3 是孤立节点只 addLink 不 attach端口虽然存在但 OpenvSwitch 没启用它不配 IP 的话ping 的时候找不到地址。这一步特别容易翻车的地方在于s1.attach(s1-eth3)这个命令。很多教程没提这个步骤导致拓扑里明明能看到 h3 连上了 s1但h1 ping h3就是不通。原因就是 OpenvSwitch 需要显式把端口加入管理。每次交互式添加设备都要记得补上 attach这个习惯能省掉一半的排查时间。5.2 Python 脚本构建标准拓扑linear、single、tree 的一次性写法交互式命令适合临时操作但实验报告要求的是编写独立的 Python 脚本。下面给出一个完整的脚本框架覆盖了 linear、single、tree 三类常用拓扑以及自定义 IP 的写法。脚本里用到的LinearTopo、SingleTopo、TreeTopo都是 Mininet 内置的拓扑类无需自己实现。from mininet.topo import Topo from mininet.net import Mininet from mininet.node import OVSSwitch, Controller from mininet.cli import CLI from mininet.link import TCLink class MyTopo(Topo): def build(self): # single: 一个交换机挂两台主机 s1 self.addSwitch(s1) h1 self.addHost(h1, ip10.0.0.1/8) h2 self.addHost(h2, ip10.0.0.2/8) self.addLink(s1, h1) self.addLink(s1, h2) if __name__ __main__: topo MyTopo() net Mininet(topotopo, switchOVSSwitch, controllerController, linkTCLink) net.start() CLI(net) net.stop()这个脚本定义了一个自定义拓扑类内部构建了 1 台交换机和 2 台主机并给每台主机指定了 IP。运行时先net.start()启动网络然后CLI(net)进入交互界面测试完net.stop()清理所有虚拟网络设备。关键参数在Mininet()构造函数里switchOVSSwitch指定使用 OpenvSwitchlinkTCLink允许后续对链路设置带宽和延迟。如果要改成 linear 或 tree 拓扑只需替换 MyTopo 类的内容使用 Mininet 内置的类名加参数即可。from mininet.topo import LinearTopo, SingleTopo, TreeTopo # linear,4: 4台交换机串联每台下挂1台主机 topo LinearTopo(k4) # single,3: 1台交换机下挂3台主机 topo SingleTopo(k3) # tree,depth2,fanout2: 树形拓扑2层交换机扇出2 topo TreeTopo(depth2, fanout2)5.3 网络性能限制带宽、延迟、丢包率的参数配置实验报告的进阶部分要求对网络性能做限制核心是用addLink()的参数控制链路质量。Mininet 的 TCLink 支持四个关键参数bw 表示带宽单位 Mbit/sdelay 表示链路延迟单位 msmax_queue_size 表示最大队列长度用于模拟拥塞loss 表示丢包率取值范围是 0 到 100 的整数。这四个参数可以在脚本里直接加到 addLink 调用中。from mininet.link import TCLink class PerfTopo(Topo): def build(self): s1 self.addSwitch(s1) h1 self.addHost(h1) h2 self.addHost(h2) # 限制带宽10Mbit/s延迟5ms丢包率1% self.addLink(s1, h1, bw10, delay5ms, max_queue_size100, loss1) self.addLink(s1, h2, bw10, delay5ms, max_queue_size100, loss1)这里有个容易忽略的点mininet()构造时需要显式指定linkTCLink否则默认使用 OVSLinkaddLink 里的 bw、delay、loss 参数会被直接忽略悄悄失效。不少同学脚本写对了却因为少了这个参数导致性能限制完全不生效。检查脚本时优先看这一行有没有写对。6. 常见问题排查Mininet 构建过程中的几个高频坑6.1 启动报错OpenvSwitch 内核模块未加载现象运行sudo mn时终端输出一堆关于openvswitch_mod或datapath的错误然后自动退出。原因OpenvSwitch 的内核模块没有加载或者版本不匹配。常见于刚装完 Mininet 但没有安装 openvswitch-switch 包或者系统内核升级后模块失效。解决先确认模块是否可用再强制加载。一条命令搞定。sudo apt-get install -y openvswitch-switch sudo modprobe openvswitch_mod加载完成后重新运行sudo mn。如果仍然报错把虚拟机关机后重新启动一次让内核重新加载所有模块。这个问题在 Ubuntu 内核升级后尤其常见属于 Mininet 环境搭建里的第一个拦路虎。6.2 pingall 不通单一主机无法 ping 通其他主机现象交互界面里pingall命令显示 h1 可以 ping 通 h2但 h2 ping 不通 h1或者所有主机都 ping 不通。原因最常见的原因是主机 IP 配置冲突或者交换机没有正确连接到控制器。另外在交互式手动添加主机时没有执行s1.attach()也会导致端口不生效。解决先用dump命令查看所有节点的接口和 IP 信息。确认每个 host 的 IP 是否在同一个子网内然后检查交换机的端口状态。mininet dump mininet s1 ovs-ofctl dump-ports s1如果端口列表里缺少某个主机的接口说明 attach 没生效。用py s1.attach(s1-eth3)补上再重新 pingall。如果是 IP 不在同一网段用ifconfig命令修改主机 IP 后重试。6.3 xterm 无法打开显示转发或权限问题现象在 Mininet 交互界面输入xterm h1后没有任何反应或者终端卡住。原因xterm 工具没有安装或当前用户没有 X11 转发权限。在纯命令行环境SSH 登录虚拟机里这个问题尤其常见。解决先补装 xterm再检查 DISPLAY 环境变量。虚拟机本地操作一般没问题SSH 远程操作时需要用ssh -X开启 X11 转发。sudo apt-get install -y xterm echo $DISPLAY6.4 Python 脚本运行报错addHost 的参数写错现象脚本运行时报TypeError: addHost() got an unexpected keyword argument。原因Mininet 不同版本对 addHost 参数的命名不完全一致。旧版本用ip新版本用法相同但部分扩展参数名有差异比如 CPU 限制在版本间兼容性较差。解决把脚本里的参数和本机 Mininet 版本对照不确定时在 Python 交互环境里查看函数签名。python -c from mininet.topo import Topo; import inspect; print(inspect.signature(Topo.addHost))6.5 导出脚本后运行报编码错误现象miniedit 导出的 Python 脚本用sudo python运行时报SyntaxError: Non-ASCII character。原因脚本里包含中文注释而 Python 2 默认不识别中文编码文件头部没有声明编码格式。解决在脚本第一行加# -*- coding: utf-8 -*-。更省事的做法是导出时文件路径和拓扑节点名全部用英文避免出现中文。7. 装完怎么验证跑通从拓扑结构到连通性的一整套测试7.1 验证拓扑结构net、nodes、dump 三连环境装好、拓扑建起来之后第一步要验证的是拓扑结构本身是否正确。进入 Mininet 交互界面依次执行net、nodes、dump三个命令对照实验预期检查节点数量和连接关系。mininet net mininet nodes mininet dumpnet看链路连接是否和预期一致nodes看设备数量是否完整dump看每个节点的 IP、MAC、端口状态。三个命令信息有重叠但排查时各有用处net 管连接nodes 管数量dump 管细节。这个验证习惯一直保留着现在脚本跑起来第一件事就是三连确认拓扑没变形。7.2 验证连通性pingall 和定向 ping 的区别拓扑结构对了不代表网络能通信必须做连通性测试。pingall会遍历所有主机两两互 ping适合快速发现整体问题定向h1 ping h2适合确认某一条具体链路的状态。mininet pingall mininet h1 ping -c4 10.0.0.2pingall的输出格式是h1 - h2 ✓ h3 ✓每个对钩代表一对主机通信正常。如果有叉号说明对应主机对之间存在链路或配置问题。定向 ping 加-c4参数表示发送 4 个包可以顺便观察延迟和丢包率如果通了但响应时间波动很大说明链路性能限制生效了。7.3 验证性能限制从 ping 延迟判断参数是否生效配置了 bw、delay、loss 之后最直观的验证方式就是看 ping 的延迟。如果链路设置了 5ms 延迟ping 的 RTT 至少是 10ms往返双程实测超过 10ms 且波动在合理范围内说明延迟参数生效。如果 RTT 显示 0.0xx ms说明链路没有启用 TCLink参数被忽略了。mininet h1 ping -c 10 10.0.0.2观察输出里的time字段然后对比脚本里设置的 delay 参数。这个对比可以作为验证链路参数是否生效的量化依据写进实验报告的结果分析部分比纯文字描述有说服力得多。整套环境从安装到验证跑通现在看来流程清晰但第一次做这个实验时确实在这些环节上反复折腾过。从那以后每次搭好环境我都会强制自己走一遍 net、nodes、dump、pingall 这套完整流程确认拓扑、连通性、性能三个层面都没问题才进入下一步。这个习惯一直保留到现在希望也能帮到你少走几步弯路。本文还有配套的精品资源点击获取