1. 1 from __future__ import division
  2. 2 import time
  3. 3 import math
  4. 4 import xlwt
  5. 5 from ryu.controller import ofp_event
  6. 6 from ryu.controller.handler import MAIN_DISPATCHER, DEAD_DISPATCHER
  7. 7 from ryu.controller.handler import set_ev_cls
  8. 8 from ryu.ofproto import ofproto_v1_3
  9. 9 from ryu.lib import hub
  10. 10
  11. 11 FEATURE = {}
  12. 12
  13. 13
  14. 14 class FlowFeatureExaction(RyuApp):
  15. 15
  16. 16 OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
  17. 17
  18. 18 def __init__(self, *args, **kwargs):
  19. 19 super(FlowFeatureExaction, self).__init__(*args, **kwargs)
  20. 20
  21. 21 self.name = 'flow_feature_exaction'
  22. 22 self.datapaths = {}
  23. 23
  24. 24 self.src_to_dst = {}
  25. 25 self.flows = []
  26. 26 self.flow_feature = {}
  27. 27
  28. 28 self.monitor_thread = hub.spawn(self._monitor)
  29. 29
  30. 30 @set_ev_cls(ofp_event.EventOFPStateChange, [MAIN_DISPATCHER, DEAD_DISPATCHER])
  31. 31 def _state_change_handler(self, ev):
  32. 32 global FEATURE
  33. 33 datapath = ev.datapath
  34. 34 dpid = datapath.id
  35. 35 if ev.state == MAIN_DISPATCHER:
  36. 36 if datapath.id not in self.datapaths:
  37. 37 self.logger.debug('register datapath: %016x', datapath.id)
  38. 38 self.datapaths[datapath.id] = datapath
  39. 39 FEATURE.setdefault(dpid, {})
  40. 40 FEATURE[dpid].setdefault('flow_feature', {})
  41. 41
  42. 42 elif ev.state == DEAD_DISPATCHER:
  43. 43 if datapath.id in self.datapaths:
  44. 44 self.logger.debug('unregister datapath: %016x', datapath.id)
  45. 45 del self.datapaths[datapath.id]
  46. 46 FEATURE.pop(dpid)
  47. 47
  48. 48 def _monitor(self):
  49. 49 while True:
  50. 50 for dp in self.datapaths.values():
  51. 51 self.send_flow_stats_request(dp)
  52. 52
  53. 53 self.flows = []
  54. 54 hub.sleep(10)
  55. 55 # self.print_feature()
  56. 56
  57. 57 def send_flow_stats_request(self, datapath):
  58. 58 ofproto = datapath.ofproto
  59. 59 parser = datapath.ofproto_parser
  60. 60 req = parser.OFPFlowStatsRequest(datapath)
  61. 61 datapath.send_msg(req)
  62. 62
  63. 63 @set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
  64. 64 def flow_stats_reply_handler(self, ev):
  65. 65
  66. 66 flow_counter = 0
  67. 67 current_time = time.time()
  68. 68 dpid = ev.msg.datapath.id
  69. 69 self.flow_feature.setdefault(dpid, {})
  70. 70 for stat in ev.msg.body:
  71. 71 self.flows.append('time=%s datapath=%d table_id=%s '
  72. 72 'duration_sec=%d duration_nsec=%d '
  73. 73 'priority=%d '
  74. 74 'idle_timeout=%d hard_timeout=%d flags=0x%04x '
  75. 75 'cookie=%d packet_count=%d byte_count=%d '
  76. 76 'match=%s instructions=%s ' %
  77. 77 (time.time(), dpid, stat.table_id,
  78. 78 stat.duration_sec, stat.duration_nsec,
  79. 79 stat.priority,
  80. 80 stat.idle_timeout, stat.hard_timeout, stat.flags,
  81. 81 stat.cookie, stat.packet_count, stat.byte_count,
  82. 82 stat.match, stat.instructions))
  83. 83 # flow_no = stat.match['eth_type'] + stat.match['ipv4_src'] + stat.match['in_port'] + stat.match['ipv4_dst']
  84. 84 flow_no = flow_counter
  85. 85 if (dpid in self.flow_feature) and (flow_no not in self.flow_feature[dpid]):
  86. 86 self.flow_feature[dpid].setdefault(flow_no, {})
  87. 87 self.flow_feature[dpid][flow_no] = {'datapath': 0, 'duration': 0,'priority': 0,
  88. 88 'packet_count': 0, 'byte_count': 0,
  89. 89 'ipv4_src': 0, 'ipv4_dst': 0,
  90. 90 'in_port': 0,'output': 0,
  91. 91 'pkt_rate': 0, 'byte_rate': 0,
  92. 92 'pkt_asym': 0, 'byte_asym': 0,
  93. 93 'growth_flow_interval': 0, 'switch_flow_count': 0,
  94. 94 'mean_bytes_per_pkt': 0, 'time': 0}
  95. 95
  96. 96 time_interval = current_time-self.flow_feature[dpid][flow_no]['time']
  97. 97 pkt_rate = (stat.packet_count-self.flow_feature[dpid][flow_no]['packet_count'])/time_interval
  98. 98 byte_rate = (stat.byte_count-self.flow_feature[dpid][flow_no]['byte_count'])/time_interval
  99. 99 self.flow_feature[dpid][flow_no] = {'datapath': dpid, 'duration': stat.duration_sec, 'priority': stat.priority,
  100. 100 'packet_count': stat.packet_count, 'byte_count': stat.byte_count,
  101. 101 'ipv4_src': 0, 'ipv4_dst': 0,
  102. 102 'in_port': 0,'output': stat.instructions[0].actions[0].port,
  103. 103 'pkt_rate': pkt_rate,'byte_rate': byte_rate,
  104. 104 'pkt_asym': 0, 'byte_asym': 0,
  105. 105 'growth_flow_interval': 0, 'switch_flow_count': 0,
  106. 106 'mean_bytes_per_pkt': 0, 'time': current_time}
  107. 107
  108. 108 for key, value in stat.match.items():
  109. 109 self.flow_feature[dpid][flow_no][key] = value
  110. 110
  111. 111 if pkt_rate != 0:
  112. 112 self.flow_feature[dpid][flow_no]['mean_bytes_per_pkt'] = byte_rate/pkt_rate
  113. 113
  114. 114 if self.flow_feature[dpid][flow_no]['ipv4_src'] != 0:
  115. 115 src = self.flow_feature[dpid][flow_no]['ipv4_src']
  116. 116 dst = self.flow_feature[dpid][flow_no]['ipv4_dst']
  117. 117 self.src_to_dst.setdefault(src, {})
  118. 118 self.src_to_dst[src].setdefault(dst, {})
  119. 119 self.src_to_dst[src][dst] = {'pkt_count': stat.packet_count, 'byte_count': stat.byte_count,}
  120. 120 flow_counter += 1
  121. 121
  122. 122 for flow_no in self.flow_feature[dpid].keys():
  123. 123 self.flow_feature[dpid][flow_no]['growth_flow_interval'] = \
  124. 124 flow_counter - self.flow_feature[dpid][flow_no]['switch_flow_count']
  125. 125 self.flow_feature[dpid][flow_no]['switch_flow_count'] = flow_counter
  126. 126 if 'ipv4_src' in self.flow_feature[dpid][flow_no].keys():
  127. 127 for src in self.src_to_dst.keys():
  128. 128 if src == self.flow_feature[dpid][flow_no]['ipv4_dst']:
  129. 129 for dst in self.src_to_dst[src].keys():
  130. 130 if dst == self.flow_feature[dpid][flow_no]['ipv4_src']:
  131. 131 self.flow_feature[dpid][flow_no]['pkt_asym'] = \
  132. 132 self.src_to_dst[src][dst]['pkt_count']/(1+self.flow_feature[dpid][flow_no]['packet_count'])
  133. 133 self.flow_feature[dpid][flow_no]['bytes_asym'] = \
  134. 134 self.src_to_dst[src][dst]['byte_count'] / (1+self.flow_feature[dpid][flow_no]['byte_count'])
  135. 135 global FEATURE
  136. 136 FEATURE[dpid]['flow_feature'] = self.flow_feature[dpid]
  137. 137
  138. 138 # data = open("switch_flows", mode='w+')
  139. 139 # for flow in self.flows:
  140. 140 # data.write(str(flow) + '\n')
  141. 141 # data.close()
  142. 142
  143. 143 data = open("feature", 'w')
  144. 144 for dpid in FEATURE.keys():
  145. 145 data.write('DatapathId ' + str(dpid) + ':{')
  146. 146 for feature_type in FEATURE[dpid].keys():
  147. 147 data.write('\n '+str(feature_type)+':')
  148. 148 data.write(str(FEATURE[dpid][feature_type]) + '}\n')
  149. 149 data.write('\n')
  150. 150 data.close()
  151. 151
  152. 152 # workbook = xlwt.Workbook(encoding='utf-8')
  153. 153 # worksheet = workbook.add_sheet('Flow Feature')
  154. 154 # worksheet.write()
  155. 155 # workbook.save('flow_feature.xls')
  156. 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. ADAS测试

    ADAS测试 1.  ADAS​和​自动​驾驶​测试 AD​和​高级​驾驶​辅助​系统​(ADAS)​正在​不断​增加​新的​雷达.​摄像​头.​激光​雷达​和​GNSS​传感器,​甚至​也在​改变​ ...

  2. python应用_读取Excel数据列表输出【一】

    python能使用xlrd模块实现对Excel数据的读取,且按照想要的输出形式. 1.准备Excel数据如下: 2.下面主要是对Excel数据读取后以双列表(每一行是一个用例为一个列表,再一个个案例组 ...

  3. 一、部署监控服务器--安装LNMP环境

    1.要求: 本案例要求部署-台Zabbix监控服务器, -台被监控主机,为进一步执行具体的监控任务做准备:1.安装LNMP环境2.源码安装Zabbix3.安装监控端主机,修改基本配置4.初始化Zabb ...

  4. WordPress安装篇(1):使用PHPStudy安装WordPress

    我是"小白",既不会编程也不懂CSS能自己搭建网站吗?可以的!只要你会用鼠标,懂打字就能搭建出属于你自己的网站.要怎么样才能做到昵?让我们一起来看看如何实现的吧.在Windows环 ...

  5. NX二次开发-克隆操作

    模板文件: 克隆替换字符串: 1 #include "Text.h" 2 extern DllExport void ufsta(char *param, int *returnC ...

  6. Mysql 面试题(一网打尽,收藏版)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  7. Java知识,面试总会问到虚拟机,虚拟机类加载机制你懂吗?

    虚拟机把描述类的数据从Class文件文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 与那些在编译时需要进行连接工作的语言不同 ...

  8. 手把手使用Python进行语音合成,文字转语音

    目录 0. 太长不看系列,直接使用 1. Python调用标贝科技语音合成接口,实现文字转语音 1.1 环境准备: 1.2 获取权限 1.2.1 登录 1.2.2 创建新应用 1.2.3 选择服务 1 ...

  9. DBA入门相关知识介绍

    DBA(database administrator):数据库管理员                           DBMS(database management system):数据库管理系 ...

  10. LM-MLC 一种基于完型填空的多标签分类算法

    LM-MLC 一种基于完型填空的多标签分类算法 1 前言 本文主要介绍本人在全球人工智能技术创新大赛[赛道一]设计的一种基于完型填空(模板)的多标签分类算法:LM-MLC,该算法拟合能力很强能感知标签 ...