Mininet入门:单机搭建可交互SDN实验网络

发布时间:2026/10/24 19:44:27
Mininet入门:单机搭建可交互SDN实验网络 简介本资源是一份完整的Mininet网络仿真实验报告面向计算机网络、软件定义网络SDN及相关课程的本科生与初学者聚焦轻量级SDN实验环境搭建与拓扑编程实践。报告覆盖可视化工具Miniedit建模、命令行快速拓扑生成、交互式CLI操作及Python脚本化构建四大核心技能包含线性/单交换机/树形等典型拓扑实现、主机IP配置、带宽与延迟等性能参数限制方法并附详细命令说明与实操截图。资源为单个Word文档.doc共16页大小1.37MB内容源自西安财经大学《网络应用设计与系统集成》课程实验结构清晰、步骤翔实、术语规范适合作为实验参考模板或自学复现材料。目前已有1068人学习下载可直接用于课程作业提交、实验复盘或SDN入门项目快速启动。1. Mininet 是什么——一个能让你在自己电脑上“搭网络”的沙盒玩具你有没有想过不用买路由器、不用插网线、甚至不用开第二台电脑就能亲手搭出一个有 4 台主机、3 个交换机、还能互相 ping 通的局域网不是画图不是模拟动画而是真能ssh登录、真能跑ping、真能抓包、真能装 Wireshark 看数据流——就像把整个小型数据中心塞进了你笔记本的内存里。Mininet 就是这样一个“网络乐高”它不依赖物理设备也不需要复杂集群只靠 Linux 内核的轻量级虚拟化network namespace veth pair就能在单台机器上虚拟出真实的主机host、交换机switch、控制器controller和它们之间的链路。它不是教学动画也不是抽象模型而是一个可交互、可调试、可运行真实网络程序的活体网络环境。特别适合刚学完《计算机网络》还在想“IP 地址到底长什么样”、学完《软件定义网络》却连 OpenFlow 控制器都没摸过的同学——它把“网络拓扑”从课本里的方框箭头变成了你敲一条命令就能pingall成功的、会呼吸的系统。你不需要懂内核源码不需要配集群甚至不需要联网只要一台装好 Linux 的电脑或虚拟机就能从零开始亲手把“网络”搭出来、跑起来、调通了。2. 为什么新手第一课必须是 Mininet——因为它把“看不见的网络”变成“摸得着的终端”很多同学第一次接触网络实验时卡在同一个地方书上说“主机 A 向主机 B 发送 IP 包”可 A 和 B 在哪儿它们的 IP 是谁配的交换机怎么知道该往哪转发这些全在黑匣子里。Mininet 的价值正在于它把所有“黑匣子”全打开变成你终端里一行行可读、可改、可删的命令和 Python 对象。它不是替代真实设备而是给你一个零成本、零风险、全透明的预演沙盒——就像学开车先用模拟器学做菜先用空气炸锅试火候。下面这三件事就是它不可替代的理由。2.1 它让“网络拓扑”从概念变成可执行的 Python 对象你看教材里画的拓扑图H1—S1—H2这只是一个静态示意图。但在 Mininet 里h1不是标签而是一个真实进程s1不是图标而是一个运行中的 Open vSwitch 实例h1.cmd(ping -c 1 10.0.0.2)这条命令真的会触发内核协议栈、走虚拟网卡、被交换机查表转发、再进 h2 的收包队列。你写的每行 Python都在操控一个真实运作的子系统。比如下面这段最简拓扑脚本from mininet.net import Mininet from mininet.topo import SingleSwitchTopo from mininet.cli import CLI # 创建一个“单交换机两主机”的拓扑模板 topo SingleSwitchTopo(n2) # 启动网络仿真器自动创建命名空间、veth 对、挂载交换机等 net Mininet(topotopo) # 启动所有节点主机、交换机、控制器 net.start() # 打开交互式命令行你可以像在真实网络里一样操作 CLI(net) # 清理资源退出时自动调用但显式写出来更安心 net.stop()提示这段代码不是伪代码复制粘贴就能跑。它背后做的事相当于你手动配了两台虚拟机、装了 Open vSwitch、写了 OVS 流表、设了 IP、启了控制器——而 Mininet 把这几十步封装成net.start()一个方法。这就是它“降低认知门槛”的核心把系统级配置降维成对象方法调用。2.2 它让 SDN 学习不再停留在“画控制平面”阶段很多初学者学 SDN止步于“控制器下发流表”这句话。但流表下给谁怎么验证它生效了交换机收到包后到底查了哪条规则Mininet 让你能钻进去看。比如启动一个带远程控制器的拓扑sudo mn --topo single,3 --controller remote,ip127.0.0.1,port6653然后进入 Mininet CLI输入mininet dpctl dump-flows s1你立刻看到 s1 上真实存在的 OpenFlow 流表项——哪个端口进、匹配什么 MAC、动作是什么。再用h1 ping h2Wireshark 抓包能看到真正的 OFPT_PACKET_IN/OFPT_PACKET_OUT 交互。这不是“演示”而是你亲手驱动的 SDN 数据面与控制面握手全过程。没有 MininetSDN 对新手而言永远是一张无法验证的蓝图。2.3 它让“网络故障排查”变成终端里的白盒调试传统网络实验一 ping 不通你得猜是网线松了IP 配错了路由没加防火墙拦了在 Mininet 里所有环节都暴露在你眼皮底下net.hosts查所有主机对象h1.cmd(ifconfig)看 h1 的真实 IP 和 MACs1.cmd(ovs-ofctl dump-flows s1)看交换机当前流表h1.cmd(route -n)看主机路由表甚至ps aux | grep h1能看到 h1 对应的 bash 进程 PID。你不再是在黑盒外拍脑袋而是在白盒里逐层验证。这种“所见即所得”的调试体验是任何物理实验箱或网页模拟器都无法提供的——它把网络工程师最核心的能力分层定位、证据驱动、闭环验证直接种进你的肌肉记忆里。3. 第一步怎么迈——从命令行启动一个“最小可运行网络”开始别急着写 Python也别急着开 miniedit 图形界面。新手第一课必须是亲手敲出第一条sudo mn命令并看到mininet提示符亮起。这是你和 Mininet 的“握手成功”信号。我们从最简拓扑入手1 个交换机 2 台主机。它足够小失败点少又足够真能跑通所有基础命令。跟着做错一步就停我们马上排查。3.1 准备工作确认环境已就绪3 分钟搞定Mininet 本质是 Linux 工具所以它只认 Linux 环境。如果你用的是 Windows 或 macOS请先开一个 Ubuntu 虚拟机推荐 VirtualBox 官方 Ubuntu Server 镜像2GB 内存足矣。确认以下三点你是 root 用户或有 sudo 权限终端输入whoami输出应为root如果不是输入sudo su切换密码是你安装系统时设的。Mininet 已正确安装输入mn --version应输出类似2.3.0d5的版本号。如果提示command not found说明未安装。此时请执行复制整行回车curl -sL https://raw.githubusercontent.com/mininet/mininet/master/util/install.sh | bash -s - -nfv注意这条命令来自 Mininet 官方 GitHub全程自动下载、编译、安装无需你干预。它会装好 Mininet、Open vSwitch、依赖库耗时约 5–8 分钟取决于网速。安装完重启终端再试mn --version。确保没有残留网络进程干扰输入sudo mn -c注意是-c不是--clean它会强制清理所有之前可能卡住的 Mininet 进程和虚拟接口。这是新手最常忽略的“后悔药”建议每次开始新实验前都先敲一遍。3.2 动手启动第一个网络执行三次 ping现在输入这一行命令严格按格式空格不能错sudo mn --topo single,2你会看到一串快速滚动的日志最后停在*** Starting CLI: mininet✅ 恭喜你已成功启动一个含 1 个交换机s1、2 台主机h1、h2的网络。现在你在 Mininet 的交互式命令行里所有命令都以mininet开头。接下来执行三个关键验证命令每输一条回车看返回结果看拓扑长啥样mininet net输出应为h1 h1-eth0:s1-eth1 h2 h2-eth0:s1-eth2 s1 lo: s1-eth1:h1-eth0 s1-eth2:h2-eth0这表示h1 的 eth0 连 s1 的 eth1h2 的 eth0 连 s1 的 eth2。拓扑结构清晰可见。看所有主机 IPmininet dump输出中找h1和h2行你会看到类似Host h1: h1-eth0:10.0.0.1 pid1234 Host h2: h2-eth0:10.0.0.2 pid1235✅ 说明 Mininet 已自动给 h1 分配10.0.0.1h2 分配10.0.0.2且它们在同一子网。最关键的ping 通测试mininet pingall你会看到*** Ping: testing ping reachability h1 - h2 h2 - h1 *** Results: 0% dropped (2/2 received)✅ 全部成功这意味着IP 配置正确、ARP 解析成功、交换机泛洪转发正常、ICMP 协议栈工作完好——一个完整网络闭环已建立。提示如果pingall显示100% dropped别慌。90% 的原因是没清干净旧进程。立刻退出mininet exit再执行sudo mn -c然后重输sudo mn --topo single,2。这是新手第一大“玄学翻车点”但解决起来只需 10 秒。3.3 探索用xterm打开真实主机终端pingall是批量测试但你想像真实电脑一样登录 h1手动配 IP、装软件、抓包呢Mininet 提供了xterm命令它会为你弹出一个独立的图形终端窗口需你的 Linux 桌面环境支持如 Ubuntu Desktop若用 Server 版无图形界面则跳过此步mininet xterm h1你会看到一个新窗口标题为xterm-h1里面是 h1 的 bash 提示符例如rooth1:~#。在这个窗口里你输入的每条命令都只作用于 h1 这个虚拟主机ifconfig→ 看 h1 自己的网卡ping 10.0.0.2→ 从 h1 主动 ping h2apt update→ 甚至可以给 h1 装软件虽然不推荐在实验中装太多避免污染。注意xterm h1启动的是 h1 的独立终端和 Mininet CLI 是两个平行世界。你在xterm-h1里exit只是关掉这个窗口不影响 Mininet 网络运行。要彻底退出整个网络必须回到 Mininet CLIAltTab 切回来输入exit。4. 新手必踩的 5 个坑现象、原因、解法一条一条对症下药Mininet 学习曲线平缓但新手总在几个固定位置反复摔倒。这些不是你笨而是 Mininet 的设计逻辑和 Linux 底层机制存在天然“理解差”。我把实验室里 A 同学、B 同学、C 同学踩过的血泪坑浓缩成这 5 条每条都按“你看到什么 → 为什么这样 → 怎么立刻修好”来写照着做省下 3 小时无效搜索。4.1 现象sudo mn --topo single,2后卡住不动光标一直闪等 2 分钟没反应原因你的系统开启了 IPv6而 Mininet 默认的 Open vSwitch 配置在 IPv6 环境下会尝试解析::1IPv6 的 localhost但 DNS 或 hosts 文件没配好导致超时阻塞。解法强制禁用 IPv6 启动临时方案安全无害sudo mn --topo single,2 --switch ovsk,protocolsOpenFlow13 --arp✅ 关键参数--arp强制使用 ARPIPv4协议绕过 IPv6 解析。如果还卡再加--controller ref指定参考控制器。记住卡住 ≠ 崩溃是等待加--arp就醒。4.2 现象pingall显示h1 - h2成功但h2 - h1失败丢包率 50%原因交换机 s1 的流表为空或只有单向流表项。Mininet 默认用--controller none无控制器此时 s1 是“学习型交换机”但 h1 先发包s1 学到了 h1 的 MAC却没学到 h2 的 MAC所以 h2 回包时 s1 不知往哪发只能泛洪——而泛洪在某些内核版本下不稳定。解法启动时明确指定一个简易控制器推荐--controller remote它自带基础流表sudo mn --topo single,2 --controller remote,ip127.0.0.1✅ 控制器会主动下发table-miss流表确保所有包都有默认转发路径。这是“让交换机听话”的最简方式。4.3 现象xterm h1弹出窗口但里面显示Cannot open display原因你用的是纯命令行 Ubuntu Server无图形界面xterm需要 X11 图形服务而 Server 版默认不启动。解法不用xterm改用telnet方式登录无需图形mininet h1 telnet 127.0.0.1 5000但更推荐直接在 Mininet CLI 里用h1 cmd执行单条命令例如mininet h1 ifconfig mininet h1 ping -c 2 10.0.0.2✅h1 cmd xxx是纯终端命令不依赖图形100% 可用。xterm是锦上添花cmd才是雪中送炭。4.4 现象保存的 miniedit 脚本运行时报错NameError: name net is not defined原因miniedit 导出的.py文件是“半成品”它只生成拓扑定义部分class MyTopo(Topo):...但缺少if __name__ __main__:入口和Mininet(...)实例化代码。它不是完整可执行脚本而是“拓扑模块”。解法手动补全入口在导出的.py文件末尾添加if __name__ __main__: from mininet.net import Mininet from mininet.cli import CLI from mininet.log import setLogLevel setLogLevel(info) net Mininet(topoMyTopo()) # MyTopo 是你导出文件里定义的类名 net.start() CLI(net) net.stop()✅ 导出的文件名通常是mytopo.py其中class MyTopo(...)是核心。补上这 6 行它就从“拓扑描述”升级为“可运行程序”。4.5 现象Python 脚本里addLink(h1, s1, bw10)设了带宽但iperf测试结果远高于 10Mbps原因bw参数只限制链路的理论最大带宽但实际吞吐受 TCP 拥塞控制、缓冲区大小、测试时长影响。短时间iperf往往测不准且 Mininet 默认的tctraffic control限速需配合delay或loss才更稳定生效。解法用iperf长时间测试30 秒并加--time 30参数mininet h1 iperf -s # h1 启动服务端后台 mininet h2 iperf -c 10.0.0.1 -t 30 # h2 客户端连 h1测 30 秒✅ 如果仍超标说明bw未生效。检查是否漏了--link tc参数启动 Mininet 时加--link tc,bw10或确认你用的是addLink(..., clsTCLink)而非默认Link类。5. 下一步学什么——从“搭网络”到“控网络”的三阶跃迁路径你现在能用sudo mn启动网络、pingall验证连通、h1 cmd执行命令——这已经超越 70% 的同龄人。但 Mininet 的真正威力在于它如何成为你通往 SDN、网络自动化、甚至未来云网络的跳板。我建议你按这三步走每一步都对应一个具体、可验证、不虚的里程碑而不是泛泛而谈“深入学习”。5.1 第一阶用 Python 脚本固化拓扑告别命令行拥抱可复现命令行sudo mn --topo linear,4很快但它无法保存、无法版本管理、无法加注释。真正的工程起点是把拓扑写成.py文件。目标写出一个脚本运行后自动创建“3 主机 1 交换机 自定义 IP”的网络并一键pingall。下面是一个完整、可直接运行的脚本保存为myfirsttopo.py#!/usr/bin/env python from mininet.topo import Topo from mininet.net import Mininet from mininet.cli import CLI from mininet.log import setLogLevel from mininet.link import TCLink # 步骤1定义自己的拓扑类继承 Topo class ThreeHostOneSwitchTopo(Topo): def build(self): # 创建 1 个交换机 s1 self.addSwitch(s1) # 创建 3 台主机并指定 IP h1 self.addHost(h1, ip10.0.0.1/24) h2 self.addHost(h2, ip10.0.0.2/24) h3 self.addHost(h3, ip10.0.0.3/24) # 连接主机到交换机不设限速用默认 Link self.addLink(h1, s1) self.addLink(h2, s1) self.addLink(h3, s1) # 步骤2主程序入口 if __name__ __main__: setLogLevel(info) # 设置日志级别info 级能看到关键信息 topo ThreeHostOneSwitchTopo() # 实例化拓扑 # 启动网络指定拓扑、使用 TCLink支持限速、指定控制器 net Mininet(topotopo, linkTCLink, controllerremote) net.start() # 步骤3自动执行 pingall 并打印结果代替手动 CLI print(\n*** Running pingall) net.pingAll() # 步骤4进入交互式 CLI你可以继续手动操作 CLI(net) net.stop()✅ 运行方式sudo python myfirsttopo.py✅ 关键收获你第一次亲手定义了Host的 IP不再是 Mininet 自动分配第一次把拓扑逻辑封装进build()方法第一次用TCLink为后续加限速埋下伏笔。这不再是“用工具”而是“造工具”。5.2 第二阶给网络加“交通管制”——带宽、延迟、丢包的真实调控真实网络不是理想管道。你的脚本里加了bw10但没看到效果因为bw必须配合TCLink和tc命令才生效。目标让 h1 到 h2 的链路稳定在 5Mbps延迟 20ms丢包率 1%并用iperf验证。修改上面脚本的addLink行替换原来的self.addLink(h1, s1)# 替换原链接给 h1-s1 链路加严格限制 self.addLink(h1, s1, clsTCLink, bw5, # 带宽 5Mbps delay20ms, # 延迟 20 毫秒 loss1, # 丢包率 1% max_queue_size100) # 队列长度 100 个包然后运行脚本在 CLI 中执行mininet h1 iperf -s mininet h2 iperf -c 10.0.0.1 -t 20你会看到输出中Bandwidth稳定在4.9 - 5.1 Mbits/sec[ 3] 0.0-20.0 sec时间段内波动极小。这才是“网络性能可编程”的实感——你不是在模拟而是在调度内核的tc子系统。✅ 进阶技巧tc qdisc show dev s1-eth1可查看 s1 上该链路的实际限速规则验证 Mininet 是否真的调用了tc。这是你第一次“看见”自己写的 Python 如何翻译成 Linux 系统命令。5.3 第三阶接入真实控制器——从“傻瓜交换机”到“SDN 大脑”--controller remote是占位符真正的 SDN 控制器是独立进程。目标用开源 POX 控制器接管你的网络让它自动学习 MAC 地址、下发流表并通过dpctl验证流表由 POX 生成。安装 POX在 Ubuntu 终端执行cd /tmp git clone https://github.com/noxrepo/pox.git cd pox ./pox.py log.level --DEBUG forwarding.l2_learning这会启动 POX日志显示INFO:core:POX 0.7.0 is up.即成功。启动 Mininet 并连接 POX新开一个终端sudo mn --topo single,2 --controller remote,ip127.0.0.1,port6633验证控制器接管mininet dpctl dump-flows s1你会看到流表项里有cookie0x0, duration..., table0, n_packets..., idle_age..., hard_age..., priority65535,dl_type0x800,nw_proto1 actionsCONTROLLER:65535—— 这是 POX 的l2_learning模块下发的“通配流表”它把所有未知包发给控制器处理。✅ 这一刻你完成了从“网络搭建者”到“网络编程者”的质变你的 Python 脚本定义拓扑POX 控制器定义行为两者通过 OpenFlow 协议协作。这才是 SDN 的标准范式。从那以后我每次写 Mininet 脚本都强制走一遍“命令行启动 → Python 脚本化 → 加限速 → 接控制器”四步闭环。不是为了炫技而是确保每行代码都落在真实系统调用上不悬在空中。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询