基于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 ...
随机推荐
- ADAS测试
ADAS测试 1. ADAS和自动驾驶测试 AD和高级驾驶辅助系统(ADAS)正在不断增加新的雷达.摄像头.激光雷达和GNSS传感器,甚至也在改变 ...
- python应用_读取Excel数据列表输出【一】
python能使用xlrd模块实现对Excel数据的读取,且按照想要的输出形式. 1.准备Excel数据如下: 2.下面主要是对Excel数据读取后以双列表(每一行是一个用例为一个列表,再一个个案例组 ...
- 一、部署监控服务器--安装LNMP环境
1.要求: 本案例要求部署-台Zabbix监控服务器, -台被监控主机,为进一步执行具体的监控任务做准备:1.安装LNMP环境2.源码安装Zabbix3.安装监控端主机,修改基本配置4.初始化Zabb ...
- WordPress安装篇(1):使用PHPStudy安装WordPress
我是"小白",既不会编程也不懂CSS能自己搭建网站吗?可以的!只要你会用鼠标,懂打字就能搭建出属于你自己的网站.要怎么样才能做到昵?让我们一起来看看如何实现的吧.在Windows环 ...
- NX二次开发-克隆操作
模板文件: 克隆替换字符串: 1 #include "Text.h" 2 extern DllExport void ufsta(char *param, int *returnC ...
- Mysql 面试题(一网打尽,收藏版)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- Java知识,面试总会问到虚拟机,虚拟机类加载机制你懂吗?
虚拟机把描述类的数据从Class文件文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 与那些在编译时需要进行连接工作的语言不同 ...
- 手把手使用Python进行语音合成,文字转语音
目录 0. 太长不看系列,直接使用 1. Python调用标贝科技语音合成接口,实现文字转语音 1.1 环境准备: 1.2 获取权限 1.2.1 登录 1.2.2 创建新应用 1.2.3 选择服务 1 ...
- DBA入门相关知识介绍
DBA(database administrator):数据库管理员 DBMS(database management system):数据库管理系 ...
- LM-MLC 一种基于完型填空的多标签分类算法
LM-MLC 一种基于完型填空的多标签分类算法 1 前言 本文主要介绍本人在全球人工智能技术创新大赛[赛道一]设计的一种基于完型填空(模板)的多标签分类算法:LM-MLC,该算法拟合能力很强能感知标签 ...