该死SDN用的是Python,只能重新开始学。
自己构建的第一个mininet的拓扑:
from mininet.net import Mininet
from mininet.node import OVSSwitch, Controller, RemoteController
from mininet.topolib import TreeTopo
from mininet.log import setLogLevel
from mininet.cli import CLI
setLogLevel( 'info' )
# Two local and one "external" controller (which is actually c0)
# Ignore the warning message that the remote isn't (yet) running
c0 = Controller( 'c0', port=6633 )
c1 = Controller( 'c1', port=6634 )
c2 = RemoteController( 'c2', ip='127.0.0.1', port=6633 )
cmap = { 's1': c0, 's2': c1, 's3': c2 }
class MultiSwitch( OVSSwitch ):
"Custom Switch() subclass that connects to different controllers"
def start( self, controllers ):
return OVSSwitch.start( self, [ cmap[ self.name ] ] )
topo = TreeTopo( depth=2, fanout=2 )
net = Mininet( topo=topo, switch=MultiSwitch, build=False, waitConnected=True )
for c in [ c0, c1 ]:
net.addController(c)
net.build()
net.start()
CLI( net )
net.stop()
读了一段ryu的应用。
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_0
class SimpleSwitch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]
def __init__(self, *args, **kwargs):
super(SimpleSwitch, self).__init__(*args, **kwargs)
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def _packet_in_handler(self, ev):
msg = ev.msg
datapath = msg.datapath
ofproto = datapath.ofproto
actions = [datapath.ofproto_parser.OFPActionOutput(ofproto.OFPP_FLOOD)]
out = datapath.ofproto_parser.OFPPacketOut(
datapath=datapath, buffer_id=msg.buffer_id, in_port=msg.in_port,
actions=actions, data=None)
datapath.send_msg(out)
P4是一种抽象 完全符合网络中透明性的定义。只需要管任务完成,而不需要管理底下硬件的实施。和传统的Open Flow进行比较,是一种通用的API而不需要进行不断的拓展,编译器会将P4程序映射到目标交换机之中。
P4是允许定义新的报头的,相较于openflow的解析器来说(而且只能先匹配才能采取动作)。
报头之间还有一定的顺序关系,所以有一个依赖关系图,关乎到解析编译。
在最高层,程序员使 用表示控制流的命令语言来表达分组处理程序(P4); 下面, 编译器将 P4 表示转换为 TDG,以方便依赖性分析,
P4最关键的组件就是,标题、解析器、表、行动(简单的协议无关原语)、还有就是控制程序(控制程序是确定应用于数据包的匹配和+控制表的顺序)
有关P4交换机pipeline的问题
有关的参考文献
P4交换机将流水线处理数据的过程进行抽象和重定义,数据处理单元对数据的处理抽象成匹配和执行匹配-动作表的过程,包头的解析抽象成P4中的解析器,数据处理流程抽象成流控制。
首先P4交换机的专用物理芯片Tofino
多级流水线。经解析器解析后的数据包头部会经过多级匹配—动作表,这些匹配—动作表可以顺序、并行或者两者结合的方式执行,以流水线的形式组织起来,分为入口流水线和出口流水线。入口流水线用于确定数据包的输出端口和队列(在入流水线中数据包可能会被转发、复制、丢弃或触发流量控制,),出口流水线则负责修改数据包头部的信息(并送到相应的出端口)。从逻辑上看,P4的多级流水线是由一系列匹配—动作表(match-action table)组成的一个有向无环图。加载P4程序的底层平台对数据包的处理过程严格按照有向无环图的逻辑进行。综述
这两个流水阶段都是可编程的。Ingress/Egress每个阶段都可被划分成三个可编程模块:parser、ingress/egress、deparser。P4程序也基本是针对这六个模块进行编程的。每个报文经过这些处理单元时候,始终都有一块内存用于存放metadata数据,缓存中间处理数据和结果,这些meta信息可以是action的输出结果,也可以是下一个table里match的输入。知乎
缓冲区。缓冲区用来缓存载荷与交换机队列中等待被匹配动作表处理的已解析的头部.
综合以上抽象出来就是:
已经又的基于p4所开发的应用
难怪p4不需要packet-in,out,在交换机匹配表的阶段就已经解决掉了这个问题。