拓扑
#!/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')
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(s2, h4)
net.addLink(s1, s2)
net.addLink(h3, s1)
net.addLink(h2, 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()
交互图
首先交换机和控制器互相发送Hello,建立连接。控制器6633端口发送Features Request请求特征信息,SET_CONFIG给出flag和max bytes of packet。交换机feature reply回答特征信息,当交换机端口发生变化时,发送Port_Status告知控制器相应的端口状态。当交换机查找流表,发现没有匹配条目,或有匹配条目但是对应的action是OUTPUT=CONTROLLER时,交换机发送Packet_in;控制器接着Packet_out回答。控制器通过Flow_mod向交换机端口下发流表。
问题
交换机与控制器建立通信时使用TCP协议
抓包截图
OFPT_HELLO
对照源码
REQUEST
set config
源码对照
features reply
源码对照
status
源码对照
packet in
源码对照
packet out
源码对照
flowmod
源码对照
个人总结
本次实验分析openflow协议中交换机与控制器的消息交互过程,双方先发送OFPT_HELLO建立连接,并确定使用的openflow的版本。随后控制器OFPT_FEATURES_REQUEST请求交换机特征信息,OFPT_SET_CONFIG给出flag和max bytes of packet进行配置。交换机OFPT_FEATURES_REPLY回答特征信息。当交换机端口变化时发送OFPT_PORT_STATUS告知控制器对应的端口状态。当交换机查找流表发现没有匹配条目时,发送OFPT_PACKET_IN,控制器OFPT_PACKET_OUT回答处理方式。
问题:
- 在抓包的时候,要先启动wireshark,在建立拓扑,这样抓取的数据才完整。
- 过滤抓包数据的时候,是选择openflow_v1、和openflow_v6来过滤出openflow 1.0和1.5的数据。其中只有两次hello用了openflow1.5