第一部分:基本实验
实验步骤1
- 步骤内容:搭建下图所示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
实验步骤2
- 步骤内容:阅读Hub模块代码,使用 tcpdump 验证Hub模块;
- 首先在pox文件目录下开启终端,输入命令:./pox.py log.level --DEBUG forwarding.hub开启hub模块
- 然后再mininet命令行中输入命令xterm h1 h2 h3开启h1 h2 h3的命令行终端
- 在h2命令行终端输入命令:tcpdump -nn -i h2-eth0开启h2抓包(抓取eth0端口)、h3类似
- 之后就在h1命令行终端中输入相应命令来验证hub模块
执行结果
-
mininet输入命令 h1 ping h2
-
h2 h3抓包结果
-
由上个抓包结果可知,h2对应10.0.02 h3对于10.0.0.3,因此可以直接在h1命令行终端输入ping 10.0.0.3来代替h1 ping h3
-
h2 h3抓包结果
-
无论h1 ping h2还是h3,都可以从h2 h3中抓到数据包,因此验证了hub模块的洪泛转发。
实验步骤3
- 步骤内容:阅读L2_learning模块代码,画出程序流程图,使用 tcpdump 验证Switch模块。
- 流程图如下
- 首先在pox文件目录下开启终端,输入命令:./pox.py log.level --DEBUG forwarding.l2_learning开启switch模块
- 然后再mininet命令行中输入命令xterm h1 h2 h3开启h1 h2 h3的命令行终端
- 在h2命令行终端输入命令:tcpdump -nn -i h2-eth0开启h2抓包(抓取eth0端口)、h3类似
- 之后就在h1命令行终端中输入相应命令来验证switch模块
执行结果
- h1命令行终端输入ping 10.0.0.2
- 抓取h2 h3eth0端口的数据包
- h1命令行终端输入ping 10.0.0.3
- 抓包结果
- 当h1 ping h2时候只有h2有接收到数据包,而当h1 ping h3时候也同样只有h3能接收到数据包,因此验证了switch模块的自学习功能
数据包只会发送给相应的主机
第二部分:进阶实验
实验步骤1
- 步骤内容:重新搭建(一)的拓扑,此时交换机内无流表规则,拓扑内主机互不相通;
- 在mininet命令行中输入命令:dpctl del-flows 删除s1的流表
- 删除流表后,所有主机相互不连通了
实验步骤2
- 步骤内容:编写Python程序自定义一个POX模块SendFlowInSingle3,并且将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通。
- 编写自定义一个POX模块SendFlowInSingle3,并命名为mok.py,并保存到lab5文件夹内
from pox.core import core
import pox.openflow.libopenflow_01 as of
from pox.openflow.of_json import *
from pox.lib.addresses import IPAddr
log = core.getLogger()
class SendFlowInSingle3(object):
def __init__(self):
core.openflow.addListeners(self)
def _handle_ConnectionUp(self, event):
msg = of.ofp_flow_mod()
msg.priority = 1
msg.match.in_port = 1
msg.actions.append(of.ofp_action_output(port=2))
msg.actions.append(of.ofp_action_output(port=3))
event.connection.send(msg)
log.debug("Connection %s" % (event.connection,))
msg = of.ofp_flow_mod()
msg.priority = 1
msg.match.in_port = 2
msg.actions.append(of.ofp_action_output(port=1))
msg.actions.append(of.ofp_action_output(port=3))
event.connection.send(msg)
log.debug("Connection %s" % (event.connection,))
msg = of.ofp_flow_mod()
msg.priority = 1
msg.match.in_port = 3
msg.actions.append(of.ofp_action_output(port=1))
msg.actions.append(of.ofp_action_output(port=2))
event.connection.send(msg)
log.debug("Connection %s" % (event.connection,))
def launch():
core.registerNew(SendFlowInSingle3)
-
在lab5文件目录下打开终端,输入以下命令
-
将lab5中中的mok.py文件复制到pox文件夹内
-
首先在pox文件目录下开启终端,输入命令:./pox.py mok开启mok模块
-
然后再mininet命令行中输入命令xterm h1 h2 h3开启h1 h2 h3的命令行终端
-
在h2命令行终端输入命令:tcpdump -nn -i h2-eth0开启h2抓包(抓取eth0端口)、h3类似
-
之后就在h1命令行终端中输入相应命令来验证mok模块
执行结果
- 对h2 h3的eth0端口进行抓包
- 可知h1与h2 h3再次连通
- 通过pingall可知主机间全部再次连通起来
第三部分:反思与总结
实验难度
- 较难
实验过程遇到的困难及解决方法
- 首先是在进行抓包时候,忘记先用tcpdump -nn -i h?-eth0的命令开启抓包,导致未能出现抓包信息,刚开始以为
是自己前面的命令行输入错误,或者开启hub模块方式不对,结果重试几次还是不行,然后查看了pdf的验证方法,才发现
自己没有输入该命令,有被自己蠢到。 - 其次就是画流程图时候,对于代码的理解十分困难,在此摆烂了,参考了前人的流程图,对照着代码理解了一下。
- 然后就是在清除流表之后,发现pingall了以后主机间还是相互连通,想起了之前的理论知识,流表具有存活性,因此需要
重启一下虚拟机,才能成功。 - 还有就是代码编写完后无法将其直接保存到pox的文件夹内,联想到之前想把jdk-8u301-linux-x64.tar.gz的安装包直接
保存到/usr/local/java目录下也一样不行的问题,仿照上次做法,利用pc命令就成功了。
个人感想
- 通过本次实验,使我对pox的使用有了初步的认识与掌握,对hub模块的洪泛转发功能已经switch模块的自学习功能有了验证性的
认识,相信后面对二者的使用会更加灵活。也初步了体验了主机的命令行终端下抓包的效果,很神奇,对复制文件的命令也更加牢固了
真的很好用。