简介本资源是一份完整的Mininet网络仿真实验报告面向计算机网络、软件定义网络SDN及网络工程相关课程的学习者与实践者聚焦于轻量级SDN测试平台Mininet的核心操作技能训练。报告系统覆盖可视化工具Miniedit拓扑构建、命令行快速建模、交互式CLI调试及Python脚本化拓扑定义四大能力层级包含ping连通性验证、主机/交换机配置、控制器集成、带宽与延迟等性能参数设置等关键实操内容并附有详细命令说明与典型拓扑示例如linear、single、tree等。资源为单个Word文档.doc共16页大小1.37MB结构清晰含实验目的、原理阐述、分步操作截图指引预览显示西安财经大学信息学院《网络应用设计与系统集成》课程实录、代码片段与结果分析便于对照复现与教学参考。目前已有1066人学习下载适合高校课程实验、SDN入门实践及OpenFlow开发前期环境验证。1. Mininet 实验报告不是 Word 填空题它本质是「网络拓扑可编程 流量行为可观测」的最小闭环验证你打开1_实验1mininet实验报告.doc第一眼看到的是 Word 表格、截图粘贴区和几行手写结论——但真正决定这份报告价值的从来不是格式是否对齐而是你能否在 5 分钟内复现一个带自定义链路延迟、带宽限制、并能抓到真实 OpenFlow 数据包的拓扑。Mininet 不是“模拟器”它是 Linux network namespace veth pair OpenFlow 控制器的轻量级组合体跑在本机就能生成真实内核级网络设备。这意味着你写的每行 Python 代码都在直接调度内核的网络栈你配的每个tc qdisc都会真实影响h1 ping h2的毫秒级 RTT你用ovs-ofctl dump-flows s1查到的流表就是真实交换机芯片里正在匹配的规则。这份实验报告的核心竞争力从来不是“我做了”而是“我能控制每一个比特的走向”。适合刚学完《计算机网络》第 4 章数据链路层但还没碰过 SDN 的本科生也适合想快速验证控制器策略逻辑的研究生——只要你愿意把.doc当作结果交付物而不是过程遮羞布。2. 用 Mininet Python API 搭建可复现实验环境从最简拓扑到可控链路参数Mininet 的本质是 Python 库不是命令行工具。.doc文件里贴的截图若来自mn --topo single,3这类命令说明你只用了它 10% 的能力。真正支撑实验报告可信度的是能精确控制节点数、链路属性、主机启动行为的 Python 脚本。下面这段代码就是你实验报告里「拓扑构建」章节该放的源码——不是截图是可执行、可调试、可改参的最小闭环。2.1 写出第一个可运行且带参数的 Mininet 脚本#!/usr/bin/env python3 # mininet_topo.py —— 实验报告核心拓扑脚本保存为同目录下可执行文件 from mininet.net import Mininet from mininet.topo import Topo from mininet.link import TCLink from mininet.cli import CLI from mininet.log import setLogLevel import sys class CustomTopo(Topo): def build(self, n3): # 创建 1 个交换机 s1 self.addSwitch(s1) # 创建 n 个主机全部连接到 s1 for i in range(1, n1): h self.addHost(fh{i}) # 关键使用 TCLink 替代默认 Link支持带宽/延迟/丢包率设置 self.addLink(h, s1, clsTCLink, bw10, delay5ms, loss0) def run_experiment(): setLogLevel(info) # 控制台输出级别避免刷屏 topo CustomTopo(n3) # 实例化拓扑n3 即 h1-h2-h3 net Mininet(topotopo, controllerNone) # 不启动默认控制器留白给后续实验 net.start() # 验证连通性所有主机应能 ping 通交换机即彼此可达 print( 连通性测试 ) net.pingAll() # 输出类似 0% dropped 才算通过 # 启动 CLI 交互界面供手动测试实验报告截图来源 CLI(net) net.stop() if __name__ __main__: run_experiment()逻辑说明这段代码不依赖任何外部控制器如 Ryu 或 POX纯粹验证 Mininet 自身的拓扑构建与链路参数能力。TCLink是关键——它底层调用tc命令在 veth pair 上注入网络约束bw10表示 10 Mbps注意单位是 Mbps不是 MB/sdelay5ms是固定单向延迟loss0表示无丢包。这些参数必须写进实验报告的「拓扑设计」表格中不能只写“按要求配置”。参数说明n3控制主机数量实验报告中需明确写出“本次实验采用 3 主机星型拓扑”bw10单位为 Mbps实测中若设为100但未修改tc的ceil参数会导致限速失效见后文避坑delay5ms字符串格式必须带单位ms/us/s数值过小如0.1ms可能因内核调度精度被忽略controllerNone显式关闭默认控制器避免干扰后续 OpenFlow 实验若需启用应写from mininet.controller import RemoteController并指定 IP/Port。2.2 在 CLI 中验证链路参数是否生效启动脚本后进入 Mininet CLI执行以下命令验证mininet h1 ip link show h1-eth0 # 输出应包含qdisc tbf 10Mbit root refcnt 2 mininet h1 tc qdisc show dev h1-eth0 # 输出应含root tbf rate 10Mbit burst 15kb latency 5ms mininet h1 ping -c 3 h2 # RTT 应稳定在 ~10ms 左右5ms 发送 5ms 返回而非 sub-ms为什么必须验证很多同学在.doc里贴了ping截图就认为链路生效但ping默认发的是 ICMP echo request不走 TCP/IP 栈的 full path无法反映tc对 TCP 流的真实限速效果。真正验证带宽限制要用iperf3见 4.2 节。CLI 中tc qdisc show是唯一能确认TCLink参数已写入内核队列调度器的证据。2.3 把拓扑导出为可视化图用 Python 自动生成 PNG实验报告需要拓扑图别再手绘或截图了。Mininet 自带net.plotGraph()但需配合 matplotlib 和 graphviz。以下代码生成topo.png可直接插入.doc# plot_topo.py —— 生成拓扑图需先运行 mininet_topo.py 并保持 net 对象 from mininet.net import Mininet from mininet.topo import Topo from mininet.link import TCLink import matplotlib.pyplot as plt # 复用上面的 CustomTopo 类 topo CustomTopo(n3) net Mininet(topotopo, controllerNone) net.start() # 生成坐标布局需安装 graphvizsudo apt install graphviz net.plotGraph(nodeSize100, fontSize8, showTrue, filenametopo.png) net.stop()注意plotGraph()依赖pygraphviz安装命令为pip install pygraphviz --install-option--include-path/usr/include/graphviz --install-option--library-path/usr/lib/graphviz/Ubuntu 20.04。若报错ImportError: No module named _graphviz说明 graphviz 开发头文件未安装不是 Python 包问题。3. 实验报告里的「流量分析」不能只靠 ping用 tcpdump wireshark 解析真实 OpenFlow 行为很多同学的实验报告里“流量分析”章节只有三行ping结果和一张 Wireshark 截图。这完全没体现 Mininet 的核心价值——它让你在普通笔记本上就能捕获真实 OpenFlow 协议交互。真正的流量分析必须回答三个问题1控制器何时下发流表2主机发包时是否命中流表3流表缺失时是否触发 Packet-In下面给出可复现的抓包路径。3.1 在指定接口上精准抓包避开虚拟网卡干扰Mininet 启动后每个主机对应一个veth接口如h1-eth0但直接在h1-eth0上抓包会混入 ARP、LLDP 等控制帧。正确做法是在交换机侧的对端接口抓包如s1-eth1这里只经过用户数据帧。# 在 Mininet CLI 中执行或另开终端 mininet h1 ping -c 1 h2 # 此时立刻在宿主机终端执行非 Mininet CLI sudo tcpdump -i s1-eth1 -w s1_eth1.pcap -c 20为什么选s1-eth1s1-eth1是交换机 s1 连接主机 h1 的端口所有 h1 发出的数据帧必经此口。而h1-eth0是主机命名空间内的接口tcpdump在宿主机上无法直接访问其命名空间强行抓会失败或抓到 loopback 流量。3.2 用 tshark 提取 OpenFlow 协议关键字段.pcap文件需用tsharkWireshark 命令行版解析避免 GUI 操作不可复现# 提取所有 OpenFlow 1.3 Packet-In 消息控制器未下发流表时触发 tshark -r s1_eth1.pcap -Y openflow_v3.type 10 -T fields -e openflow_v3.xid -e openflow_v3.buffer_id -e openflow_v3.in_port # 提取流表下发消息type 14即 OFPT_FLOW_MOD tshark -r s1_eth1.pcap -Y openflow_v3.type 14 -T fields -e openflow_v3.match.eth_type -e openflow_v3.instructions.apply_actions.actions.set_field.field -e openflow_v3.instructions.apply_actions.actions.output.port参数说明-Y openflow_v3.type 10显示过滤器只显示 Packet-Intype10-T fields以字段形式输出方便复制进 Excel 表格-e openflow_v3.match.eth_type提取以太网类型字段如0x0800表示 IPv4openflow_v3.instructions.apply_actions.actions.output.port输出端口号验证流表是否正确指向 h2。3.3 在实验报告中呈现「流表生命周期」证据链一份合格的流量分析章节必须包含三张截图文字对应图 Atshark输出的 Packet-In 列表证明控制器收到未知流量图 Bovs-ofctl dump-flows s1输出证明流表已下发图 C第二次ping的tcpdump结果显示无 Packet-In证明流表命中。关键细节第一次ping必有 Packet-In第二次ping必无 Packet-In除非流表超时。若两次都有说明流表未生效或匹配失败——此时要检查ovs-ofctl dump-flows s1中priority是否足够高以及cookie字段是否被其他控制器覆盖。4. 避坑Mininet 实验报告里高频翻车的 4 个硬伤及血泪修复方案Mininet 看似简单但.doc里藏的坑90% 来自对 Linux 网络栈和 OpenFlow 协议边界的误判。以下是我带过 17 届学生、审过 200 份实验报告后总结的 4 个致命问题每个都附带现象、根因和可立即执行的修复命令。4.1 现象ping显示 0% 丢包但iperf3测速远低于TCLink.bw设置值原因TCLink的bw参数仅作用于tc tbf的rate但未设置ceil上限导致突发流量突破限速同时iperf3默认使用 TCP受 TCP 拥塞控制影响而ping是 UDP/ICMP无拥塞反馈。解决显式设置ceil和burst并用iperf3验证# 修改拓扑类中的 addLink 行 self.addLink(h, s1, clsTCLink, bw10, delay5ms, loss0, max_queue_size100, use_hfscFalse, use_tbfTrue) # 启动 iperf3 服务端在 h2 mininet h2 iperf3 -s # 启动客户端在 h1 mininet h1 iperf3 -c 10.0.0.2 -t 10 -i 1验证标准iperf3输出的sender带宽应稳定在9.0~9.8 Mbps预留 10% 开销若持续低于7 Mbps说明tc未生效需检查tc qdisc show dev s1-eth1是否含tbf。4.2 现象ovs-ofctl dump-flows s1显示流表但h1 ping h2仍超时原因Mininet 默认使用ovs交换机但未启用 OpenFlow 1.3 协议栈或控制器未连接成功导致流表下发失败更常见的是ping使用 IPv6 地址fe80::而流表只匹配 IPv4。解决强制指定 IPv4 并验证控制器连接状态# 在 Mininet CLI 中 mininet h1 ping -4 -c 3 h2 # 强制 IPv4 mininet s1 ovs-vsctl get-controller s1 # 应返回 tcp:127.0.0.1:6633 mininet s1 ovs-vsctl set bridge s1 protocolsOpenFlow13 # 显式启用 OF1.3注意若控制器是 Ryu需确保ryu-manager已启动且监听6633端口若用--controllerremote启动 Mininet需确认ip addr show中lo接口有127.0.0.1。4.3 现象plotGraph()报错AttributeError: NoneType object has no attribute get原因net.plotGraph()调用前未调用net.start()或matplotlib后端未配置为非交互模式在无 GUI 的服务器上必报错。解决添加matplotlib.use(Agg)并确保net.start()已执行import matplotlib matplotlib.use(Agg) # 必须在 import pyplot 之前 import matplotlib.pyplot as plt # ... 后续 net.start() 和 net.plotGraph()4.4 现象实验报告提交后被退回理由是“截图模糊/字体过小/无参数标注”原因Mininet CLI 截图直接用gnome-screenshot截取未调整字体大小Wireshark 截图未勾选View Time Display Format Seconds since beginning of capture导致时间轴无法比对。解决统一用scrot命令行截图并用convert调整尺寸# 安装 scrotsudo apt install scrot # 截取 Mininet CLI需先聚焦窗口 sleep 1; scrot -u -q 100 mininet_cli.png # 放大并加文字标注用 ImageMagick convert mininet_cli.png -resize 150% -fill white -pointsize 14 -annotate 1010 拓扑3主机星型链路延迟5ms mininet_cli_labeled.png血泪经验所有截图必须含「可验证时间戳」和「参数标注」。例如ovs-ofctl dump-flows截图左上角加# bw10,delay5ms,loss0否则评审人无法判断你是否真按参数运行。5. 让实验报告从「作业」升级为「技术凭证」用自动化脚本生成可验证的 PDF 报告一份真正值得放进简历附件的实验报告不该是 Word 手动排版的产物而应是「代码 → 数据 → 图表 → PDF」全自动流水线。我坚持用pandocLaTeX生成 PDF因为1公式渲染精准如RTT 2 \times delay processing2代码块自动语法高亮3所有图表带label和ref交叉引用零出错4PDF 元信息可嵌入 Git commit hash证明版本可追溯。下面这套流程已在我指导的 32 份课程设计中落地。5.1 构建报告生成流水线从.py到.pdf目录结构如下mininet_exp/ ├── src/ │ ├── mininet_topo.py # 拓扑脚本 │ ├── capture_flow.py # 自动抓包并 tshark 解析 │ └── plot_topo.py # 生成拓扑图 ├── data/ │ ├── s1_eth1.pcap # 抓包文件 │ └── flows.csv # tshark 导出的流表字段 ├── report/ │ ├── report.md # Markdown 源文件含 ![](./data/topo.png) │ └── Makefile # 自动化编译入口 └── Makefile # 顶层编译5.2Makefile实现一键生成 PDF# top-level Makefile .PHONY: all clean pdf all: pdf pdf: report/report.pdf report/report.pdf: report/report.md $(shell find src/ -name *.py) $(shell find data/ -type f) pandoc report/report.md \ --pdf-enginexelatex \ --template./templates/eisvogel.latex \ --variable mainfontFira Sans \ --variable monofontFira Code \ --variable fontsize11pt \ --variable geometry:margin1in \ -o report/report.pdf clean: rm -f report/report.pdf data/*.pcap data/*.csv关键点说明--pdf-enginexelatex支持中文和 TrueType 字体--templateeisvogel.latex专业学术模板自动编号图表、章节--variable mainfontFira Sans指定无衬线字体提升可读性$(shell find ...)将所有源文件和数据文件列为依赖任一修改即触发重编译。5.3report.md中嵌入可执行代码块带输出Pandoc 支持code block with output让报告自带验证能力## 流表匹配验证 启动控制器后执行流表下发 bash ovs-ofctl add-flow s1 priority100,ip,nw_dst10.0.0.2,actionsoutput:2验证流表存在ovs-ofctl dump-flows s1 | grep nw_dst10.0.0.2 # 输出 cookie0x0, duration12.345s, table0, n_packets3, n_bytes252, priority100,ip,nw_dst10.0.0.2 actionsoutput:2 **为什么这比截图强** 读者包括你自己半年后可直接复制 ovs-ofctl 命令到终端执行输出必须与文档一致否则说明环境已变更。这是技术报告的「后悔药」——所有结论都绑定可复现的命令。 ### 5.4 给 PDF 加数字指纹嵌入 Git commit hash 证明版本纯净 在 report.md 头部加入 markdown --- title: Mininet 实验报告 author: XXX date: 2024-06-15 git-commit: ![](https://img.shields.io/badge/commit-$(git rev-parse --short HEAD)-blue) ---然后在Makefile中预处理report/report.md: report/template.md sed s/\$$(git rev-parse --short HEAD)/$(git rev-parse --short HEAD)/g $ $实际效果PDF 第一页右上角显示commit-abc1234点击 GitHub 仓库对应 commit可查看当时所有代码、数据、配置。这不是炫技是当你答辩被问“你确定这个流表是当时跑出来的吗”时唯一能掏出的证据。我带学生做 Mininet 实验时从不收 Word 文档。只收一个压缩包mininet_exp.zip解压后make pdf三秒生成 PDFmake clean一键清空所有中间产物。这样做的好处是——你交的不是一份作业而是一个可部署、可验证、可审计的技术制品。希望帮到你。本文还有配套的精品资源点击获取