本文已参与「新人创作礼」活动,一起开启掘金创作之路。
方法一
graph TD;
虚拟机搭建拓扑-->配置成为OVS交换机-->某个虚拟机安装ryu作为控制器-->使用命令将tyu指定为OVS所用的控制器;
相当于将Ubuntu作为ovs的交换机了,好处:更加模拟现实环境,直接用linux系统。可能存在的问题:这个拓扑在清零的时候可能会有问题,比如arp表清除等(不能做到像mininet仿真的时候每次运行拓扑就从零开始。)
RYU官方文档(其中有对模拟arp的介绍,并且可以查看guide1.dox)
方法二
使用mininet搭建整个拓扑,ryu也是直接作为这个拓扑网络的控制器
优点:方便调试、更新,使用wireshark抓包,ping和tcpdump进行流量创建(这一点方法一也可以做到)
缺点:都是在一个虚拟机上进行的,互联互通有可能成为问题
正式开始
ryu源码分析之packet类
逐级封装:
e = ethernet.ethernet(dst='ff:ff:ff:ff:ff:ff',
src='08:60:6e:7f:74:e7',
ethertype=ether.ETH_TYPE_ARP)
a = arp.arp(hwtype=1, proto=0x0800, hlen=6, plen=4, opcode=2,
src_mac='08:60:6e:7f:74:e7', src_ip='192.0.2.1',
dst_mac='00:00:00:00:00:00', dst_ip='192.0.2.2')
p = packet.Packet()
p.add_protocol(e)
p.add_protocol(a)
添加action事件下发包
actions = [parser.OFPActionOutput(port=port)]
out =parser.OFPPacketOut(datapath=datapath,buffer_id=ofproto.OFP_NO_BUFFER,in_port=ofproto.OFPP_CONTROLLER,actions=actions,data=data)
datapath.send_msg(out)
跨网段通信所需
pkt = packet.Packet(msg.data)
eth = pkt.get_protocols(ethernet.ethernet)[0]
arp_pkt = pkt.get_protocol(arp.arp)
if eth:
eth_dst = eth.dst
eth_src = eth.src
其实昨天所做的就是成功实现了虚拟地址10.1.1.77的ping回复,只不过debug花了很长时间,今天继续实现其它功能。