实验3:OpenFlow协议分析实践
(一)基本要求
1、拓扑文件
#!/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='10.0.0.0/8')
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')
h1 = net.addHost('h1', cls=Host, ip='192.168.0.101/24', defaultRoute=None)
h2 = net.addHost('h2', cls=Host, ip='192.168.0.102/24', defaultRoute=None)
h3 = net.addHost('h3', cls=Host, ip='192.168.0.103/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(s1, h2)
net.addLink(s2, s1)
net.addLink(s2, h3)
net.addLink(s2, h4)
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()
2、wireshark抓包的结果截图
- OFPT_HELLO
从控制器6633端口到交换机47928端口,使用OpenFlow1.0协议:
从控制器47928端口到交换机6633端口,使用OpenFlow1.5协议:
-
OFPT_FEATURES_REQUEST
控制器6633端口(我需要你的特征信息) ---> 交换机47928端口
-
Set Conig
控制器6633端口(请按照我给你的flag和max bytes of packet进行配置) ---> 交换机47928端口
-
PORT_STATUS
当交换机端口发生变化时,告知控制器相应的端口状态
-
Features Reply
交换机47928端口(这是我的特征信息,请查收) ---> 控制器6633端口
-
PACKET_IN
交换机47928端口(有数据包进来,请指示)--->控制器6633端口
-
Packet_out
控制器6633端口(请按照我给你的action进行处理) ---> 交换机47928端口
-
FLOW_MOD
分析抓取的flow_mod数据包,控制器通过6633端口向交换机47928端口、交换机47928端口下发流表项,指导数据的转发处理
-
画出相关交互图或流程图
3、回答问题:交换机与控制器建立通信时是使用TCP协议还是UDP协议?
答:使用的是TCP协议。
(二)进阶要求
将抓包基础要求第2步的抓包结果对照OpenFlow源码,了解OpenFlow主要消息类型对应的数据结构定义。
通用字段
① HELLO源码与对应抓包结果
②FEATURES_REQUEST源码与对应抓包结果
结构与HELLO一致。
③Set Config源码与对应抓包结果
④PORT_STATUS源码与对应抓包结果
⑤FEATURES_REPLY源码与对应抓包结果
⑥PACKET_IN源码与对应抓包结果
⑦PACKET_OUT源码与对应抓包结果
⑧FLOW_MOD源码与对应抓包结果
(三)个人总结
- 本次实验较之前的实验来说难度不大,只是有些繁琐,需要不停地找到我们需要的数据,是验证性的实验。只要实验步骤正确,一般是可以得到正确的结果的,这也要求我们在实验过程中要仔细认真。
- 在上次实验中,我们已经能够运用wireshark对OpenFlow协议数据交互过程进行抓包,但当时也只是尝试了一下,没有深入了解抓取到的内容。而在本次实验中,我们学习了利用过滤器对抓取的数据包并用过滤方法来找到所需要的数据包。同时在抓包结果与openflow头文件源码对照学习中更深入地了解openflow主要消息类型对应的数据结构定义和OpenFlow协议的数据包交互过程的机制。
- 本次实验中FLOW_MOD较为难找,但在命令框里的CLI中执行pingall命令后,就可以在wireshark抓包工具中找到FLOW_MOD的数据包了。