pox 中 openflow.webservice 组建的学习与使用

Openflow的一个简单JSON-RPC-ish web service交互式接口,由of_service信息服务派生而来,依赖于webcore组件。可以使用HTTP POST方式发送JSON进行访问。

目前支持的方法有:

method 介绍 参数
get_flow_stats 获取流表的表项 dpid - 一个字符串形式的dpid,例如:‘00-00-00-00-00-01‘

flows -所有流表的列表

get_switch_desc 获取指定交换机详细信息 dpid - 同上
get_switches 获取交换机列表和基本信息
dpid - 同上

match - 流表的匹配条目 (默认匹配所有)

table_id - 流表的id (默认是所有)

out_port - filter by out port (defaults to all)

set_table 设置指定交换机的流表 None.

在使用pox的过程中 基本只能在./pox.py 后面增加 组建一起运行,而webservice组建提供了一个可以通过web访问交换机和流表的接口,如上所示,只支持4个功能,我会在接下来的过程中进行演示~ 我基本是看的 pox wiki里面的资料然后进行验证 得出的结果,不过wiki中有一点bug,我也做了修正。大家也可以参考 pox wiki的内容~  我用的是curl这个东东 执行上面的方法,这个东东的具体介绍这里就略过了~下面直接说我的运行过程把~

首先,这里用到两个基本的东东  mininet和pox,既然能看本文章的估计也不陌生,所以也不进行讲解,本文章指向写一些,国内网站中难以找到的一些东东。废话不多说~

首先运行 pox 和mininet(我基本都是su root 用root权限运行,比较个人使用,不用考虑什么安全问题),我们使用mininet默认的拓扑,比较只是功能的演示。

进入pox的目录 启动pox和相应的组建,为了验证测试获取信息我们开启了l3_learning组建,这个组建会在ping操作时下发流表:

cd pox                                 
./pox.py openflow.of_01 web.webcore openflow.webservice forwarding.l3_learning

开启mininet:

mn --controller=remote

一般默认的都会连上~并在pox中输出如下信息:

INFO:openflow.of_01:[00-00-00-00-00-01 2] connected

我们先在mininet中进行ping操作让控制器下发流表~

mininet> h1 ping h2

如果能ping通,交换机中就已经有控制器下发的流表了

现在我们就可以通过,curl访问web接口,获取信息了~

我们先获取交换机的流表

curl -i -X POST -d ‘{"method":"get_flow_stats","params":{"dpid":"00-00-00-00-00-01"},"id" : 1}‘ http://127.0.0.1:8000/OF/

这个操作分三个部分,前面的是curl命令,在此不讲,中间一对大括号中,就是我们要请求的数据,我们是以post的形式,请求数据的,最后就是我们要请求数据的网址,pox wiki中 写的网址是 http://127.0.0.1:8000 不过根据我自己的测试网站 应该是上面那个。下面我们来具体说下中间那对大括号里的内容;

一般我们发送表单都是一对一对数据的形式发送的,这种形式在python中称为字典,其他地方可能称为,哈希表,映射之类的东东~现在说说具体参数把,此方法中有三个参数,method,对应4个选项,已经在开头列出来了,params 对应的又是一个字典 ,里面包括一些对应方法的参数,比如例子中的方法,method,他就必须指定 我们所要获取的流表来自那个交换机,而交换机一般由dpid所标识,所以我们输入的参数就是 dpid,因为获取交换机的信息只是简单的操作 所以只有一个参数。在liux终端中执行上面那个命令 就可以获取控制器所连接的交换机的信息,本例子中的输出如下:

{"result": {"flowstats": [{"packet_count": 2, "hard_timeout": 0, "byte_count": 196, "duration_sec": 3, "actions": [{"dl_addr": "be:48:cb:78:60:92", "type": "OFPAT_SET_DL_DST"}, {"max_len": 0, "type": "OFPAT_OUTPUT", "port": 2}], "duration_nsec": 194000000, "priority": 65535, "idle_timeout": 10, "cookie": 0, "table_id": 0, "match": {"dl_type": "IP", "nw_dst": "10.0.0.2/32", "dl_src": "52:9d:f5:2b:88:d4", "nw_proto": 1, "nw_tos": 0, "tp_dst": 0, "tp_src": 8, "dl_dst": "be:48:cb:78:60:92", "dl_vlan": 65535, "nw_src": "10.0.0.1", "in_port": 1}}, {"packet_count": 2, "hard_timeout": 0, "byte_count": 196, "duration_sec": 3, "actions": [{"dl_addr": "52:9d:f5:2b:88:d4", "type": "OFPAT_SET_DL_DST"}, {"max_len": 0, "type": "OFPAT_OUTPUT", "port": 1}], "duration_nsec": 193000000, "priority": 65535, "idle_timeout": 10, "cookie": 0, "table_id": 0, "match": {"dl_type": "IP", "nw_dst": "10.0.0.1/32", "dl_src": "be:48:cb:78:60:92", "nw_proto": 1, "nw_tos": 0, "tp_dst": 0, "tp_src": 0, "dl_dst": "52:9d:f5:2b:88:d4", "dl_vlan": 65535, "nw_src": "10.0.0.2", "in_port": 2}}], "dpid": "00-00-00-00-00-01"}, "id": 1}

如果没自己下发过流表,可能看起来有点艰难,但如果自己下发过流表,基本都能看懂。

获取指定交换机的信息(用 dpid指定不同的交换机):

curl -i -X POST -d ‘{"method":"get_switch_desc","params":{"dpid":"00-00-00-00-00-01"},"id" : 1}‘ http://127.0.0.1:8000/OF/

结果:

{"result": {"switchdesc": {"dp_desc": "None", "sw_desc": "2.3.2", "hw_desc": "Open vSwitch", "serial_num": "None", "mfr_desc": "Nicira, Inc."}, "dpid": "00-00-00-00-00-01"}, "id": 1}

其实什么内容都木有。。。咳咳。。

获取交换机列表和基本信息:

curl -i -X POST -d ‘{"method":"get_switches","id" : 1}‘

结果:

{"result": [{"n_tables": 254, "ports": [{"hw_addr": "9e:0f:91:2d:a0:8e", "name": "s1-eth1", "port_no": 1}, {"hw_addr": "de:d6:d4:55:9e:e0", "name": "s1-eth2", "port_no": 2}, {"hw_addr": "7a:2a:44:cf:ff:4f", "port_down": true, "link_down": true, "name": "s1", "port_no": 65534}], "dpid": "00-00-00-00-00-01"}], "id": 1}

因为只有一个交换机,所以就获得了一组信息~

最后就是下发流表了~

curl -i -X POST -d ‘{"method":"set_table","params":{"dpid":"00-00-00-00-00-01","flows":[{"actions": [{"type":"OFPAT_OUTPUT","port":2}],"match": {"dl_type": "IP","in_port":1 }}]}}‘ http://127.0.0.1:8000/OF/

params 里面除了指定了dpid  还多了一个flow,在python中中括号里面的是列表的形式,也就是可以同时下发好几条流表,同理 actions对应的也是列表的形式,对应多个动作。flows里面就是一条一条的流表了,我们指定了流表的匹配那些信息,首先它得是一个ip数据包,然后必须是从1号端口进来的数据包,我们还指定了它匹配成功后的动作是从2号端口转发~

我们再演示下如何同时下发多条流表:

curl -i -X POST -d ‘{"method":"set_table","params":{"dpid":"00-00-00-00-00-01","flows":[{"actions": [{"type":"OFPAT_OUTPUT","port":2}],"match": {"dl_type": "IP","in_port":1 }},{"actions":[{"type":"OFPAT_OUTPUT","port":"OFPP_ALL"}]}]}}‘ http://127.0.0.1:8000/OF/

我们在flows列表中 又加入了一条~

然后我们在mininet中查看流表,执行以下代码:

mininet> dpctl dump-flows

我们就可以获取以下信息:

*** s1 ------------------------------------------------------------------------
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=203.063s, table=0, n_packets=0, n_bytes=0, idle_age=203, actions=ALL
 cookie=0x0, duration=203.102s, table=0, n_packets=0, n_bytes=0, idle_age=203, ip,in_port=1 actions=output:2

到此 所有的内容就结束了,有可能讲的不够明白,也有可能讲的太罗嗦,又不懂地方,大家可以留言,或者给我发邮件~ 当然,留言 的话我是不知道几个世纪才会 上一次博客,所以最好是 发邮件~

最后还有一个问题,当我match 源ip地址的时候老是出现问题

curl -i -X POST -d ‘{"method":"set_table","params":{"dpid":"00-00-00-00-00-01","flows":[{"actions": [{"type":"OFPAT_OUTPUT","port":2}],"match": {"dl_type": "IP","nw_dst":"192.168.42.0/255.255.255.0" }}]}}‘ http://127.0.0.1:8000/OF/

如果我这样下发 就会出现问题,目前无解。。。别人说他在ovs2.5的版本 和 POX eel 中运行没有错误。。。

时间: 2024-08-28 23:45:10

pox 中 openflow.webservice 组建的学习与使用的相关文章

C++程序中调用WebService的实现

前言 因为最近的项目中需要运用到在MFC程序中调用WebService里面集成好了的函数,所以特意花了一天的时间来研究WebService的构建以及如何在MFC的程序中添加Web引用,进而来实现在C++ MFC中调用那些WebService中写好的函数,中间也是遇到了一些不懂和不解的地方,好在通过度娘上的一些资料和自己的研究逐一的解决了,写这篇文章的主要目的是,第一:让自己记得更清楚,也方便以后不记得了可以及时回想起来.第二:让其他的一些和我碰到一样问题的朋友能更好的解决此问题.内容仅供参考,如

用JAXWS-RI在Tomcat中发布WebService

JDK中已经内置了Webservice发布,不过要用Tomcat等Web服务器发布WebService,还需要用第三方Webservice框架.Axis2和CXF是目前最流行的Webservice框架,这两个框架各有优点,不过都属于重量级框架. JAXWS-RI是JAX WebService参考实现.相对于Axis2和CXF,JAXWS-RI是一个轻量级的框架.虽然是个轻量级框架,JAXWS-RI也提供了在Web服务器中发布Webservice的功能.官网地址https://jax-ws.jav

在java web项目中集成webservice

公司要求在项目中加入webservice服务,因为项目中使用了spring框架,所以在这里使用与spring兼容性较好的cxf来实现 cxf所需jar包 spring的jar包就不贴了 一:创建webservice服务器 1)创建一个服务接口 package com.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface IHelloWorld { public S

NuSOAP简介 php中使用webservice

许多机构已经采用了Apach和PHP作为他们的Web应用环境.在Web services模式中采用PHP可能看上去可能会比较难.但是事实上,搭配NuSoap,你可以轻松的应用PHP构建SOAP的客户端和服务器端. PHP SOAP服务器   用PHP和NuSoap来建立SOAP服务器非常容易.基本上,你只要写出你想要暴露给你的Web services的函数,然后用NuSoap去注册它们就可以了.OK,另外还需要两步才能完成PHP SOAP服务器的建立.首先你还要在你的PHP代码中创建NuSoap

Jboss7.1中部署webservice的问题-1

(1)使用web容器模式在jboss中部署web service 通常会报无法找到相应的类的错误,(这里如果没有web.xml的话就无法部署也不会出现下面错误) Not installing optional component org.jboss.as.quickstarts.wshelloworld.OrderServiceImpl due to exception: java.lang.ClassNotFoundException: org.jboss.as.quickstarts.wsh

SQL Server中的锁的简单学习

原文:SQL Server中的锁的简单学习 简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要

你真的了解JAVA中与Webservice相关的规范和实现吗?

非常多人在项目中使用Webservice,仅仅是知道怎样公布Webservice,怎样调用Webservice,但真要论其来龙去脉,还真不一定清楚. 一切一切还要从我们伟大的sun公司规范说起. JAVA 中共同拥有三种WebService 规范,各自是JAXM&SAAJ.JAX-WS(JAX-RPC).JAX-RS. 以下来分别简要的介绍一下这三个规范.针对JDK 1.6以下版本号,新的还没研究过 (1.)JAX-WS: JAX-WS(Java API For XML-WebService),

java学习中,匿名函数、构造方法、构造代码块、构造方法中调用构造方法(java 学习中的小记录)

java学习中,匿名函数.构造方法.构造代码块.构造方法中调用构造方法(java 学习中的小记录) 作者:王可利(Star·星星) 匿名函数 匿名对象:没有名字的对象 匿名对象使用的注意点: 1.一般不会用匿名对象给属性赋值,无法获取属性值,每次new 都是一个新的对象. 2.匿名对象永远都不可能是一个对象. 如:person new().name = "星星":是不行的 匿名对象的好处:书写简单. 匿名对象使用的场景: 1.如果一个对象调用一个方法一次的时候,就可以用匿名对象来调用.

axis在eclipse 中生成webservice客户端

可以使用axis提供的Java2WSDL功能生成所要发布类的 WSDL,步骤如下: 1.在你的eclipse或myeclipse的项目中找到你引 的 axis.jar包,打开它,在其里面找到 org.apache.axis.wsdl下面的Java2WSDL类,然后以 Java application方式运行一下它 2.打开菜单栏"run -->"Debug  ,在弹出框的左边找到"Java Application 项,在其里面你会看 到"Java2WSDL 子