1.基础要求
a)使用 tcpdump 验证Hub模块,h1 ping h2、h2和h3的tcpdump抓包结果截图
b)使用 tcpdump 验证Switch模块,h1 ping h2、h2和h3的tcpdump抓包结果截图
c)L2_learning模块代码流程图
2.进阶要求
a)相关代码
- 编写Python程序自定义一个POX模块SendFlowInSingle3,并且将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通。
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):
#设置数据包从端口1进,从端口2和端口3出
msg = of.ofp_flow_mod() # 使用ofp_flow_mod()的方法向交换机来下发流表
msg.priority = 1 #设置msg的优先级
msg.match.in_port = 1 #设置在端口1接收数据包
msg.actions.append(of.ofp_action_output(port=2)) #增加转发向端口2的动作
msg.actions.append(of.ofp_action_output(port=3)) #增加转发向端口3的动作
event.connection.send(msg) #通过send函数向交换机发送所设定的消息
log.debug("Connection %s" % (event.connection,))
#设置数据包从端口2进,从端口1和端口3出
msg = of.ofp_flow_mod() # 使用ofp_flow_mod()的方法向交换机下发流表
msg.priority = 1 #设置msg的优先级
msg.match.in_port = 2 #设置数据包从端口2进入
msg.actions.append(of.ofp_action_output(port=1)) #增加转发向端口1的动作
msg.actions.append(of.ofp_action_output(port=3)) #增加转发向端口3的动作
event.connection.send(msg)#通过send函数向交换机发送所设定的消息
log.debug("Connection %s" % (event.connection,))
#设置数据包从端口3进,从端口1和端口2出
msg = of.ofp_flow_mod()# 使用ofp_flow_mod()的方法向交换机下发流表
msg.priority = 1 #设置msg的优先级
msg.match.in_port = 3 #设置使数据包进入端口3
msg.actions.append(of.ofp_action_output(port=1)) #增加转发向端口1的动作
msg.actions.append(of.ofp_action_output(port=2)) #增加转发向端口2的动作
event.connection.send(msg)#通过send函数向交换机发送所设定的消息
log.debug("Connection %s" % (event.connection,))
def launch():
core.registerNew(SendFlowInSingle3) #注册SendFlowInSingle3的组件
b)运行结果
- 重新搭建(一)的拓扑,此时交换机内无流表规则,拓扑内主机互不相通
- 编写Python程序自定义一个POX模块SendFlowInSingle3,并且将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通。
c)ovs-ofctl交换机流表项截图
3.个人总结
a)实验感想
通过本次实验能够理解pox控制器的工作原理,根据老师提供的资料验证了pox的forwarding.hub和forwarding.l2_learning模块,初步掌握了pox控制器的使用方法。并且能运用pox控制器编写自定义网络应用程序,进一步熟悉了pox控制器是如何进行流表的下发。在对比hub模块和switch模块中,学到了switch模块的功能是让Openflow交换机实现L2自学习,可见交换机对数据包进行了学习,实现了从相应的端口发出,只有目的主机可以抓取到报文。而hub模块是在每个交换机上安装泛洪通配符规则,将数据包以广播形式转发,此时交换机等效于集线器。
b)关键步骤记录 - 拓扑的生成
- 进入pox文件目录,开启pox终端
*开启h1 h2 h3各自的命令行终端
- 在h2和h3使用开启抓包(抓取eth0端口)
- 停止hub模块,运行 forwarding 文件夹下的 l2_learning 模块,依旧以 DEBUG 模式运行(这里我是退出了上个拓扑,重新建了一个拓扑,随后与之前步骤相似,打开h1 h2 h3各自的命令行终端,在h2和h3使用开启抓包(抓取eth0端口),再在h1的命令行终端ping10.0.0.2)
- 进阶部分的“重新搭建(一)的拓扑,此时交换机内无流表规则,拓扑内主机互不相通”,记得关掉pox控制器(ctrl+c)然后重新创建拓扑,mininet命令行中输入:dpctl del-flows 得以删除s1的流表
- 进阶部分的“编写Python程序自定义一个POX模块SendFlowInSingle3,并且将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通。”,在lab5目录下编写完代码后记得将其.py文件复制到pox文件夹中
- 在pox文件目录下开启pox终端,进入POX模块SendFlowInSingle3