基础要求
一、拓扑文件
#!/usr/bin/env python
from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call
def myNetwork():
net = Mininet( topo=None,
build=False,
ipBase='192.168.0.0/24')
info( '*** Adding controller\n' )
c0=net.addController(name='c0',
controller=Controller,
protocol='tcp',
port=6633)
info( '*** Add switches\n')
s1 = net.addSwitch('s1', cls=OVSKernelSwitch)
s2 = net.addSwitch('s2', cls=OVSKernelSwitch)
info( '*** Add hosts\n')
h3 = net.addHost('h3', cls=Host, ip='192.168.0.103/24', defaultRoute=None)
h2 = net.addHost('h2', cls=Host, ip='192.168.0.102/24', defaultRoute=None)
h1 = net.addHost('h1', cls=Host, ip='192.168.0.101/24', defaultRoute=None)
h4 = net.addHost('h4', cls=Host, ip='192.168.0.104/24', defaultRoute=None)
info( '*** Add links\n')
net.addLink(h1, s1)
net.addLink(h3, s1)
net.addLink(h2, s2)
net.addLink(h4, s2)
net.addLink(s1, s2)
info( '*** Starting network\n')
net.build()
info( '*** Starting controllers\n')
for controller in net.controllers:
controller.start()
info( '*** Starting switches\n')
net.get('s1').start([c0])
net.get('s2').start([c0])
info( '*** Post configure switches and hosts\n')
CLI(net)
net.stop()
if __name__ == '__main__':
setLogLevel( 'info' )
myNetwork()
二、Wireshark抓包结果和对应的文字说明
1、Hello
控制器6633端口(我最高能支持OpenFlow 1.0) ---> 交换机35392端口
交换机35392端口(我最高能支持OpenFlow 1.5) ---> 控制器6633端口
2、Features Request
控制器6633端口(我需要你的特征信息) ——> 交换机35392端口
3、Set Config
控制器6633端口(请按照我给你的flag和max bytes of packet进行配置) ——> 交换机35392端口
4、Port_Status
当交换机端口发生变化时,告知控制器相应的端口状态
5、Features Reply
交换机端口35392(这是我的特征信息,请查收) ——> 控制器6633端口
6、Packet_In
交换机35392端口(有数据包进来,请指示) ——> 控制器6633端口
7、PACKET_OUT
控制器6633端口(请按照我给你的action进行处理) ---> 交换机35392端口
8、Flow_Mod
分析抓取的flow_mod数据包,控制器通过6633端口向交换机35392端口、交换机35392端口下发流表项,指导数据的转发处理
三、查看抓包结果,分析OpenFlow协议中交换机与控制器的消息交互过程,画出相关交互图或流程图
四、回答问题:交换机与控制器建立通信时是使用TCP协议还是UDP协议?
交换机与控制器建立通信时是使用TCP协议
进阶要求
将抓包基础要求第2步的抓包结果对照OpenFlow源码,了解OpenFlow主要消息类型对应的数据结构定义。
1、HELLO
建立OpenFlow连接
控制器与交换机互相发送Hello消息,双方选取Hello消息中最低版本的协议作为通信协议如果有一方不支持Openflow协议版本,应发送Error消息后断开连接,如果双方Openflow版本可以兼容,则Openflow连接建立成功。
2、Features Request
获取交换机特性信息
控制器向交换机发送Features Request消息查询交换机特性,Features Request消息只包含Openflow Header。
交换机在收到Features Request消息后返回Features Reply消息,Features Reply消息包括Openflow Header 和Features Reply Message。
3、Set Config
4、Port_Status
5、Features Reply
6、Packet_In
当交换机收到一个数据包后,会查找流表,找出与数据包包头相匹配的条目。
如果流表中有匹配条目,则交换机按照流表所指示的action列表处理数据包;有匹配条目但是对应的action是OUTPUT=CONTROLLER时,此时数据包不会被缓存在交换机中。
如果流表中没有匹配条目,则交换机会将数据包封装在Packet-in消息中发送给控制器处理。此时数据包会被缓存在交换机中等待处理。
本次实验中:交换机发现没有匹配的流表(Reason: No matching flow (table-miss flow entry) (0) )
7、Packet_Out
交换机转发数据包
控制器可以使用PacketOut消息,告诉交换机某一个数据包如何处理。
8、Flow_Mod
控制器配置流表
个人总结
在根据文件进行操作的时候发现抓包时没有“openflow_v4”的数据包,切换到“openflow_v6”才找到。在输入pingall命令前忘记打开wireshark抓包,导致最后很多数据没找到,最后才反应过来犯了和上次实验一样的错误。此次实验学习到openflow协议在代码上是如何体现的,更加深入得学习了OpenFlow协议TCP协议,并更熟练得掌握Wireshark的使用方法。通过网络上的对OpenFlow的解析,对OpenFlow源码有一定的了解。总的来说,此次实验并不复杂,但需要认真仔细。
标签:控制器,OpenFlow,端口,实践,交换机,实验,net,数据包 From: https://www.cnblogs.com/hjc13112580/p/16737472.html