Ubuntu 20.04下从零搭建SDN实验环境:Mininet、RYU与Wireshark实战
1. 项目概述与核心价值最近在折腾网络虚拟化想搞个SDN环境来验证一些想法。SDN软件定义网络这玩意儿现在无论是云计算、数据中心还是5G核心网都绕不开它。但很多教程要么太老要么步骤跳得太快对新手不太友好。我这次的目标是在Ubuntu 20.04 LTS这个相对稳定且资源丰富的系统上从零开始搭建一个功能完整的SDN实验环境。这个环境的核心是Mininet网络仿真平台和RYUSDN控制器再配上Wireshark网络协议分析器这个“照妖镜”用来观察和分析数据包。整个过程我会把每一步的原理、踩过的坑和验证方法都讲清楚确保你跟着做一遍不仅能搭起来还能真正理解每个组件在干什么。无论你是网络方向的学生还是想了解SDN的开发者这套环境都能让你亲手“摸到”软件定义网络的脉搏。2. 环境准备与系统配置2.1 操作系统选择与初始化为什么选Ubuntu 20.04 LTS首先LTS长期支持版本意味着在未来几年内都能获得安全更新和关键修复这对于一个需要稳定运行、可能长期使用的实验环境至关重要。其次20.04发布于2020年4月其软件仓库中的软件版本如Python 3.8对新老项目兼容性都比较好既不会太旧导致某些新特性缺失也不会太新引发一些未预料到的依赖冲突。很多开源项目包括Mininet和RYU都针对这个版本进行过充分测试。拿到一个全新的Ubuntu 20.04系统后第一件事不是急着装软件而是做好基础配置。我强烈建议在虚拟机如VMware Workstation或VirtualBox中操作方便做快照随时回滚到干净状态。给虚拟机分配资源时建议至少2核CPU、4GB内存和20GB硬盘空间。网络适配器模式选择“NAT”或“桥接”都可以后续在Mininet内部会创建独立的虚拟网络不影响宿主机。系统安装完成后首先更新软件包列表并升级现有软件这是一个好习惯能确保我们从最新的源获取软件并修复已知漏洞。打开终端执行sudo apt update sudo apt upgrade -y这个过程可能会花点时间取决于网络速度和更新包的数量。升级完成后建议重启一次系统确保所有更新生效。接下来安装一些后续步骤必需的编译工具和基础库。Mininet的部分组件需要从源码编译RYU控制器基于Python一些Python包又依赖系统库。我们一次性安装好sudo apt install -y build-essential git python3-dev python3-pip python3-setuptools python3-wheel libffi-dev libssl-dev这里build-essential提供了gcc、make等编译工具链git用于克隆代码仓库python3-dev包含了Python开发头文件pip3是Python包管理器libffi-dev和libssl-dev是用于加密和网络通信的关键开发库。注意在安装过程中如果遇到询问是否继续的提示通常显示[Y/n]直接按回车确认即可。-y参数虽然能自动确认但了解每一步在安装什么是很重要的。2.2 网络环境与依赖检查搭建SDN环境对网络有一定要求主要是需要从互联网下载软件包和源码。确保你的虚拟机可以正常访问网络可以尝试ping 8.8.8.8测试连通性。如果使用公司或校园网可能需要配置代理这里不展开但需要你根据自身环境处理好。Python环境是重中之重。我们主要使用Python 3。检查默认Python 3版本python3 --version在Ubuntu 20.04上这通常会输出Python 3.8.10。确保pip3也已正确安装pip3 --version有时候系统可能同时存在pip对应Python 2和pip3。我们明确使用pip3来避免混淆。为了提高后续安装Python包的速度和稳定性可以考虑更换pip源到国内镜像例如清华源pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这个操作不是必须的但如果你在国内能显著提升下载速度。最后我们创建一个专门的工作目录让所有相关文件井井有条mkdir ~/sdn-lab cd ~/sdn-lab后续的所有操作除非特别说明都将在这个目录下进行。清晰的目录结构能让你在几个月后回看时依然能快速找到所有相关文件。3. 核心组件安装与配置3.1 Mininet网络仿真基石Mininet是搭建SDN实验环境的“舞台”。它能在单台机器上通过进程虚拟化技术快速创建包含主机、交换机、控制器和链路的虚拟网络。其核心原理是利用Linux的network namespaces为每个主机创建独立的网络栈用Open vSwitch作为软件交换机并通过管道连接这些虚拟实体。安装Mininet有多种方式通过apt包管理器、下载源码编译、或者使用其提供的安装脚本。我推荐使用源码编译安装虽然步骤稍多但能获得最新版本并且对系统有更完整的控制。首先从GitHub克隆Mininet的仓库git clone https://github.com/mininet/mininet.git克隆完成后进入目录并查看可用的安装选项cd mininet git tag -l # 查看所有发布版本通常选择最新的稳定版 git checkout -b 2.3.0 2.3.0 # 以2.3.0版本为例切换到该版本分支使用其自带的安装脚本进行安装。util/install.sh脚本功能强大我们可以通过参数选择安装组件。一个典型的完整安装命令如下cd util sudo ./install.sh -a参数-a代表“全部安装”它会安装Mininet核心、OpenFlow参考交换机、Wireshark解析器、Open vSwitch等所有组件。安装过程会持续一段时间需要下载和编译不少东西。期间可能会提示你输入用户密码或者询问是否继续按照提示操作即可。实操心得安装过程中如果网络不稳定导致下载失败脚本可能会报错退出。你可以重新运行相同的安装命令脚本会跳过已成功安装的部分继续未完成的工作。这是源码安装脚本的一个优点。安装完成后进行一个最简单的测试验证Mininet核心功能是否正常sudo mn --test pingall这个命令会创建一个最简单的拓扑两台主机通过一台交换机相连然后让两台主机互相ping。如果看到*** Results: 0% dropped (2/2 received)这样的输出说明Mininet安装成功基本的虚拟网络通信没问题。3.2 RYU灵活的SDN控制器控制器是SDN的大脑负责通过OpenFlow等南向接口对交换机进行集中控制。RYU是一个用Python编写的开源SDN控制器框架它轻量、模块化而且因为用Python对我们学习和开发非常友好。RYU的安装相对简单主要通过pip进行。但首先我们需要确保安装了一些系统依赖这些依赖是RYU某些组件比如基于Web的可视化界面所必需的sudo apt install -y libxml2-dev libxslt1-dev zlib1g-dev然后使用pip3安装RYU。同样为了速度可以使用国内源pip3 install ryu如果安装缓慢或出错可以尝试指定版本并添加信任的主机pip3 install ryu --trusted-host pypi.tuna.tsinghua.edu.cn安装完成后验证RYU是否安装成功ryu-manager --version如果正确输出版本号如ryu-manager 4.34说明安装成功。RYU自带了许多应用app比如简单的二层学习交换机、负载均衡器、防火墙等。我们可以通过ryu-manager命令加载这些应用来启动控制器。为了测试我们先运行一个最简单的二层学习交换机应用。这个应用会让控制器扮演一个学习交换机的角色自动学习主机MAC地址和端口的映射关系。 在一个终端窗口我们称之为控制器终端运行cd ~/sdn-lab ryu-manager ryu.app.simple_switch_13simple_switch_13是支持OpenFlow 1.3协议版本的简单交换机应用。运行后终端会显示一些日志信息并停留在等待状态这表明控制器已经在监听6633端口OpenFlow默认端口等待交换机连接。3.3 Wireshark网络流量“显微镜”Wireshark是网络分析的必备工具在SDN实验中我们用它来抓取和分析OpenFlow协议消息、以及虚拟网络中的数据包是理解SDN工作原理的“眼睛”。在Ubuntu上安装Wireshark很简单sudo apt install -y wireshark安装过程中会弹出一个对话框询问是否允许非root用户抓取数据包。这里非常关键为了后续方便我们选择“是”。这会在系统上安装dumpcap并设置相应的权限。如果你错过了这个对话框或者安装时没有出现可以手动配置sudo dpkg-reconfigure wireshark-common # 选择“Yes” sudo usermod -a -G wireshark $USER # 将当前用户加入wireshark组执行完usermod命令后你必须完全注销当前用户再重新登录或者重启系统这个用户组变更才会生效。否则你仍然会因为没有权限而无法抓包。验证安装和权限wireshark --version groups | grep wireshark # 检查当前用户是否在wireshark组中如果第二条命令能输出wireshark说明组权限已添加但需重新登录生效。Wireshark本身功能强大但对于OpenFlow协议我们需要确保其解析器dissector是最新的。幸运的是Mininet的安装脚本如果用了-a参数通常已经帮我们安装了OpenFlow的Wireshark插件。你可以通过启动Wireshark在“帮助”-“关于Wireshark”-“插件”中查看是否有openflow.so之类的插件。或者在终端尝试过滤OpenFlow包# 先启动一个测试抓包后面会用到 sudo wireshark -k -i any -f tcp port 6633 这个命令会在后台启动Wireshark并立即开始在所有接口上抓取目标端口为6633OpenFlow的TCP流量。我们后续启动Mininet连接控制器时就能在这里看到OpenFlow协议交互了。4. 环境集成与基础测试4.1 启动第一个SDN网络现在三个核心组件都已就位是时候让它们联动起来运行我们的第一个SDN网络了。这个测试的目标是用Mininet创建一个简单拓扑将其连接到我们正在运行的RYU控制器并通过Wireshark观察它们之间的OpenFlow通信。首先确保你的RYU控制器还在运行在之前的控制器终端里运行着ryu-manager ryu.app.simple_switch_13。如果关闭了请重新启动。然后打开一个新的终端窗口我们称之为Mininet终端进入我们的工作目录启动Mininet并指定外部控制器cd ~/sdn-lab sudo mn --topo single,3 --mac --switch ovsk --controller remote让我解释一下这个命令的参数--topo single,3创建一个单一交换机拓扑该交换机下连接3台主机h1, h2, h3。--mac自动设置主机MAC地址为简单易记的模式如00:00:00:00:00:01方便调试。--switch ovsk指定使用Open vSwitch内核模式交换机性能更好。--controller remote这是关键它告诉Mininet不要使用内置的简易控制器而是去连接一个远程控制器。默认会去连接本机127.0.0.1的6633端口正好是我们的RYU控制器监听的端口。执行命令后Mininet会启动并进入其命令行界面mininet。同时你应该立刻在控制器终端看到大量的日志输出例如EVENT ofp_event-...这表示交换机已经成功连接到控制器并开始交换诸如Features Reply,Packet-In等OpenFlow消息。4.2 验证网络连通性与控制逻辑在Mininet CLI中我们可以进行一系列测试。首先测试主机之间的连通性mininet pingall这个命令会让所有主机两两互ping。由于RYU控制器运行的是simple_switch_13应用一个学习交换机第一次ping时首包会以Packet-In消息上报给控制器控制器学习到MAC地址和端口对应关系后下发流表Flow-Mod到交换机。后续的包就直接由交换机快速转发了。所以你会看到第一次ping可能有轻微延迟之后就会很快。最终输出应该是*** Results: 0% dropped表示全部成功。我们还可以打开主机h1的终端进行更细致的测试mininet xterm h1这会弹出一个属于主机h1的终端窗口。在这个窗口里你可以像在独立机器上一样操作。例如用arp -a查看ARP缓存用ifconfig查看网络配置。尝试ping h2# 在h1的xterm中执行 ping 10.0.0.2 -c 3同时观察控制器终端的日志你会看到对应的OpenFlow消息事件。4.3 使用Wireshark观察OpenFlow协议之前我们已经在后台启动了Wireshark抓取6633端口的流量。现在在Wireshark的界面中你应该能看到捕获到的数据包。过滤OpenFlow流量在Wireshark顶部的过滤栏输入openflow_v4因为RYU的simple_switch_13使用OpenFlow 1.3对应Wireshark的过滤词是openflow_v4然后回车。这样界面上就只显示OpenFlow协议的消息。解读典型消息HELLO连接建立时交换机和控制器互相发送的问候消息协商协议版本。FEATURES_REQUEST/REPLY控制器询问交换机能力端口、表数量等交换机回复。PACKET_IN当交换机收到一个数据包在其流表中没有匹配项时会将此包或包头封装在PACKET_IN消息中发送给控制器。例如第一次ARP请求时就会触发这个。FLOW_MOD控制器向交换机下发流表项指导交换机如何转发后续匹配该规则的数据包。这是控制逻辑的核心体现。PACKET_OUT控制器告诉交换机将某个数据包从指定端口发送出去。通常与PACKET_IN成对出现。尝试在Mininet CLI中执行一些操作如pingall 或者从h1 ping h2然后回到Wireshark观察消息序列。你可以点击某条PACKET_IN消息在下方详情面板中展开OpenFlow协议树查看里面的in_port入端口、data携带的原始数据包如ARP请求等信息。再找到紧随其后的FLOW_MOD消息查看其match字段匹配条件和instructions字段动作如OUTPUT:port。通过这个“抓包-分析”的过程软件定义网络中“控制平面与转发平面分离”、“控制器集中决策”、“流表下发”这些抽象概念就变成了可视化的、具体的网络报文理解起来会深刻得多。注意事项Wireshark可能会抓到大量报文如果觉得杂乱可以在启动Mininet之前就开始抓包这样能抓到完整的连接建立过程。也可以使用更精确的捕获过滤器例如sudo wireshark -k -i lo -f tcp port 6633因为本机通信通常走环回接口lo。5. 进阶实验与应用开发5.1 自定义网络拓扑Mininet的强大之处在于可以轻松定义复杂的网络拓扑。除了命令行参数我们更常用Python API来定义拓扑这样更灵活、可重复。在工作目录下创建一个Python脚本custom_topo.py#!/usr/bin/env python3 from mininet.topo import Topo from mininet.net import Mininet from mininet.node import RemoteController from mininet.cli import CLI from mininet.log import setLogLevel class MyTopo(Topo): def __init__(self): Topo.__init__(self) # 添加三台交换机 s1 self.addSwitch(s1) s2 self.addSwitch(s2) s3 self.addSwitch(s3) # 添加四台主机 h1 self.addHost(h1) h2 self.addHost(h2) h3 self.addHost(h3) h4 self.addHost(h4) # 创建链路 self.addLink(h1, s1) self.addLink(h2, s1) self.addLink(s1, s2) # 交换机间链路 self.addLink(s1, s3) self.addLink(s2, h3) self.addLink(s3, h4) if __name__ __main__: setLogLevel(info) # 设置日志级别 topo MyTopo() # 创建网络指定连接到远程RYU控制器 net Mininet(topotopo, controllerlambda name: RemoteController(name, ip127.0.0.1), switchOVSKernelSwitch) net.start() CLI(net) # 启动Mininet命令行界面 net.stop()这个脚本定义了一个简单的拓扑两台主机h1, h2连接到交换机s1s1再分别连接到交换机s2和s3s2和s3下各有一台主机h3, h4。这形成了一个小型的多路径网络。运行这个拓扑cd ~/sdn-lab sudo python3 custom_topo.pyMininet启动后同样会进入CLI。你可以使用nodes查看所有节点用net查看链路用pingall测试连通性。由于我们仍然连接着同一个RYU学习交换机控制器网络会自行学习转发路径。5.2 编写简单的RYU控制器应用仅仅使用自带的simple_switch_13还不够过瘾我们来尝试自己写一个最简单的RYU应用体验一下“编程定义网络”的感觉。这个应用的功能是让控制器在收到交换机连接时主动下发一条流表项将所有来自端口1的ICMPping数据包丢弃。在工作目录创建文件my_drop_icmp.py#!/usr/bin/env python3 from ryu.base import app_manager from ryu.controller import ofp_event from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER from ryu.controller.handler import set_ev_cls from ryu.ofproto import ofproto_v1_3 # 使用OpenFlow 1.3 from ryu.lib.packet import packet, ethernet, ipv4, icmp class MyController(app_manager.RyuApp): OFP_VERSIONS [ofproto_v1_3.OFP_VERSION] # 声明支持的协议版本 def __init__(self, *args, **kwargs): super(MyController, self).__init__(*args, **kwargs) set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER) def switch_features_handler(self, ev): 交换机连接并上报特性时触发 datapath ev.msg.datapath # 获取交换机对象 ofproto datapath.ofproto parser datapath.ofproto_parser self.logger.info(Switch connected: %016x, datapath.id) # 构造一条匹配ICMP协议、动作为丢弃的流表项 match parser.OFPMatch(eth_type0x0800, # IPv4 ip_proto1) # ICMP actions [] # 空动作列表表示丢弃 inst [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)] # 构造Flow Mod消息并设置优先级较高、永久生效 mod parser.OFPFlowMod(datapathdatapath, priority10, matchmatch, instructionsinst) datapath.send_msg(mod) self.logger.info(Flow entry (drop ICMP) added to switch %016x, datapath.id) set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER) def packet_in_handler(self, ev): 处理Packet-In消息其他未匹配流表的数据包 # 对于这个简单应用我们可以让其他包走默认的学习交换机逻辑 # 这里我们选择不处理或者可以调用父类方法实现基础学习 pass # 更复杂的处理可以在这里解析数据包根据自定义逻辑决策 if __name__ __main__: from ryu import cfg import sys from ryu.cmd import manager sys.argv.append(--ofp-tcp-listen-port) sys.argv.append(6633) # 指定监听端口 sys.argv.append(my_drop_icmp) # 指定应用模块名 manager.main()这个应用的核心是switch_features_handler函数。它使用装饰器set_ev_cls注册为特定事件EventOFPSwitchFeatures的处理函数。当交换机连接并上报自身特性后控制器会立即下发一条流表项匹配IPv4协议下的ICMP包执行动作为空即丢弃。优先级设为10数字越大优先级越高确保这条规则会被优先匹配。运行这个自定义控制器。首先确保之前运行的RYU控制器已经停止在它的终端按CtrlC。然后运行cd ~/sdn-lab PYTHONPATH$PYTHONPATH:. ryu-manager my_drop_icmp.py --verbose--verbose参数会输出更详细的日志。启动后在另一个终端用Mininet启动一个简单网络并连接到此控制器sudo mn --topo single,2 --mac --switch ovsk --controller remote在Mininet CLI中尝试让h1 ping h2mininet h1 ping -c 3 h2你会发现ping包全部丢失100% packet loss。同时在控制器的终端日志里你应该能看到Switch connected和Flow entry ... added的信息。这就是你编写的控制器应用在起作用它主动下发了一条丢弃规则。你可以通过Wireshark抓包验证会看到交换机连接后控制器立即下发了一条FLOW_MOD消息。要恢复通信可以在Mininet CLI中清除交换机的流表mininet sh ovs-ofctl del-flows s1然后再执行ping就会发现通了。因为清除流表后ICMP包不再匹配到那条丢弃规则而是会上报给控制器PACKET_IN而我们的packet_in_handler函数没有处理交换机可能没有相关动作导致不通。更完善的应用应该在packet_in_handler里实现学习转发或默认转发逻辑。这个例子主要是展示控制器主动编程下流表的能力。5.3 利用Mininet进行网络性能测试Mininet不仅用于连通性测试还能进行简单的网络性能测试这对于评估SDN控制器或交换机的转发能力很有帮助。在Mininet CLI中可以使用iperf工具测试两个主机之间的TCP带宽。首先在Mininet CLI中启动一个简单的双主机拓扑如果已有其他拓扑先exit退出然后sudo mn --topo single,2 --mac --switch ovsk --controller remote启动新拓扑。在主机h1上启动iperf服务器mininet h1 iperf -s -s表示服务器模式让它在后台运行。在主机h2上启动iperf客户端连接h1的服务器测试10秒钟mininet h2 iperf -c 10.0.0.1 -t 10命令执行后会输出带宽测试结果包括传输的数据量、带宽速率等。由于这是在虚拟的软件交换机上运行带宽可能很高甚至达到数Gbps这展示了Open vSwitch软件交换机的性能。你也可以测试UDP性能或者通过--link参数在创建拓扑时设置链路带宽、延迟和丢包率模拟更真实的网络环境。6. 故障排查与日常维护6.1 常见问题与解决方案在搭建和使用过程中你可能会遇到一些问题。这里记录了一些典型问题及其排查思路。问题1运行sudo mn命令时报错提示“命令未找到”或“无法创建网络命名空间”。原因Mininet没有安装成功或者安装的组件不完整。排查检查Mininet是否安装which mn。重新运行Mininet的安装脚本并确保使用sudo权限。可以尝试更彻底的安装sudo ./install.sh -nfv其中-n安装Mininet核心-f安装OpenFlow-v安装Open vSwitch。检查系统日志dmesg | tail或journalctl -xe看是否有相关的内核错误如namespace相关。问题2Mininet无法连接到RYU控制器控制器终端无连接日志。原因控制器未启动、端口被占用、防火墙阻止或Mininet命令参数错误。排查确认控制器运行检查RYU进程ps aux | grep ryu-manager。检查端口监听sudo netstat -tlnp | grep 6633看是否有进程在监听6633端口。检查Mininet命令确保启动Mininet时使用了--controller remote。如果想指定控制器IP和端口可以使用--controller remote,ip127.0.0.1,port6633。检查防火墙Ubuntu默认的ufw防火墙可能阻止连接。可以暂时禁用测试sudo ufw disable测试后记得启用sudo ufw enable。问题3Wireshark抓不到OpenFlow包或者没有OpenFlow协议解析。原因抓包权限不足、抓错了接口、或者OpenFlow插件未安装。排查权限确保当前用户在wireshark组并且已经重新登录。接口OpenFlow通信通常发生在环回接口lo本机控制器或你指定的管理接口。在Wireshark开始抓包前选择正确的接口如any或lo。过滤器使用正确的显示过滤器openflow_v4对于OF1.3。插件如果Wireshark无法识别OpenFlow协议可能需要手动安装插件。可以尝试从Mininet目录复制sudo cp /usr/local/share/wireshark/plugins/openflow.so /usr/lib/x86_64-linux-gnu/wireshark/plugins/3.x/路径可能因Wireshark版本而异然后重启Wireshark。问题4自定义RYU应用导入模块失败报ModuleNotFoundError。原因Python路径问题或者依赖包未安装。排查确保在应用文件所在目录运行ryu-manager或者使用PYTHONPATH环境变量指定路径PYTHONPATH/path/to/your/app:$PYTHONPATH ryu-manager your_app.py。检查是否安装了所有依赖。RYU基础应用通常只需要ryu包本身但如果你用了其他库如webob,routes用于web界面可能需要单独安装pip3 install webob routes。问题5主机之间ping不通但控制器显示已连接。原因控制器应用逻辑问题、流表未正确下发、或者ARP不通。排查检查流表在Mininet CLI中使用sh ovs-ofctl dump-flows s1查看交换机s1上的流表。看看是否有匹配ICMP或ARP的流表项以及动作是否正确。检查ARP在主机h1上执行arp -n看是否有h2的ARP缓存条目。如果没有可能是第一个ARP请求没有被正确处理。可以在控制器中增加日志打印PACKET_IN消息的内容看是否是ARP包。简化测试尝试使用Mininet自带的默认控制器测试连通性sudo mn --test pingall。如果通了问题很可能出在你的控制器应用上。6.2 环境维护与清理实验完成后良好的清理习惯可以保持系统整洁并为下次实验做好准备。清理Mininet进程如果Mininet非正常退出比如直接关闭了终端可能会留下一些虚拟网络接口和进程。可以使用以下命令强制清理sudo mn -c这个命令会尝试清除所有Mininet创建的命名空间、进程和Open vSwitch配置。清理Open vSwitch配置如果mn -c清理不彻底可以手动操作OVSsudo ovs-vsctl list-br # 列出所有网桥 sudo ovs-vsctl del-br br0 # 删除名为br0的网桥根据实际名称 sudo pkill -9 ovs-vswitchd sudo pkill -9 ovsdb-server管理RYU控制器RYU控制器通常通过CtrlC终止即可。如果后台运行了多个可以用pkill -f ryu-manager结束所有相关进程。备份与恢复对于复杂的自定义拓扑和控制器应用建议将Python脚本和配置文件纳入版本控制如Git。对于虚拟机环境定期创建快照是最快的恢复方式。6.3 性能优化小技巧当拓扑变得复杂几十台主机/交换机时你可能会感觉到Mininet启动变慢或者响应迟缓。这里有几个优化点使用--switch ovsk我们一直在用这是内核态的Open vSwitch比用户态ovsk性能高得多。禁用IPv6在虚拟网络环境中IPv6有时会引起不必要的复杂性和开销。可以在启动Mininet时通过--ipv6禁用或者在主机启动后手动禁用。调整交换机型对于纯实验不需要交换机支持所有OpenFlow特性时可以使用性能更轻量的user交换机但功能有限。ovsk是性能和功能的良好平衡。控制器位置对于大型拓扑将控制器放在一个独立的、性能更好的虚拟机或物理机上可以减轻实验主机的负担。系统资源确保宿主机运行虚拟机的物理机有足够的CPU和内存资源分配给Ubuntu虚拟机。搭建SDN环境就像搭积木核心在于理解每个组件Mininet, RYU, Open vSwitch, Wireshark的角色和它们之间的交互协议OpenFlow。这个环境为你提供了一个安全、可重复、可视化的沙盒让你可以大胆地尝试各种网络创意、验证协议原理甚至开发自己的控制器应用。从最简单的ping测试到复杂的自定义流表控制每一步的实践都能加深对“软件定义”这四个字的理解。遇到问题多查日志、多用Wireshark抓包分析大部分疑惑都能在数据流中找到答案。