我们将网络流量分类的输入空间分为三类:分组分类(Packet Classification,PC)、流量内容分类(Flow Content Classification,FCC)和流量时间序列分类(Flow Time Series Classification,FTSC)。
按照流量内容进行分类,是将一个流的前n个数据包的字节序列提取出来。
网络流量由双向流和数据包组成,它们是网络流量分类的常用对象。每个数据包由多个报头文件和一个存在应用程序数据的有效负载组成。我们通过5元组信息来表示一个数据包的报头,这些信息来自于IP层和传输层(TL)报头的内容。五元组包括网络传输协议、源IP、目的IP、源端口、目的端口。网络协议号可以参考这个网址 协议号大全,其中最主要的有TCP为06,UDP为17,拿一条流量举例:

其中网络传输协议为TCP,协议号为6,源IP为65.54.81.165,目的IP为192.168.4.121,源端口为80,目的端口为51779。
因此具有相同五元组的所有流量均被提取(在此,采用双向流,即为源与目的交换后仍代表相同五元组,但在最终采用+1/-1来表示流向)。
代码如下:

import scapy
from scapy.all import *
from scapy.utils import PcapReader
import binascii
import struct
import numpy as np
fpcap = open("ddossim.pcap",'rb')
string_data = fpcap.read()
packets=rdpcap("ddossim.pcap")
np.set_printoptions(threshold=np.inf)#pcap文件的数据包解析
step = 0
packet_num = 0
packet_data = []
pcap_packet_header = []
i =24
packet_num_w=0
packet_content=[]
five_tuples=[]
five_tuples_num=0for data in packets:packet_num_w+=1if 'UDP' in data and data['UDP'].len!=97:payload_len=data['UDP'].len-8elif 'TCP' in data and data['IP'].len>40:payload_len=data['IP'].len-40else:i = i+ struct.unpack('I',string_data[i+12:i+16])[0]+16continuepacket_header=binascii.hexlify(string_data[i:i+16])pcap_packet_header.append(packet_header)#求出此包的包长len pcap_packet_header_len = string_data[i+12:i+16]packet_len = struct.unpack('I',pcap_packet_header_len)[0]#写入此包数据pcap_packet_payload=binascii.hexlify(string_data[i+16:i+16+packet_len])protocol=[int(pcap_packet_payload[i*2:(i+1)*2],16) for i in range(23,24)][0]src_ip=[int(pcap_packet_payload[i*2:(i+1)*2],16) for i in range(26,30)]src_ip=str(src_ip[0])+'.'+str(src_ip[1])+'.'+str(src_ip[2])+'.'+str(src_ip[3])dst_ip=[int(pcap_packet_payload[i*2:(i+1)*2],16) for i in range(30,34)]dst_ip=str(dst_ip[0])+'.'+str(dst_ip[1])+'.'+str(dst_ip[2])+'.'+str(dst_ip[3])src_port=[int(pcap_packet_payload[i*2:(i+2)*2],16) for i in range(34,35)][0]dst_port=[int(pcap_packet_payload[i*2:(i+2)*2],16) for i in range(36,37)][0]five_tuple=[protocol,src_ip,dst_ip,src_port,dst_port]five_tuple_trans=[five_tuple[0],five_tuple[2],five_tuple[1],five_tuple[4],five_tuple[3]]packet_data.append(pcap_packet_payload)payload = str(pcap_packet_payload[-payload_len*2:])[2:-1]header = str(pcap_packet_payload[:-payload_len*2])[2:-1]header_256 = []payload_256 = []# import pdb;pdb.set_trace()for header_len_each in range(packet_len-int(payload_len)):header_256_each=int(header[header_len_each*2:header_len_each*2+2],16)header_256.append(header_256_each)for payload_len_each in range(int(payload_len)):payload_256_each=int(payload[payload_len_each*2:payload_len_each*2+2],16)payload_256.append(payload_256_each)header_256 = np.array(header_256)payload_256 = np.array(payload_256)new_tuple=0for tuple_num in range(0,len(packet_content)):if packet_content[tuple_num][0]==five_tuple:packet_content[tuple_num][1].append(1)     packet_content[tuple_num].append(header_256)packet_content[tuple_num].append(payload_256)new_tuple=1elif  packet_content[tuple_num][0]==five_tuple_trans:packet_content[tuple_num][1].append(-1)            packet_content[tuple_num].append(header_256)packet_content[tuple_num].append(payload_256)new_tuple=1if new_tuple==0:five_tuples_num+=1packet_content.append([five_tuple])packet_content[-1].append([1])packet_content[-1].append(header_256)packet_content[-1].append(payload_256)i = i+ packet_len+16packet_num+=1fpcap.close()np.savetxt("temp0.csv", packet_content, delimiter="," , fmt = '%s')

其中 packet_content为存储最终结果的变量,five_tuple为五元组集合,five_tuple_trans为双向流另一种五元组集合(即为与第一个五元组方向不同的流的五元组),five_tuples_num为五元组组数,header_256与payload_256分别为各包包头及负载。
提取单个包的包头与负载代码入口在此:Pcap包包头、负载解析
提取五元组后的存储文件如下:

存储格式为: [五元组][每个流方向][每个流的包头及负载数据]
写入csv文件后,可采用一下代码进行读取:

ort numpy as np
import csv
# np.set_printoptions(threshold=np.inf)with open('temp0.csv') as f:f_csv=csv.reader(f)t=""for csv in f_csv:for csv_each in csv:t=t+str(csv_each)t=t[1:-1]
m=t.split("][")five_tuple_all=[]
flow_direction_all=[]
data=[]
for tuple_count in range(len(m)):five_tuple=m[tuple_count].split("] [")[0].replace('[','').split(" ")five_tuple_all.append(five_tuple)flow_direction=m[tuple_count].split("] [")[1].split("] array")[0].split(" ")flow_direction_all.append(flow_direction)flow_data=m[tuple_count].split("] [")[1].split("] array")[1].replace('([','').replace('])','').split('array')flow_num=len(flow_direction)for i in range(flow_num*2):each_pcap=[]for bit_count in flow_data[i].split(' '):try:each_pcap.append(eval(bit_count))except SyntaxError:continueeach_pcap=np.array(each_pcap)# import pdb;pdb.set_trace()if i==0:data.append([[each_pcap]])elif i%2==0:data[tuple_count].append([each_pcap])else:data[tuple_count][int((i-1)/2)].append(each_pcap)data=np.array(data)

Pcap包按相同五元组信息提取流量相关推荐

  1. java解析五元组_抓包分析提取五元组

    网络中每个通信实体的 socket 是用一个三元组标识的.三元组往往称为半相关 三元组指的是:协议族(地址族),网络地址.和传输层端口 ( Ipv4 ). 通信双方的一个连接是用网络五元组来标识的,它 ...

  2. 根据五元组对pcap数据包划分

    目的 对数据包(pacp格式)中的数据,按照五元组(#流:源端口号.目的端口号.协议号.源IP.目的IP)对流进行划分. 举例:flow1(data[IP].src, data.sport, data ...

  3. linux五元组结构体,一种基于分类优先级的五元组查询方法与流程

    本发明涉及网络传输技术,特别涉及一种基于分类优先级的五元组查询方法. 背景技术: 近年来,随着网络的快速发展,网络数据包的转发效率显的尤为重要:目前,信息技术快速发展,其对应的数据量也迅速增长,在对大 ...

  4. tshark解析本地pcap数据包提取五元组{src_ip,src_port,proto,dst_ip,dst_port}与时间戳,包长

    tshark官方文档:https://www.wireshark.org/docs/man-pages/tshark.html wireshark官方特征参考:https://www.wireshar ...

  5. java解析五元组,解析报文 解析出packet的五元组(源地址、目标地址、源端口、目标端口、协议号)信息和当前包的流量大...

    我们重点关注五元组+状态+inode号分别在第2.3.4.11列 进程文件描述符 网络状态文件/proc/net/tcp"0B": "CLOSING" 在lin ...

  6. 解析pcap文件并提取其中五元组

    解析pcap文件并提取其中五元组 最近在学习分析pcap文件中的数据包,其中数据包的五元组(源IP,目的IP,源端口,目的端口,协议类型,共13个字节)可以用来作为数据流的标识.我们可以将五元组提取出 ...

  7. python解析pcap提取{src ip,src port,protocol,dst ip, dst port}五元组,再提取网络流(包括前向流与后向流)

    通过解析pcap文件,按照{src ip, src port, transport protocol , dst ip, dst port} 拆分流,并提取出前向流(Forward)与后向流(Back ...

  8. pcap java_java解析Pcap文件获取五元组(可执行)

    [实例简介] java解析Pcap文件获取五元组(可运行) [实例截图] [核心代码] PcapTestZ └── PcapTestZ └── PcapTestZ ├── 111.206.37.193 ...

  9. C++实现pcap包解析,并提取指定特征帧

    目录 前言 1.流量结构 2.类C结构 3.指令类型 二.代码示例 1.引入头文件 2.设置全局变量 3.函数 1.高低字节交换 2. 十六字节拼接 3.将木马检测结果写入csv文件 4.获取文件夹下 ...

最新文章

  1. 周鸿祎重做路由器,到底在做什么?
  2. 初学Portal的基本概念
  3. ES6 - let、const与作用域
  4. vue 拖拽元素到任意位置
  5. php期末考试题机考_phP基础知识期末考试题
  6. 如何对报表的参数控件赋值
  7. 测试wcf的http和tcp绑定以及非wcf的命名管道传输文件速度对比
  8. 【转】数组指针指针数组
  9. chrome版本太旧 无法更新
  10. python参考手册下载_python3.8.4官方中文文档 API手册 PDF 高质量版
  11. RPA机器人自动调用U盾方案
  12. PHP - XHProf简明教程
  13. 2021-11-09 jQuery常用方法及事件
  14. 咬文嚼字撕下抖音背后虚伪的面纱
  15. 第十六届全国大学生智能车竞赛三个创意组别总决赛比赛成绩
  16. 使用VSCode 进行IRIS 开发
  17. python如何连redis_Python连接Redis的基本配置方法
  18. Qt 微内核架构实践
  19. Uninformed Students: Student–Teacher Anomaly Detection with Discriminative Latent Embeddings(翻译)
  20. C++20 barrier

热门文章

  1. 树莓派——3、树莓派外设开发编程
  2. 基于树莓派3b的嵌入式实验——蓝牙通信实验(python)
  3. Dreamweaver CC 2019下载及安装
  4. 【语音识别】基于matlab GUI动态时间规整算法(RTW)语音识别系统【含Matlab源码 341期】
  5. d 服务器运行失败,【求助】服务器启动失败,服务器启动时遇到了一些麻烦,请重试...
  6. List<Integer>使用Remove移除int元素
  7. 青岛联通物联网防盗有新招
  8. 求具有隔热材料的外围护结构墙体的温度分布得Python程序
  9. 网吧增值服务:网吧话吧联营解决方案(图)
  10. 什么叫电磁感应、趋肤效应、热电效应、光电效应?