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的流量采集代码实现的更多相关文章

  1. 基于Ryu的服务器实现及相关请求访问处理

    基于Ryu的服务器实现及相关请求访问处理 前言及问题描述 近期又遇到了一个非常棘手的问题,由于Ryu是通过Python语言开发的,通过Ryu的wsgi的方式建立服务器,无法解析PHP,通过多次方法解决 ...

  2. 基于RYU的拓扑发现

    基于RYU的拓扑发现 前言 本次实验是一个基于RYU的拓扑发现功能.参考了呈神的实现方式,并加了一些自己实现方式,做了一些数据结构的改动. 数据结构 link_to_port 字典 有两种关系: 一是 ...

  3. jQuery基于ajax实现星星评论代码

    本文实例讲述了jQuery基于ajax实现星星评论代码.分享给大家供大家参考.具体如下: 这里使用jquery模仿点评网的星星评论功能,Ajax评论模块,鼠标点击星星即可评价,下边是分数,可以点击后给 ...

  4. 基于eclipse的mybatis映射代码自动生成的插件

    基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...

  5. 基于eclipse的mybatis映射代码自动生成的插件http://blog.csdn.net/fu9958/article/details/7521681

    基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...

  6. UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现

      UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现   测试数据 java代码 package com.hzf.spark.study; import ...

  7. UserView--第一种方式set去重,基于Spark算子的java代码实现

    UserView--第一种方式set去重,基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import java.util.Ha ...

  8. 搭建基于SornaQube的自动化安全代码检测平台

    一.背景和目的 近年来,随着新业务.新技术的快速发展,应用软件安全缺陷层出不穷.虽然一般情况下,开发者基本都会有单元测试.每日构建.功能测试等环节来保证应用的可用性.但在安全缺陷方面,缺乏安全意识.技 ...

  9. 基于jQuery+HTML5加入购物车代码

    基于jQuery+HTML5加入购物车代码.这是一款基于jquery+html5实现的支持累加计价的网站购物车代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div ...

随机推荐

  1. 解决Error running 'Tomcat 9': Address localhost:8080 is already in use的问题

    在我学习servlet的过程中遇到了tomacat端口8080被占用的情况,所以记录下来,毕竟以后还会碰见这种貌似情况 第一步,打开命令行界面,可快捷键window+R打开输入cmd进入 输入代码:n ...

  2. Resnet-50网络结构详解

    解决的问题: 由于梯度消失,深层网络很难训练.因为梯度反向传播到前面的层,重复相乘可能使梯度无穷小.结果就是,随着网络的层数更深,其性能趋于饱和,甚至迅速下降. 核心思想: 引入一个恒等快捷键(也称之 ...

  3. vmware workstation linux虚拟机点击suspend会卡死

    vmware workstation linux虚拟机点击suspend会卡死, 现象如图, 我测过很多发行版都有这个问题 临时解决方案是关闭suspend功能 sudo systemctl mask ...

  4. YOLO、SSD、FPN、Mask-RCNN检测模型对比

    YOLO.SSD.FPN.Mask-RCNN检测模型对比 一.YOLO(you only look once) YOLO 属于回归系列的目标检测方法,与滑窗和后续区域划分的检测方法不同,他把检测任务当 ...

  5. MindSpore基准性能

    MindSpore基准性能 本文介绍MindSpore的基准性能.MindSpore网络定义可参考Model Zoo. 训练性能 ResNet 以上数据基于华为云AI开发平台ModelArts测试获得 ...

  6. NVIDIA GPU卷积网络的自动调谐

    NVIDIA GPU卷积网络的自动调谐 针对特定设备和工作负载的自动调整对于获得最佳性能至关重要.这是关于如何为NVIDIA GPU调整整个卷积网络. NVIDIA GPU在TVM中的操作实现是以模板 ...

  7. python赋值,深拷贝和浅拷贝的区别

    1.赋值 list1=[[1,2],'fei',66] list2=list1 list1 [[1, 2], 'fei', 66] list2 [[1, 2], 'fei', 66] list2.ap ...

  8. Ajax(内含json)认识

    Ajax 认识 一.概念 1.Ajax 即"Asynchronous Javascript And XML"(英[eɪˈsɪŋkrənəs]异步 JavaScript 和 XML) ...

  9. 源码学习之void 0

    今天看源码的时候看到 void 0 这样的写法,平时在业务代码里基本没有这样的写法,于是学习了一下. 在控制台运行了一下void 0,得到返回值是undefined. 在MDN上搜了一下void,了解 ...

  10. 『无为则无心』Python基础 — 7、Python的变量

    目录 1.变量的定义 2.Python变量说明 3.Python中定义变量 (1)定义语法 (2)标识符定义规则 (3)内置关键字 (4)标识符命名习惯 4.使用变量 1.变量的定义 程序中,数据都是 ...