SDN第三次上机作业
实验3:OpenFlow协议分析实践
一、搭建拓扑
#!/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(s2, h2)
net.addLink(s1, h3)
net.addLink(s2, h4)
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抓包
hello
Features Request/Set Conig
Port_Status
Features Reply
Packet_in
Flow_mod
Packet_out
三、OpenFlow交换机与控制器的交互过程流程图
使用TCP协议建立通信
四、进阶--OpenFlow主要消息类型对应的数据结构
header
hello
消息没有消息体,仅有of消息头
Features Request
发送一个仅有消息头的OFPT_FEATURES_REQUEST消息
Set Config
flags:分片怎么处理
miss_send_len:不匹配,发给交换机发的数据长度
Port Status
LINK_DOWN:现在没有物理链接
STP_LISTEN:没有learning和relaying的帧
STP_BLOCK:不是生成树的一部分
Reatures Reply
port_no:标明绑定到物理接口的datapath值
hw_addr[OFP_ETH_ALEN]:是该物理接口的mac地址
name[OFP_MAX_PORT_NAME_LEN]:是该接口的名称字符串,以null结尾
config:描述了生成树和管理设置
state:生成树状态和某个物理接口是否存在
datapath_id:dp标示符
n_buffers:最多缓存多少数据报文
n_tables:交换机支持的流表个数
pad[3]:64位对齐
capabilities:功能
actions:标志支持行动的bit串
ports[0]:描绘所有支持of的交换机端
Packet_in
buffer_id:dp标示缓存中的网包
total_len:帧的长度
in_port:帧被交换机接受的入口
reason:发给ctl的原因
Flow_mod
command:如何处理
priority:优先级
buffer_id:标志被OFPT_PACKET_IN消息发出的网包在buffer中的id
out_port:out_port可选的用于进行删除操作时的匹配
Packet_out
buffer_id:跟ofp_packet_in中给出的一致,如果buffer_id是-1,则网包内容被包括在data域中,dp分配
in_port:报文的输入端口
actions_len:行为数组的长度
五、总结
本次的实验大多是截图,遇到的问题较少。
1、抓包时找不到hello,解决方法是需要在打开mininet之前打开wireshark,再在any界面下找寻找两个hello。因为一个是控制器发给交换机的可以检索openflow_v1找到,另一个hello是交换机发给控制器的,我的交换机对应的是openflow_v5检索v1是找不到的。
2、进阶的数据结构分析,本来没太明白怎么去做,看了看ppt也上网查阅了一下资料,大概是把主要消息类型的代码注释看懂理解就可以。
较前几次的作业来说会完成的快一些。