一、实验目的
- 能够理解 POX 控制器的工作原理;
- 通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;
- 能够运用 POX控制器编写自定义网络应用程序,进一步熟悉POX控制器流表下发的方法。
二、实验环境
- 下载虚拟机软件Oracle VisualBox 或 VMware;
- 在虚拟机中安装Ubuntu 20.04 Desktop amd64;
三、实验要求
(一)基本要求
- 搭建下图所示SDN拓扑,协议使用Open Flow 1.0,控制器使用部署于本地的POX(默认监听6633端口)
- 使用如下命令搭建拓扑
sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10
- 阅读Hub模块代码,使用 tcpdump 验证Hub模块;
1.打开POX,Hub 模块./pox.py log.level --DEBUG forwarding.hub
2.在mininet输入代码mininet> xterm h2 h3
,开启终端
3.分别在主机h2,h3输入tcpdump -nn -i h2-eth0
和tcpdump -nn -i h3-eth0
-
h1 ping h2
-
h2 ping h3
-
又上述过程可见,主机h1 ping h2 和 h1 ping h3时,无论哪种操作,主机h2 和 h3 均能收到数据包,因此可以验证Hub 模块的功能:Hub 模块进行转发时是采用的洪泛式,无论ping 哪个主机,都会向所有端口进行转发,因而每个主机都能收到数据包
- 阅读L2_learning模块代码,画出程序流程图,使用 tcpdump 验证Switch模块。
-
流程图
-
使用tcpdump验证Switch模块
- 关闭Hub模块后输入
./pox.py log.level --DEBUG forwarding.l2_learning
打开L2_learning模块 - 验证
-
h1 ping h2
-
h1 ping h3
-
根据上述过程可知,使用swith模块时,当h1 ping 一台主机的时候,只有被ping的主机才会收到数据包,而其他主机不会收到数据包,交换机通过自学习,会将相应的数据包从特定的端口发出
(二)进阶要求
- 重新搭建(一)的拓扑,此时交换机内无流表规则,拓扑内主机互不相通;编写Python程序自定义一个POX模块SendFlowInSingle3,并且将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通。
- 重新搭建拓扑,发现主机ping不通
*编写Python程序自定义一个POX模块SendFlowInSingle3,代码如下
from pox.core import core
import pox.openflow.libopenflow_01 as of
class SendFlowInSingle3(object):
def __init__ (self):
core.openflow.addListeners(self)
def _handle_ConnectionUp(self,event):
msg = of.ofp_flow_mod() # 使用ofp_flow_mod()方法向交换机下发流表
msg.priority = 1
msg.idle_timeout=0
msg.match.in_port = 1 # 数据包进入端口1
msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL)) # 从端口2,3转发
event.connection.send(msg)
msg = of.ofp_flow_mod()
msg.priority = 1
msg.idle_timeout=0
msg.match.in_port = 2 # 数据包进入端口2
msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL)) # 从端口1,3转发
event.connection.send(msg)
msg = of.ofp_flow_mod()
msg.priority = 1
msg.idle_timeout=0
msg.match.in_port = 3 # 数据包进入端口3
msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL)) # 从端口1,2转发
event.connection.send(msg)
def launch ():
core.registerNew(SendFlowInSingle3)
*进行拓扑验证
四、个人总结
- 实验难度:较难
- 遇到的问题及解决办法:
- 第一次打开实验文档,翻看pox的文档,居多,而且全都是英文的,人都麻了,通过goole翻译、百度翻译硬着头皮看
- 进阶部分建立拓扑的时候,之前的pox进程并没有关闭,当我使用
dpctl dump-flows
清除拓扑之后,在pingall
发现并没有清除拓扑,以为我输入的命令出错了,又重新试了一边,结果还是一样的,但是之后发现pox进程没有关闭,在关闭之后,清除拓扑,pingall
发现所有主机ping不同 - 尝试在更改打开路径,提示在pox文件下找不到文件
查找相关资料后发现,pox打开相关模块要在pox的文件下 才会自动搜索路径
- 个人感想
通过这次试验了解了pox的使用,以及对于pox中hub的用法进行了实践验证,同时也了解了L2的自学习,通过自学习交换机可以更新地址/端口表,而不需要进行洪泛式数据传播。还有就是发现自己的英语很拉跨,英语翻译软件也有些拉跨,翻译出来的有些东西更本不能看,还是要努力提高英语能力。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!