基于Ryu的流量采集代码实现
1 from __future__ import division
2 import time
3 import math
4 import xlwt
5 from ryu.controller import ofp_event
6 from ryu.controller.handler import MAIN_DISPATCHER, DEAD_DISPATCHER
7 from ryu.controller.handler import set_ev_cls
8 from ryu.ofproto import ofproto_v1_3
9 from ryu.lib import hub
10
11 FEATURE = {}
12
13
14 class FlowFeatureExaction(RyuApp):
15
16 OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
17
18 def __init__(self, *args, **kwargs):
19 super(FlowFeatureExaction, self).__init__(*args, **kwargs)
20
21 self.name = 'flow_feature_exaction'
22 self.datapaths = {}
23
24 self.src_to_dst = {}
25 self.flows = []
26 self.flow_feature = {}
27
28 self.monitor_thread = hub.spawn(self._monitor)
29
30 @set_ev_cls(ofp_event.EventOFPStateChange, [MAIN_DISPATCHER, DEAD_DISPATCHER])
31 def _state_change_handler(self, ev):
32 global FEATURE
33 datapath = ev.datapath
34 dpid = datapath.id
35 if ev.state == MAIN_DISPATCHER:
36 if datapath.id not in self.datapaths:
37 self.logger.debug('register datapath: %016x', datapath.id)
38 self.datapaths[datapath.id] = datapath
39 FEATURE.setdefault(dpid, {})
40 FEATURE[dpid].setdefault('flow_feature', {})
41
42 elif ev.state == DEAD_DISPATCHER:
43 if datapath.id in self.datapaths:
44 self.logger.debug('unregister datapath: %016x', datapath.id)
45 del self.datapaths[datapath.id]
46 FEATURE.pop(dpid)
47
48 def _monitor(self):
49 while True:
50 for dp in self.datapaths.values():
51 self.send_flow_stats_request(dp)
52
53 self.flows = []
54 hub.sleep(10)
55 # self.print_feature()
56
57 def send_flow_stats_request(self, datapath):
58 ofproto = datapath.ofproto
59 parser = datapath.ofproto_parser
60 req = parser.OFPFlowStatsRequest(datapath)
61 datapath.send_msg(req)
62
63 @set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
64 def flow_stats_reply_handler(self, ev):
65
66 flow_counter = 0
67 current_time = time.time()
68 dpid = ev.msg.datapath.id
69 self.flow_feature.setdefault(dpid, {})
70 for stat in ev.msg.body:
71 self.flows.append('time=%s datapath=%d table_id=%s '
72 'duration_sec=%d duration_nsec=%d '
73 'priority=%d '
74 'idle_timeout=%d hard_timeout=%d flags=0x%04x '
75 'cookie=%d packet_count=%d byte_count=%d '
76 'match=%s instructions=%s ' %
77 (time.time(), dpid, stat.table_id,
78 stat.duration_sec, stat.duration_nsec,
79 stat.priority,
80 stat.idle_timeout, stat.hard_timeout, stat.flags,
81 stat.cookie, stat.packet_count, stat.byte_count,
82 stat.match, stat.instructions))
83 # flow_no = stat.match['eth_type'] + stat.match['ipv4_src'] + stat.match['in_port'] + stat.match['ipv4_dst']
84 flow_no = flow_counter
85 if (dpid in self.flow_feature) and (flow_no not in self.flow_feature[dpid]):
86 self.flow_feature[dpid].setdefault(flow_no, {})
87 self.flow_feature[dpid][flow_no] = {'datapath': 0, 'duration': 0,'priority': 0,
88 'packet_count': 0, 'byte_count': 0,
89 'ipv4_src': 0, 'ipv4_dst': 0,
90 'in_port': 0,'output': 0,
91 'pkt_rate': 0, 'byte_rate': 0,
92 'pkt_asym': 0, 'byte_asym': 0,
93 'growth_flow_interval': 0, 'switch_flow_count': 0,
94 'mean_bytes_per_pkt': 0, 'time': 0}
95
96 time_interval = current_time-self.flow_feature[dpid][flow_no]['time']
97 pkt_rate = (stat.packet_count-self.flow_feature[dpid][flow_no]['packet_count'])/time_interval
98 byte_rate = (stat.byte_count-self.flow_feature[dpid][flow_no]['byte_count'])/time_interval
99 self.flow_feature[dpid][flow_no] = {'datapath': dpid, 'duration': stat.duration_sec, 'priority': stat.priority,
100 'packet_count': stat.packet_count, 'byte_count': stat.byte_count,
101 'ipv4_src': 0, 'ipv4_dst': 0,
102 'in_port': 0,'output': stat.instructions[0].actions[0].port,
103 'pkt_rate': pkt_rate,'byte_rate': byte_rate,
104 'pkt_asym': 0, 'byte_asym': 0,
105 'growth_flow_interval': 0, 'switch_flow_count': 0,
106 'mean_bytes_per_pkt': 0, 'time': current_time}
107
108 for key, value in stat.match.items():
109 self.flow_feature[dpid][flow_no][key] = value
110
111 if pkt_rate != 0:
112 self.flow_feature[dpid][flow_no]['mean_bytes_per_pkt'] = byte_rate/pkt_rate
113
114 if self.flow_feature[dpid][flow_no]['ipv4_src'] != 0:
115 src = self.flow_feature[dpid][flow_no]['ipv4_src']
116 dst = self.flow_feature[dpid][flow_no]['ipv4_dst']
117 self.src_to_dst.setdefault(src, {})
118 self.src_to_dst[src].setdefault(dst, {})
119 self.src_to_dst[src][dst] = {'pkt_count': stat.packet_count, 'byte_count': stat.byte_count,}
120 flow_counter += 1
121
122 for flow_no in self.flow_feature[dpid].keys():
123 self.flow_feature[dpid][flow_no]['growth_flow_interval'] = \
124 flow_counter - self.flow_feature[dpid][flow_no]['switch_flow_count']
125 self.flow_feature[dpid][flow_no]['switch_flow_count'] = flow_counter
126 if 'ipv4_src' in self.flow_feature[dpid][flow_no].keys():
127 for src in self.src_to_dst.keys():
128 if src == self.flow_feature[dpid][flow_no]['ipv4_dst']:
129 for dst in self.src_to_dst[src].keys():
130 if dst == self.flow_feature[dpid][flow_no]['ipv4_src']:
131 self.flow_feature[dpid][flow_no]['pkt_asym'] = \
132 self.src_to_dst[src][dst]['pkt_count']/(1+self.flow_feature[dpid][flow_no]['packet_count'])
133 self.flow_feature[dpid][flow_no]['bytes_asym'] = \
134 self.src_to_dst[src][dst]['byte_count'] / (1+self.flow_feature[dpid][flow_no]['byte_count'])
135 global FEATURE
136 FEATURE[dpid]['flow_feature'] = self.flow_feature[dpid]
137
138 # data = open("switch_flows", mode='w+')
139 # for flow in self.flows:
140 # data.write(str(flow) + '\n')
141 # data.close()
142
143 data = open("feature", 'w')
144 for dpid in FEATURE.keys():
145 data.write('DatapathId ' + str(dpid) + ':{')
146 for feature_type in FEATURE[dpid].keys():
147 data.write('\n '+str(feature_type)+':')
148 data.write(str(FEATURE[dpid][feature_type]) + '}\n')
149 data.write('\n')
150 data.close()
151
152 # workbook = xlwt.Workbook(encoding='utf-8')
153 # worksheet = workbook.add_sheet('Flow Feature')
154 # worksheet.write()
155 # workbook.save('flow_feature.xls')
156 pass
基于Ryu的流量采集代码实现的更多相关文章
- 基于Ryu的服务器实现及相关请求访问处理
基于Ryu的服务器实现及相关请求访问处理 前言及问题描述 近期又遇到了一个非常棘手的问题,由于Ryu是通过Python语言开发的,通过Ryu的wsgi的方式建立服务器,无法解析PHP,通过多次方法解决 ...
- 基于RYU的拓扑发现
基于RYU的拓扑发现 前言 本次实验是一个基于RYU的拓扑发现功能.参考了呈神的实现方式,并加了一些自己实现方式,做了一些数据结构的改动. 数据结构 link_to_port 字典 有两种关系: 一是 ...
- jQuery基于ajax实现星星评论代码
本文实例讲述了jQuery基于ajax实现星星评论代码.分享给大家供大家参考.具体如下: 这里使用jquery模仿点评网的星星评论功能,Ajax评论模块,鼠标点击星星即可评价,下边是分数,可以点击后给 ...
- 基于eclipse的mybatis映射代码自动生成的插件
基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...
- 基于eclipse的mybatis映射代码自动生成的插件http://blog.csdn.net/fu9958/article/details/7521681
基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...
- UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现
UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import ...
- UserView--第一种方式set去重,基于Spark算子的java代码实现
UserView--第一种方式set去重,基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import java.util.Ha ...
- 搭建基于SornaQube的自动化安全代码检测平台
一.背景和目的 近年来,随着新业务.新技术的快速发展,应用软件安全缺陷层出不穷.虽然一般情况下,开发者基本都会有单元测试.每日构建.功能测试等环节来保证应用的可用性.但在安全缺陷方面,缺乏安全意识.技 ...
- 基于jQuery+HTML5加入购物车代码
基于jQuery+HTML5加入购物车代码.这是一款基于jquery+html5实现的支持累加计价的网站购物车代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div ...
随机推荐
- Sqlflow 之隐私政策(Privacy plolicy)介绍
在大数据技术流行的今天,SQLFlow 可以通过分析各种数据库对象的定义给开发和管理者带来很大的助力.能够让您在大数据时代应对自如,如虎添翼. 在之前的文章中我们已经详细介绍过SQLFlow是什么.能 ...
- GO语言异常处理03---自定义异常
package main import ( "fmt" "time" ) /* type error interface { Error() string } ...
- jupyter notebook快捷键使用的注意点
来源:https://zhidao.baidu.com/question/1800695798976401387.html 本文做进一步的阐释: 1.使行出现,但是光标要点击到有line空白区域 直接 ...
- js中reduce用法详解
介绍reduce reduce() 方法接收一个函数作为累加器,reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(上一次回调的返回值),当 ...
- TensorFlow用法
TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...
- 中继TensorRT集成
中继TensorRT集成 介绍 NVIDIA TensorRT是用于优化深度学习推理的库.这种集成将使尽可能多的算子从Relay转移到TensorRT,从而无需调整调度,即可在NVIDIA GPU上提 ...
- Hadoop 数据迁移用法详解
数据迁移使用场景 冷热集群数据分类存储,详见上述描述. 集群数据整体搬迁.当公司的业务迅速的发展,导致当前的服务器数量资源出现临时紧张的时候,为了更高效的利用资源,会将原A机房数据整体迁移到B机房的, ...
- C#搞跨平台UI,封装Cef作为Cpf的控件支持Windows,Linux,Mac
终于封装完成了,采用离屏渲染方式,支持JS和C#互相调用,C#方法自动绑定到JS里,中文输入有自动调整输入法位置. 基于开源的CefGlue 移植,本来想用CefSharp,不过这个里面有很多C++的 ...
- DHCP:IP 并非与生俱来
初识 DHCP 众所周知,因特网上的每台设备都规定了其全世界唯一的地址,也就是说 "IP 地址",正是由于有了 IP 地址,才保证了用户在连网的计算机上操作时,能够高效而且方便地从 ...
- [apue] linux 文件访问权限那些事儿
前言 说到 linux 上的文件权限,其实我们在说两个实体,一是文件,二是进程.一个进程能不能访问一个文件,其实由三部分内容决定: 文件的所有者.所在的组: 文件对所有者.组用户.其它用户设置的权限访 ...