本文章基于https://ryu.readthedocs.io/en/latest/library_packet.html里面的Packet library的内容进行讲解的,即数据包解析的简单实现。ryu包库可以帮助我们去解析和构造各种数据协议包。

下面就着重讲一下,ryu如何对数据包进行解析。

首先,数据包解析是指控制器对从交换机收到的数据包进行解析。那么这个数据包在哪呢,按照官网的给出的开发文档,我们知道数据包主要指的是msg.data,如下图所示。

可以看出data数据是由一串16进制的数字串组成。接下来,我们就开始编码进行解析。

第一部分:代码

新建一个类Pktparser,内容如下:

from ryu.base import app_managerclass Pktparser(app_manager.RyuApp):OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)

从ryu.base import app_manager,在开发APP的时候只需要继承这个基类,就获得你想要的一个APP的一切了。from ryu.ofproto import ofproto_v1_3意思是导入openflow1.3协议的数据,本次开发就是使用openflow1.3协议。此时,这个程序就是一个完整的程序了,运行并没有错误,但是由于尚未添加如何处理代码,所以这段程序说明也做不了。

接下来,接需要继续向类中添加代码以完成解析功能的开发。

from ryu.lib.packet import packet
import array@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)def packet_in_handler(self, ev):msg = ev.msg# msf.data就是发送过来的数据包,从中可以解析出协议、源ip、mac地址等信息print('msg.data:', msg.data)pkt = packet.Packet(array.array('B', msg.data))# 几种协议pName = []for p in pkt.protocols:print('received protocol data:', p)pName.append(p.protocol_name)if p.protocol_name == 'arp':print('src_ip: {0}, dst_ip: {1}'.format(p.src_ip, p.dst_ip))print('protocol category:', pName)

上述代码中,和上一篇博客相同的部分我不再解释。这里主要是导入了packet包,至于ryu各个包的含义请参考官网的开发文档。导入packet包后,将数据msg.data按照数组形式传入,最终会返回协议的列表,通过对列表的遍历,就可以解析出各种协议以及目的ip,源ip等信息。

至此,一个简单的数据包解析程序就完成了。

第二部分:实验

首先,利用mininet构建网络拓扑,如下所示。

在Ubuntu终端命令行中运行HUB程序,命令如下。

root@yang-VirtualBox:/home/yang/ryu/ryu/app# ryu-manager packet_parser_yjl.py

接下来,设置c0控制器,h1、h2、h3的ip地址分别为10.0.0.1、10.0.0.2、10.0.0.3。全部设置完成后,运行拓扑。

运行拓扑后,在Ubuntu命令行查看交换机s1的流表,可以发现s1并未有任何流表项存在,所以此时需要手动添加默认流表项,如下所示。

在mininet命令行中输入命令 h1 ping h3,此时观察控制器输出的日志信息,如下所示。

可以清晰的发现协议,目的ip,源ip等信息。

完整代码如下:

import arrayfrom ryu.base import app_manager
from ryu.ofproto import ofproto_v1_3
from ryu.controller.handler import set_ev_cls
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.lib.packet import packet
'''
实现了数据包的解析功能
即:控制器从交换机收到数据之后,对数据进行解析
提取出协议,目的ip,源ip等信息
'''class Pktparser(app_manager.RyuApp):OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)def packet_in_handler(self, ev):msg = ev.msg# msf.data就是发送过来的数据包,从中可以解析出协议、源ip、mac地址等信息print('msg.data:', msg.data)pkt = packet.Packet(array.array('B', msg.data))# 几种协议pName = []for p in pkt.protocols:print('received protocol data:', p)pName.append(p.protocol_name)if p.protocol_name == 'arp':print('src_ip: {0}, dst_ip: {1}'.format(p.src_ip, p.dst_ip))print('protocol category:', pName)

github地址:https://github.com/Yang-Jianlin/ryu/blob/master/ryu/app/packet_parser_yjl.py

ryu实例---数据包解析相关推荐

  1. java 解析数据包_一种基于Java语言的网络通讯数据包解析方法与流程

    本发明涉及网络通讯领域,特别涉及一种基于Java语言的网络通讯数据包解析方法. 背景技术: 计算机系统和网络的大量普及使用使全球跨入了信息化时代.但是,正由于现代社会中几乎一切都在"计算机化 ...

  2. 搬砖:网络数据包解析

    Itsad 网络数据包解析 TCP/IP协议数据包,一般由应用层.传输层.网络层.数据链路层封装而成. 四层协议各自的作用: 数据链路层实现了网卡接口的驱动程序. 网络层实现了数据包的选路和转发. 传 ...

  3. Tracert命令 路由跟踪数据包解析

    Tracertet 命令作为一个路由跟踪.诊断实用程序,在DOS和UNIX系统下都有此命令,它通过发送 Internet 控制消息协议 (ICMP) 回显请求和回显答复消息,产生关于经过每个路由器的命 ...

  4. GPS NMEA数据包解析

    GPS NMEA数据包解析 NMEA-0183是美国国家海洋电子协会为海用电子设备制定的标准格式.它包含了定位时间,纬度,经度,高度,定位所用的卫星数,DOP值,差分状态和校正时段等很多信息 一 通用 ...

  5. HDLBITS笔记35:独热编码状态机,ps/2数据包解析器,ps/2数据包和数据路径

    目录 题目1:Fsm onehot(热编码的有限状态机) 题目2:Fsm ps2(ps/2数据包解析器) 题目3:Fsm ps2data(ps/2数据包解析器和数据路径) 题目1:Fsm onehot ...

  6. wireshark官方文档第 9 章数据包解析

    第 9 章数据包解析 9.1. 数据包解析的工作原理 对于一个已封装好的协议包,每个解析器(dissector)对其负责的一部分协议进行解码,然后将解码过程交给后续的解析器. 每个解析都从帧(Fram ...

  7. jpcap抓包,TCP数据包逻辑分析,TCP数据包解析

    1.jpcap抓包 https://github.com/kumqu/java-jpcap 2.TCP逻辑分析 3.TCP数据包解析 3.1 数据包解析源码 import com.alibaba.fa ...

  8. 计算机网络ip数据包分析题,计算机网络课程设计-IP数据包解析实验报告

    计算机网络课程设计-IP数据包解析实验报告 解析 IP数据报实验报告目录目录 21.课程设计目的 .22.课程设计要求 .23.相关知识 .24.课程设计分析 .64.1 网卡设置64.2 使用套接字 ...

  9. python网络数据包分析_Pyshark:使用了WirdShark的Python数据包解析工具(Tshark)

    Pyshark Pyshark是一款针对tshark的Python封装器,在Pyshark的帮助下,广大研究人员可以使用wireshark的解析器来进行Python数据包解析.扩展文档:[Pyshar ...

最新文章

  1. 我国数字出版发展尚存三大难题
  2. 如何更科学的进行SEO优化?保持排名稳定
  3. 深度学习(DL)与卷积神经网络(CNN)学习随笔-05-基于Python的LeNet之CNN
  4. OpenCV学习笔记九-Canny边缘检测
  5. php中trim的用法和例子,PHP ltrim()用法及代码示例
  6. 用c语言简单办法做一个字典_幼儿园手工,用废纸筒做一个简单的小蝴蝶,有教程...
  7. sarscape 将dem文件转化成stl_STL文件,一种前处理网格划分技术??
  8. 证明一下拉普拉斯的《概率分析论》观点
  9. 个人简历中计算机应用能力,年中计算机应用专业个人简历模板.docx
  10. java 使用websocket_Java使用WebSocket
  11. 深度优先搜索解决迷宫最短路径问题
  12. S32K NVIC配置(以外部中断为例)
  13. 【JZOJ 杂题选讲】【UER #8】打雪仗
  14. linux 设置中国时区
  15. 浅谈数码相机成像中 ISO(感光度)的作用
  16. 计算机维修基本技能考试试题,高级计算机维修工操作技能考核试卷
  17. 国产FlexRay系列产品即将上市,值得期待!
  18. java中socket实现一对一聊天
  19. anaconda安装配置步骤、报错解决
  20. 小学计算机关于word的内容,小学信息技术说课《了解word界面》

热门文章

  1. Java 浏览器下载文件及文件预览
  2. Unity中将SampleScenes/AircraftJet2Axis飞行棋替换自己模型
  3. GRL-Image-Restoration
  4. [C] 三、回调结构体
  5. 基于遗传算法的人工智能实例之拼图游戏(python实现)
  6. python抠图_3行Python代码实现图像照片抠图和换底色的方法
  7. vue 仿今日头条_vue实现仿今日头条首页选项卡的功能 -
  8. Python社区专访Mike Driscoll
  9. 怎么调整html超链接,HTML超链接怎么设置
  10. 使用CNN实现手机头像解锁