Yet Another Traffic Classifier

Yet Another Traffic Classifier: A Masked Autoencoder Based Traffic Transformer with Multi-Level Flow Representation 论文分享

Zhao, R., Zhan, M., Deng, X., Wang, Y., Wang, Y., Gui, G., & Xue, Z. (2023). Yet Another Traffic Classifier: A Masked Autoencoder Based Traffic Transformer with Multi-Level Flow Representation. Proceedings of the AAAI Conference on Artificial Intelligence, 37(4), 5420-5427.

pdf链接:https://ojs.aaai.org/index.php/AAAI/article/download/25674/25446

另一种流量分类器:基于屏蔽自编码器的多级流表示流量转换器

现存的基于深度学习的流量分类方法局限
  1. 流量重复只是从原始数据包字节生成,导致在没有重要信息的情况下产生
  2. 直接应用深度学习算法的模型结构不考虑流量特征
  3. 特定场景分类器培训通常需要劳动密集型和耗时的过程来标记数据
提出问题

如何使分析仪器能够更准确地进行流量分类,在不同的流量中捕捉隐式的和鲁棒的模式。

贡献
  1. 使用带有MFR的基于MAE的交通变压器,称为YaTC,用于交通分类。 YaTC从三个角度突破了传统的流量分析方法:流量表示、分类器结构和培训策略。
  2. 设计了一个MFR矩阵,该矩阵充分考虑了流层次结构来表示原始流量。 为了有效地利用MFR矩阵进行流量分析,构建了一个具有数据包级和流级张位机制的新型流量变压器。 它可以以更低的复杂度和更少的参数执行更高效的特征提取。
  3. 应用基于MAE的自我监督学习范式来训练我们的分类器。 它首先利用大规模未标记的流量数据来学习通用的潜在重复,然后对一系列流量分类任务进行少量标记数据进行微调。
  4. 在五个现实世界流量数据集上评估YaTC,本文方法远远优于最先进的方法。
MAE

MAE(Mean Absolute Error)是一种用于CV(Computer Vision,计算机视觉)的自监督学习方法。自监督学习是一种无需人工标注数据的机器学习方法,它利用输入数据本身的特性来进行学习。MAE方法利用图像数据的自相似性来进行自监督学习。它首先将输入图像进行一定的变换(如旋转、缩放、裁剪等),然后利用这些变换后的图像作为输入数据进行训练。通过比较原始图像和变换后图像之间的差异来学习图像的特征和结构。

它的优点在于无需人工标注数据,可以利用大量的未标注图像进行训练,从而可以更好地利用数据资源。同时,MAE方法还可以提高模型的鲁棒性和泛化能力,因为它可以学习到图像的不变性特征,使模型对图像变换具有一定的鲁棒性。

总的来说,MAE方法是一种有效的自监督学习方法,可以提高CV模型的性能和泛化能力,同时也可以节省人工标注数据的成本和时间

Traffc Analysis Methods

Rule-Based Methods

研究人员通过安全专家设计的u规则,利用流量数据的通信协议和端口号等基本属性来发现违反安全策略的行为。

ML-Based Methods

基于机器学习的方法,来探索流量的高维统计特征,比如通过准确度评估选择最佳统计特征,将其作为支持向量机的输入来识别网站流量,或者采用随机森林分析网站流量产生的统计特征。基于机器学习的方法结合统计特征可以分析复杂流量,但它们依赖于专家设计的统计特征,需要针对不同场景选择最优特征。

DL-Based Methods

基于深度学习的方法,基于原始数据包而非认为设计的特征来分析流量,已成为自动提取流量表示并实现显著性能提升的主要工具。这些方法依赖于足够多的标注训练数据,而手机和手动标注足够多的真实流量样本并不容易。

多级流量表示法

从原始数据中生成多级流量代表,所作为交通分类的输入。

现存流量表示方法都是直接截取前面的数据流中的固定字节数形成二维矩阵,作为图像处理,通过DL算法进行分类,存在的问题:

  1. 与报头相比,有效载荷的大小通常要大得多,而且充满了加密操作产生的不可力戒信息,导致矩阵中的底层语义信息过多,影响这些模型的有效性和效率。
  2. 在某些流量中,第一个长数据包会占据整个矩阵,因此矩阵无法包含流量中其他数据包的数据。

本文提出的MFR矩阵,用格式化的二维矩阵来表示原始流量,如图1所示

  • 根据IP地址、端口号和协议雷响将原始流量分成若干流量
  • 为了避免引入有偏差的互相干扰,一处流量的以太网头,将端口号设为零,并用随机地址替换IP,但保留其方向
  • 捕获流量中相邻的M个数据包,并将其格式化为大小为H×W的二维矩阵,作为该流量的表示

注意:

本文使用了原始字节作为流量的初始特征(流量表示矩阵中每个点的值),但在捕获原始流量的多层次信息时采用了特殊的设计:

  • 字节流:流量表示矩阵的每一行只包含一种流量字节,分为标题行和有效载荷行
  • 数据包级:每个数据包由报头矩阵和有效载荷矩阵表示,形成大小为H/M*W的数据包级矩阵
  • 流量级:由于流量是由有序的数据包组成的美因茨M个相邻的数据包级矩阵会在第二维度上叠加,形成最终的MFR矩阵

这样,每一层的信息都是固定的,不会出现低层信息溢出而导致高层信息丢失的情况

image

数据处理的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import os
import glob
import binascii
from PIL import Image
import scapy.all as scapy
from tqdm import tqdm
import numpy as np

def makedir(path):
try:
os.mkdir(path)
except Exception as E:
pass

def read_5hp_list(pcap_dir):
packets = scapy.rdpcap(pcap_dir)
data = []
for packet in packets:
header = (binascii.hexlify(bytes(packet['IP']))).decode()
try:
payload = (binascii.hexlify(bytes(packet['Raw']))).decode()
header = header.replace(payload, '')
except:
payload = ''
if len(header) > 160:
header = header[:160]
elif len(header) < 160:
header += '0' * (160 - len(header))
if len(payload) > 480:
payload = payload[:480]
elif len(payload) < 480:
payload += '0' * (480 - len(payload))
data.append((header, payload))
if len(data) >= 5:
break
if len(data) < 5:
for i in range(5-len(data)):
data.append(('0'*160, '0'*480))
final_data = ''
for h, p in data:
final_data += h
final_data += p
return final_data

def MFR_generator(flows_pcap_path, output_path):
flows = glob.glob(flows_pcap_path + "/*/*/*.pcap")
makedir(output_path)
makedir(output_path + "/train")
makedir(output_path + "/test")
classes = glob.glob(flows_pcap_path + "/*/*")
for cla in tqdm(classes):
makedir(cla.replace(flows_pcap_path,output_path))
for filename in tqdm(filenames):
content = read_5hp_list(filename)
content = numpy.array([int(content[i:i + 2], 16) for i in range(0, len(content), 2)])
fh = numpy.reshape(content, (40, 40))
fh = numpy.uint8(fh)
im = Image.fromarray(fh)
im.save(filename.replace('.pcap','.png').replace(flows_pcap_path,output_path))

makedir:创建一个新的目录。它接受一个参数path,表示要创建的目录的路径。函数首先尝试使用os.mkdir()函数创建目录,如果出现任何异常则将其捕获并忽略,不做任何处理。这样可以确保即使在创建目录时出现问题,程序也不会中断。

read_5hp_list:首先使用scapy.rdpcap()函数读取pcap文件,然后遍历每个数据包。对于每个数据包,它提取IP头部的十六进制表示,并尝试提取原始数据Raw十六进制表示。如果数据包中没有原始数据,则将payload设为空字符串。然后根据特定的长度要求对header和payload进行处理,确保它们的长度符合要求。接下来,函数将处理后的header和payload添加到一个列表data中,如果列表长度超过5,则停止添加。如果列表长度不足5,则补充空数据。最后,函数将列表中的数据拼接成一个字符串final_data,并返回final_data字符串。

MFR_generator:函数接受两个参数flows_pcap_pathoutput_path,分别表示pcap文件所在的路径和输出路径。首先,函数使用glob.glob()函数获取flows_pcap_path目录下所有子目录中的pcap文件,并存储在名为flows的列表中。然后使用自定义函数makedir()创建输出路径及其子目录。接下来,函数遍历classes列表中的每个类别,对每个类别都调用makedir()函数创建相应的子目录。然后,函数遍历filenames列表中的每个文件,对每个文件都调用read_5hp_list()函数读取数据,并将数据转换成特定格式的图像文件。这里使用了numpy库将数据转换成数组,并使用Image库创建图像对象,并最终保存为png格式的图像文件