简介《计算机网络Mininet实验详解》是一份面向高校计算机网络课程实验与课设的PDF资料适合正在学习网络协议、拓扑构建与OpenFlow控制器交互的学生使用。内容从需求分析与Mininet环境搭建讲起完整覆盖VMware虚拟机安装、Xming与PuTTY图形界面连接、Wireshark抓取OpenFlow控制信息等前置操作并系统演示nodes、net、dump、pingall、arp、route等CLI命令及预期输出帮助读者快速验证全网连通性与主机隔离性。压缩包内为单个PDF文档大小1.18MB结构紧凑可按实验步骤逐节对照操作已有545人浏览/学习说明其实用性受到一定认可。通过回归测试、iperf带宽测试、自定义Python拓扑、链路延迟设置、MAC固定与xterm调试验证等内容读者可以深入理解Mininet各模块用途并为后续网络研究与开发打下坚实基础。整体编排贴近实验报告撰写流程适合课设前自查也可作为答辩前快速复习提要。1. 计算机网络mininet实验课设这页纸到底值不值得读你手里那份《计算机网络mininet实验课设.pdf》不是一门“需要背诵的课程”它是一张实战地图让谢希仁教材里的 TCP 拥塞控制、VLAN、路由协议从文字变成你能亲手按下回车、亲眼看到流量变化的过程。Mininet 的意义不在于它是“SDN 入门工具”而在于它让你租一台弱鸡笔记本就能做出借用真实验证环境的计网课设一份可提交的 PDF 背后通常是几十行 Python 拓扑脚本、一组能复现的带宽与时延数据和几条排错日志。适合谁计网刚学完却不知从哪入手的本科生、准备考研复试要被问“做过什么实验”的选手、以及未来想走 devops 工程师方向、必须把网络摸清楚的同学。与其开学熬夜调不通不如跟着这篇笔记把路径走通。2. 搭建Mininet实验环境先花10分钟复现一个最小网络2.1 为什么计网课设偏偏选Mininet常见的计网实验路线有四条实物路由器交换机、GNS3/EVE-NG 的虚拟化路由、Docker 容器网络、以及 Mininet。实物设备成本高课设里也没人给你的路由器拆开看队列GNS3 启动一个完整 IOS 镜像就要吃掉几 GB 内存八年前的笔记本直接卡死Docker 能模拟容器网络但它在链路层、队列和 Netem 丢包这些“计网考点”上不如 Mininet 来得直接。Mininet 把每个主机抽象成一个网络命名空间交换机由 Open vSwitch 提供链路用 Linux tc 的 Netem 模块控制带宽、时延、丢包率整条链路的行为是在内核里真实发生的。这意味着你给 h1 和 h2 之间设置 bw1Mbpsiperf 测出来就是一条接近 1Mbps 的窄管而不是纸面数字。课设选它还有一个实际理由可提交性。Mininet 的拓扑、链路参数、运行流程都能写进 Python 脚本里老师跑一条命令就你复现全部实验。相比“我在 GNS3 里点了十下鼠标”这种不可复现的陈述一份脚本加一份报告才是课设该有的样子。国内教材偏爱谢希仁《计算机网络》考研复习常看王道视频“湖科大教书匠计算机网络”这类教学视频也强调抓包和测量这些理论如果你只背不验考前半个月就会忘干净。Mininet 正是那个“验证后端”。2.2 Ubuntu里装好Mininet并验证别漏掉这三步Mininet 不是一个带图形界面的软件它是一组 Python 脚本加依赖最稳妥的安装方式是使用 Ubuntu 20.04/22.04 的包管理器。先更新系统再装装完立刻跑一个 ping 测试sudo apt update sudo apt install -y mininet mn --version sudo mn --test pingall第三行是验证 Mininet 是否安装成功的关键。mn --version 输出版本号比如 2.3.0pingall 会创建一个最简单的拓扑两台主机一台交换机然后让 h1 ping h2。如果看到 “*** Pingall: 2/2 received”说明环境正常。若这里就 FAILED别急着重装先检查虚拟机的内存是否给够、是否存在多个 Open vSwitch 进程残留。常见做法是sudo pkill -9 ovsdb-server之后再跑一次。你可能会在网上看到“源码安装”的教程也就是git clone git://github.com/mininet/mininet然后util/install.sh -a除非包管理器版本对你的课设不适用否则我不建议新手直接走源码安装依赖链太长翻车概率高。apt 安装的版本已经足够应付课设里的拓扑和 QoS 参数。装好之后别急着开写先在命令行里跑sudo mn进入 Mininet 的交互式 CLI敲nodes看当前拓扑敲h1 ifconfig看主机网卡。这一步能帮你确认 Mininet 的主机确实拥有独立的网络命名空间。验证完成后用exit退出不然残留的进程会影响后续脚本。2.3 第一次创建网络链路参数是课设的生命线Mininet CLI 里一条命令就能创建带限定带宽、时延和丢包的链路这是整个课设最值钱的语法sudo mn --topo linear,3 --link tc,bw10,delay5ms,loss0 --controller ovs--topo linear,3 表示创建 3 台主机串联 2 台交换机的线性拓扑--link tc 表示链路交给 Linux tc 管理bw10 是带宽 10Mbit/sdelay5ms 是单向时延loss0 是丢包率。--controller ovs 使用 Open vSwitch 作为交换设备。进去后跑h1 ping h3能看到延迟比本机 loopback 明显高因为数据包经过了两条带 5ms 时延的链路。这时你可以把 delay 改成 100ms 再 ping 一次观察 RTT 翻了十倍这个“参数变化带来现象变化”的过程就是课设报告里最能加分的部分。需要明确的是delay 的单位是字符串必须写成5ms或100ms写成0.005会被直接忽略。loss 参数坑更多后面的避坑章节会详细说。第一次实验跑通后你要做一件事把这条命令以及你的修改过程记录下来。等到写报告时你会发现所有结论都依赖于“链路参数是什么”这条初始记录就是你报告的 baseline。3. 写一个可提交的拓扑脚本从CLI升级到Python的跳跃3.1 为什么必须用Python脚本提交而不是靠截图3. 写一个可提交的拓扑脚本从命令行升级到可复现实验的必经之路3.1 为什么课设报告里最忌讳一张CLI截图很多同学在第一次跑通 sudo mn 之后就想拿截图交差。但计网课设考察的是“你理解了链路、拓扑和协议之间的因果关系”不是“你会敲一条官方命令”。CLI 里你输入一条命令、看到一堆输出但老师无法复现你的操作流程你也没法在 CLI 里加注释、循环、条件判断。到了写报告的时候你会发现自己说不清“当时拓扑里的交换机到底连接了哪几台主机”于是只能再从零整理。常见做法是用 Python 脚本定义一个可复用的拓扑类把链路参数、IP 分配、启动的测量工具全部写死在脚本里让读者一行一行看明白。这也是 Mininet 本身提供的 API 被设计出来的目的构建网络并控制它。此外CLI 适合快速验证但不适合做带变量参数的实验。比如你想测三条不同带宽链路对 TCP 吞吐的影响CLI 里你得手动一条条敲而 Python 脚本里一个 for 循环就能跑完还能顺手把结果重定向到文件。课设的核心竞争力就在这个自动化里。3.2 从零写一个自定义Topo类最小可运行脚本我要给出的脚本是你在课设里几乎一定会用到的最小骨架两台主机、一台交换机、两条链路链路参数带带宽和时延。把下面的内容保存为 my_topo.py#!/usr/bin/env python3 from mininet.topo import Topo from mininet.net import Mininet from mininet.link import TCLink from mininet.cli import CLI from mininet.log import setLogLevel class MyTopo(Topo): 两台主机一台交换机的物理拓扑链路限速100Mbit/s时延10ms。 def __init__(self): Topo.__init__(self) h1 self.addHost(h1, ip10.0.0.1/24) h2 self.addHost(h2, ip10.0.0.2/24) s1 self.addSwitch(s1) self.addLink(h1, s1, bw100, delay10ms) self.addLink(h2, s1, bw100, delay10ms) if __name__ __main__: setLogLevel(info) net Mininet(topoMyTopo(), linkTCLink) net.start() # 先做一次连通性验证失败立刻暴露问题 print(net[h1].cmd(ping -c 3 10.0.0.2)) CLI(net) net.stop()这段代码的逻辑很直白自定义的 MyTopo 类继承自 Topo类里只负责“建点”和“连线”。addHost 的第一个参数是主机名ip 参数直接给主机配好 IP避免进 CLI 后再手敲 ifconfigaddSwitch 创建交换机等价于 CLI 里的 swaddLink 的 bw 和 delay 必须在调用时与 TCLink 配套使用否则不会生效。Mininet 构造器里传入 linkTCLink就是告诉 Mininet “这条链路的拥塞控制、限速都交给 TCLink 处理”。脚本最后进入 CLI方便你在运行时继续敲命令。setLogLevel(info) 是让你能看到 Mininet 调度时的细节日志排查连不通时它很有用正式实验时改成 output 或 warning 会清爽很多。运行方式sudo python3 my_topo.py进入 CLI 后你可以敲h1 ping h2然后exit。如果启动期间报错说cannot find any open switch多半是 OVS 服务没起来执行sudo service openvswitch-switch start再跑一次。3.3 把拓扑改成课程常见的三种结构线性、树形、单臂路由线性拓扑适合“逐跳延迟叠加”的实验。把类里的两行 addLink 换成 for 循环三台交换机串联每台再挂一台主机。代码片段for i in range(4): host self.addHost(fh{i1}, ipf10.0.{i}.1/24) switch self.addSwitch(fs{i1}) self.addLink(switch, host, bw10, delay2ms) if i 0: self.addLink(fs{i}, fs{i1}, bw10, delay5ms)树形拓扑适合验证广播域与 VLAN 划分。Mininet 的--topo tree, depth2, fanout3能快速生成但如果你想在报告里体现“我亲手建的”,那就用 Python 扩成层数为变量。强调一点树形拓扑里如果交换机之间出现环路记得在控制器层开启对应的 STP 支持或者跑 OVS 自带的 fail-mode否则广播风暴会把你测出的时延数据全部污染。单臂路由Router on a Stick适合理解不同 VLAN 间的通信。至少需要一台路由器Mininet 里可以用一台主机开启 IP 转发模拟或加一个 use_ovs 的 switch把一个交换机下挂多个 VLAN 的主机。这里拓扑的绘制比脚本更费时报告里务必配一张图。3.4 把脚本和测量工具穿起来一条命令收集完整实验数据只跑通拓扑还不够课设的产出是数据。我常用的做法是把测量命令一并写进 Python 脚本而不是进 CLI 手动敲。比如h1, h2 net[h1], net[h2] h2.cmd(iperf -s -p 5001 ) h1.cmd(iperf -c 10.0.0.2 -p 5001 -t 15 -i 1 tcp_test.txt)这段的意思是h2 后台启动一个 iperf server等待 5001 端口h1 作为客户端连接它跑 15 秒每隔 1 秒打印一次数据最后把输出重定向到 tcp_test.txt。Unix 命令在主机命名空间里照常执行你不需要额外写 socket 代码。跑完后读入 Python 或直接 vim tcp_test.txt就能看到每一秒的带宽变化。若你担心 Mininet 内置的 iperf 版本偏旧可以用h1.cmd(sudo apt install -y iperf3)先装新版注意 Mininet 主机进程默认非 root所以 cmd 里要加 sudo并且 iperf3 默认端口是 5201。把测量写进脚本的最大好处是可复现报告里每一步都有对应的脚本行号。老师问“这个数据和理论值为什么有出入”你只需要把参数摆出来解释误差来源。4. 把实验数据变成报告素材测带宽、时延、丢包的正确姿势与三个边界坑4.1 三个指标分别怎么测ping、iperf、tcpdump的配合计网课设里最常布置的三个指标是单向/往返时延、TCP/UDP 吞吐、链路丢包率。测法分工明确ping 用于测往返时延和基础丢包率iperf 用于测可持续带宽与重传数tcpdump 用于看宏观数据背后的细节比如握手、重传、窗口大小。永远不要在 Mininet 的默认环境下测带宽因为默认链路不带限速参数h1 和 h2 之间可能是 Gbit/s 以上,你测出来的数字毫无教学意义。测量之前先明确链路约束工具用途常用参数备注ping往返时延、丢包-c 10-i 0.2结果单位 ms注意与链路 delay 参数区分链路 delay 是单向iperf3持续带宽-t 10-i 1-P 4-P 过高会触发拥塞压测时使用iperf2兼容老实验-t 10-y C输出 CSV便于导入报告tcpdump抓包验证协议-i h1-eth0 -w out.pcap抓交换机的 mirror 口要另配先抓主机侧网卡4.2 从ping和iperf数据里读懂TCP行为一个典型的低速链路实验比如你设置了bw10, delay50ms的链路BDP带宽时延积 10Mbps × 0.05 秒 50000 字节约 48.8KB。但 Mininet 主机的 TCP 缓冲区默认会高于这个值所以 iperf 测量初期能看到带宽冲到接近 10Mbps而 ping 的 RTT 会随着队列膨胀从 100ms 涨到 130ms以上。原因很简单队列缓冲区不是你设置的 delay而是在 delay 基础上还叠加了排队时延。这就是“基于丢包反馈的 TCP 在深缓冲下会出现 Bufferbloat”的经典现象教科书里一句“网络拥塞导致时延增大”的验证。报告里你最好把延迟设为 5ms - 50ms - 100ms 三个档次测三次每组采 10 轮取中位数观察吞吐变化。具体测量命令参考h1 iperf -s -p 5001 h2 iperf -c 10.0.0.1 -p 5001 -t 10 -i 1如果吞吐读数为 9.x Mbps说明 TCP 已经跑满如果只有 2Mbps优先检查链路参数是否真的生效用h1 tc qdisc show可查到 h1-eth0 的 tc 规则是否带 htb。把这条 tcp_test.txt 里的重传计数和带宽中位数记下来这就是你报告里的“实验结果”。4.3 tcpdump抓包看三次握手和TCP重传把数据变成证据只贴一张 iperf 文本输出很难让老师信服。在脚本里加一行h1.cmd(tcpdump -i h1-eth0 -w tcp_handshake.pcap )把抓下来的文件用 Wireshark 打开。你可以看到 TCP 三次握手的第一次和第二次握手之间真实的时间差也可以看到带宽受限时 TCP 窗口被下调为原来的 1/2。在报告里放一张关键抓包截图截取 SYN、SYN-ACK、ACK 那三行就行。远程服务器没有图形环境tcpdump 抓完 pcap 后把文件下载到本地再开 Wireshark这是血泪经验。建议至少抓三组正常链路、限速链路、加入丢包率 1% 的链路对比重传次数。报告里最常见也最好用的呈现方式是表格下面给出一个可以填自己的模板实验编号链路bw链路delay链路lossTCP平均吞吐重传次数平均RTT(m)110Mbps5ms0%9.82Mbps012.4210Mbps50ms0%9.31Mbps2102.131Mbps100ms1%0.84Mbps45218.7这个模板的好处是任何拖到 Excel 里筛选都能在答辩时迅速回答老师追问。5. Mininet课设必踩的坑5个现象、原因与排查清单5.1 安装没问题但第一次pingall就FAILED现象sudo mn --test pingall输出 “*** PingAll: 1/2 received” 或者直接报 controller 连接失败。原因最常见的是 Open vSwitch 的数据库进程残留。VMware 虚拟机里安装 Ubuntu 后如果之前跑过别的网络工具ovsdb-server 与 ovs-switchd 可能需要强制重启也可能是因为宿主机的网络适配器工作模式阻塞了 VM 内的 veth 设备通信。解决先后台重启 OVS 服务即可无需卸载重装。sudo service openvswitch-switch stop sudo service openvswitch-switch start sudo mn --test pingall如果还是 FAILED检查虚拟机的虚拟网络编辑器把 VMware 的虚拟网卡都连到同一 VMNet 并禁用 VMware 自带的 DHCP。另外不管你的课设环境里用没用 NATMininet 的 veth 需要 root 权限创建所以“sudo mn”是必须的别用普通用户跑。5.2 设置了 bw1Mbps但iperf还是跑出100Mbps的“车速”现象addLink 里设置了 bw1Mbps但 iperf 输出显示带宽接近百兆速度根本没被限制。原因你脚本里 Mininet 实例未指定 linkTCLink此时 addLink 的 bw 参数被忽略实际使用的是等价于默认的 OVS INTF 配置没有调用 tc。再一种情况是你加了 TCLink但主机间通信走的是交换机本身的数据面没有经过 tc 队列测出来的带宽受网卡限制。解决在构造 Mininet 时确保传了linkTCLink并在 addLink 里用clsTCLink显式声明。检查链路是否生效的办法进入 CLI 后执行h1 tc qdisc show dev h1-eth0看到 htb qdisc 才说明限速真正加载。如果硬是看不到最省事的兜底是用 CLI 里的--link tc,bw1,delay10ms方式创建拓扑。5.3 python3 脚本报错 ModuleNotFoundError No module named mininet现象命令行 mn 能进但自己写的 my_topo.py 一执行就提示找不到 mininet 模块。原因apt 安装的 Mininet 模块默认在 /usr/lib/python3/dist-packages有些源码安装或虚拟环境会把它装在别的路径另一些用户在自己的 home 下建了 .local/lib/python3.8/site-packages且没有把它写入 PYTHONPATH。解决不要急着换安装方式先执行python3 -c import mininet; print(mininet.__file__)若没有输出则手动把 Mininet 所在目录加到 PYTHONPATH。常见目录是 /usr/lib/python3/dist-packages执行echo export PYTHONPATH/usr/lib/python3/dist-packages:$PYTHONPATH ~/.bashrc source ~/.bashrc如果你用了 Anaconda记得在 conda 环境里重装一次pip install mininet但我不建议因为 Conda 的隔离环境容易和 OVS 的 root 路径权限纠缠不清。5.4 设置 loss5%但iperf吞吐毫无变化重传也没有变多现象链路丢包率设成 5%ping 确实有丢包但 TCP 吞吐一直满速。原因这是“丢包反馈发生在队列外层”的误区。Mininet 的 loss 参数由 netem 实现它是在 tc 队列之后随机丢包。TCP 发送端看到丢包后会降低拥塞窗口那一瞬间吞吐应下降。但如果链路带宽较大且没有做队列深度的刻意收缩即使某个数据包丢失下个 RTT 内窗口又可以迅速回升iperf 按秒粒度平均值看不出瞬时下降。另一个技术陷阱是 netem 丢包对 UDP 才是线性的TCP 有重传和超时表现不是直线。解决把 bw 降到 1Mbps同时把 flush 前队列长度限制到 10 个包在 addLink 里加use_tcp和max_queue_size10。然后重测观察 TCP 重传计数的变化。如果你报告里写“loss 对 TCP 吞吐影响不大”这句话本身需要同时提供队列长度和窗口参数作为边界条件否则答辩会被质疑。5.5 iperf服务器启动不了Address already in use现象脚本里后台启动 iperf 后报错bind failed: Address already in use。原因上一次实验的 iperf 进程没有清理干净主机命名空间里还残留着一个占用端口的进程。Mininet 的 net.stop() 有时不会清掉后台进程。解决进入 CLI 后执行h1 pkill iperf; pkill iperf3或者直接退出 Mininet 后sudo pkill -f iperf。更稳妥的做法是在脚本里加进程清理代码net[h1].cmd(pkill -f iperf || true) net[h2].cmd(pkill -f iperf || true)这个坑在新手课设里出现概率极高发生在“运行完一次实验没有退出就再次运行脚本”的场景。6. 把实验写成高分课设报告数据表格、对比曲线和结论的3个加分细节6.1 给报告配一张“可复现参数表”这是最廉价的A素材老师评分最想看到的是“你理解了链路的哪几个参数影响实验结果”。所以报告第二页放一张表格列出你设置的每个链路参数、拓扑形态、测试工具版本。表头建议写链路带宽、单向时延、丢包率、队列长度、TCP拥塞控制算法、iperf版本、测试时长。这几行不会超过一页纸但能直接告诉老师你操作条件清楚反过来如果你只贴 iperf 截图却不写带宽参数老师第一反应就是你抄了别处数据。我自己的课设就因为表格被夸过但那年我不懂把误差原因写成“硬件限制”被批说“Mininet链路是虚拟的你的主机网卡不是瓶颈”。这句血泪经验给你误差优先解释队列与 TCP 机制不要写硬件。6.2 画一张ASCII拓扑图帮你验证自己的理解Mininet 给你的是逻辑拓扑你报告中至少画一张主机-交换机连接图。不要求你用绘图工具纯文本也能看明白[h1]---(eth0:10.0.0.1/24)---[s1]---(eth0:10.0.0.2/24)---[h2] bw100Mbit/s delay10ms这张图放在实验描述开头比大段文字直观得多。如果老师要看你跑通的状态你可以把 Mininet CLI 的net命令输出贴上去但 ASCII 图才是你自己整理过的“逻辑图”。审稿人快速阅读报告往往先扫图再扫数据表最后看你结论。没有图的课设报告就算数据全对也会被扣印象分。6.3 用一句“误差分析”正面回击扣分点报告结论前写一小段“与理论的偏差”这是区分 A 和 B 的分水岭。比如你的测试里1Mbps 链路测出的 TCP 吞吐是 0.97Mbps丢包 1% 时降到 0.84Mbps。可以这样写理论上限由 BDP 决定BDP 带宽×时延 1Mbps×0.1s 100kb ≈ 12.5KB实际 TCP 窗口受队列长度限制且 netem 丢包触发快速重传窗口减半后恢复需要若干 RTT所以 0.84 低于理论值 0.97属于合理偏差。同时要注明“iperf 默认使用 TCP 的 CUBIC 算法”这样误差就解释得圆满。这份解释比多跑一百遍实验都有用因为老师想看的是你是不是真懂 TCP 行为。最后一件事做完实验一定把 Mininet 退出干净尤其是多台主机上如果留着 iperf 进程你下个脚本会继承到一个脏拓扑。另外写报告时记得把脚本注释里的 IP 地址和拓扑图核对一遍我那次课设因为改了脚本没改注释被答辩老师一眼识破场面很尴尬。希望这些步骤能帮你用最小的时间成本换一份真材实料的课设报告。本文还有配套的精品资源点击获取