实验拓扑:
目的:(1)自定义构建以上拓扑
(2)实现h1,h2能通信,h3,h4不能通信,h1,h2与h3,h4之间能相互通信
基本操作这里就不仔细介绍了,可以参考之前的两篇文。
1.构建拓扑,用Python实现以上自定义拓扑
代码:
[python] view plain copy from mininet.topo import Topo, Node class MyTopo( Topo ): "Simple topology example." def __init__( self, enable_all = True ): "Create custom topo." # Add default members to class. super( MyTopo, self ).__init__() # Set Node IDs for hosts and switches leftHost1 = 1 leftHost2 = 2 leftSwitch = 3 rightSwitch = 4 rightHost1 = 5 rightHost2 = 6 # Add nodes self.add_node( leftSwitch, Node( is_switch=True ) ) self.add_node( rightSwitch, Node( is_switch=True ) ) self.add_node( leftHost1, Node( is_switch=False ) ) self.add_node( leftHost2, Node( is_switch=False ) ) self.add_node( rightHost1, Node( is_switch=False ) ) self.add_node( rightHost2, Node( is_switch=False ) ) # Add edges self.add_edge( leftHost1, leftSwitch ) self.add_edge( leftHost2, leftSwitch ) self.add_edge( leftSwitch, rightSwitch ) self.add_edge( rightSwitch, rightHost1 ) self.add_edge( rightSwitch, rightHost2 ) # Consider all switches and hosts 'on' self.enable_all() topos = { 'mytopo': ( lambda: MyTopo() ) } 2.在floodlight的web页面点击host如下图
可以看到链接交换机03的host端口号为1,2,那么可以推断04交换机链接到03交换机的3端口。同样链接交换机04的host端口号为2,3,那么可以推断03交换机链接到04交换机的1端口(写流表就是根据这些信息来的)。
3.此时使用pingall,得到相互ping不通,(在删除.property文件中的Forwarding则默认相互不通,参考上一篇文)如下图
4.写流表
python代码:
[python] view plain copy import httplib import json class StaticFlowPusher(object): def __init__(self, server): self.server = server def get(self, data): ret = self.rest_call({}, 'GET') return json.loads(ret[2]) def set(self, data): ret = self.rest_call(data, 'POST') return ret[0] == 200 def remove(self, objtype, data): ret = self.rest_call(data, 'DELETE') return ret[0] == 200 def rest_call(self, data, action): path = '/wm/staticflowentrypusher/json' headers = { 'Content-type': 'application/json', 'Accept': 'application/json', } body = json.dumps(data) conn = httplib.HTTPConnection(self.server, 8080) conn.request(action, path, body, headers) response = conn.getresponse() ret = (response.status, response.reason, response.read()) print ret conn.close() return ret pusher = StaticFlowPusher('192.168.131.129') flow1 = { 'switch':"00:00:00:00:00:00:00:03", "name":"flow-mod-1", "cookie":"0", "priority":"32768", "ingress-port":"1", "active":"true", "actions":"output=flood" } flow2 = { 'switch':"00:00:00:00:00:00:00:03", "name":"flow-mod-2", "cookie":"0", "priority":"32768", "ingress-port":"2", "active":"true", "actions":"output=flood" } flow3 = { 'switch':"00:00:00:00:00:00:00:03", "name":"flow-mod-3", "cookie":"0", "priority":"32768", "ingress-port":"3", "active":"true", "actions":"output=flood" } flow4 = { 'switch':"00:00:00:00:00:00:00:04", "name":"flow-mod-4", "cookie":"0", "priority":"32768", "ingress-port":"2", "active":"true", "actions":"output=1" } flow5 = { 'switch':"00:00:00:00:00:00:00:04", "name":"flow-mod-5", "cookie":"0", "priority":"32768", "ingress-port":"3", "active":"true", "actions":"output=1" } flow6 = { 'switch':"00:00:00:00:00:00:00:04", "name":"flow-mod-6", "cookie":"0", "priority":"32768", "ingress-port":"1", "active":"true", "actions":"output=flood" } pusher.set(flow1) pusher.set(flow2) pusher.set(flow3) pusher.set(flow4) pusher.set(flow5) pusher.set(flow6)
如下图达到实验目的:
