王 攀,陈雪娇
(1.南京邮电大学 现代邮政学院,南京 210003; 2.南京信息职业技术学院 通信学院,南京 210023)
流量分类与识别是提升网络管理与安全监测水平,改善服务质量的基础,也是网络设计与规划等网络行为的前提。随着用户隐私保护和安全意识的增强,SSL、SSH、VPN和Tor等技术得到了越来越广泛的应用,导致加密流量在网络传输中的比重越来越高。
因采用应用层加密,传统的端口匹配[1]、DPI深度包检测[2-4]等技术无法准确识别这类加密应用流量,相关研究人员也一直在尝试通过各种机器学习方法,如SVM、决策树、朴素贝叶斯等[5-7],围绕流特征、净荷特征以及混合特征进行识别和分类。然而这些方法都存在2个问题,一个就是机器学习的特征提取和选择非常复杂,耗时耗力,且非常依赖特征专家的知识面和经验;另一个就是分类准确率不高。
相比其他机器学习方法,深度学习具有深层结构的特点,而其他浅层结构模型,如最大熵和Softmax回归、SVM等方法的局限性主要是依赖于有标记的样本、对复杂函数难以表示和陷入局部最优化,或者泛化能力受到样本数据量的影响较大,如BP算法。深度学习采用训练多个单层非线性网络,组合底层特征构成数据的抽象表示,从而发现并且刻画问题内部复杂的结构特征,故而表达数据的本质特征。
鉴于上述深度学习的优点,研究人员开始探讨深度学习方法在流量识别中的应用。文献[8]尝试用深度学习的方法来识别流量,采用堆栈式自动编码器(Stacked Autoencoder,SAE)来识别协议及应用,并对未知流量进行识别,达到了较好的准确率,但文中所采用的数据集为非公开数据集,无法进行验证对比。文献[9]提出采用SAE和卷积神经网络(Convolutional Neural Network,CNN)对加密流量进行识别,但对于数据的预处理和模型参数的选择等方面论述得不够清晰。文献[10]提出一种基于CNN的流量分类算法,分别采用公开数据集和实际数据集进行测试,并与传统分类方法相比,提高了流量分类的精度,减少了分类使用的时间,但并未涉及对加密流量的分类识别。文献[11]提出基于马尔科夫模型的半监督学习分类器进行流量分类。
本文提出一种基于SAE的加密流量识别方法,一方面利用SAE的无监督特性及在数据降维方面的优势,结合多层感知机(Multi-Layer Perceptron,MLP)的有监督分类学习,实现对加密应用流量的准确识别;另一方面考虑到样本数据集的类别不平衡性对分类精度的影响,本文采用SMOTE过抽样方法对不平衡数据集进行处理。
自动编码器是一种多层神经网络,属于非监督学习,不需要对训练样本进行标记,其输入层和输出层表示相同的含义——具有的节点数。自动编码器学习的是一个输入输出相同的“恒等函数”,其意义在于中间层,这一层是输入向量的特征表达。其原理表示如下:
假设输入一个n维信号x(x∈[0,1]),经过输入层到达中间层,信号变为y,可以用下式表示:
y=a(Wx+b)
(1)
其中,a()表示激活函数,如Sigmoid函数、ReLU函数等,实现非线性变换,W为权值,b为偏置。信号y经过解码层解码,输出到输出层,输出层和输入层一样有n个神经元,假设输出信号为z,计算公式如下:
z=a(W′y+b′)
(2)
则z为x的预测值,W′、b′同样分别表示权值与偏置,以区别于W、b。通过调整网络参数,使得最终输出的z与原始输入的x尽可能相近。可通过损失/误差函数进行最小化运算得到,损失/误差函数可以是均方差(MSE)、交叉熵(Cross Entropy)等。
SAE是深度学习领域常用的一个深度学习模型,由多个自动编码器堆叠而成,其目的是为了逐层提取输入数据的高阶特征,常被称为逐层贪婪训练学习过程,在此过程中逐层降低输入数据的维度,将一个复杂的输入数据转化成了一个系列简单的高阶特征,然后再把这些高阶特征输入一个分类器进行分类[12]。如图1所示,SAE的训练过程主要分为以下4步:
1)给定初始输入Y,采用无监督方式训练第一层自动编码器V,输出为Y′,设定输入Y和输出Y′的损失函数,或者叫做重构误差,最小化损失函数以减少重构误差达到设定值。
2)把第一个自动编码器(AE1)隐含层的输出V作为第二个自动编码器(AE2)的输入,采用以上同样的方法训练自动编码器Z。
3)重复第2步直到初始化完成所有自动编码器。
4)把最后一个SAE的隐含层输出(如图1中的Z)作为分类器的输入,然后采用有监督的方法训练分类器的参数。
图1 SAE训练过程
网络流量数据与图像既有相同之处,也有不同之处。相同之处在于网络数据包分组中的每一个字节都是由8 bit构成,取值范围为0~255,非常类似于黑白图片中的一个灰度像素,可以借鉴很多图像识别的深度学习方法;不同之处在于数据包分组的长度,即每个数据包所包含的字节数长短不一,因而无法直接作为深度学习模型的输入,必须进行数据预处理。图2为样本数据的预处理过程。
图2 数据预处理流程
数据预处理流程如下:
步骤1样本数据包文件导入:流量样本数据集有各种形式,比如原始数据包、包特征文件等。为获取流量样本文件中所存储的分组信息,一般首先对样本文件头部进行读取,以获得该样本文件的概要信息,比如总共有多少分组或有哪些特征项。如果是原始数据包形式,还需要进行数据包过滤。原因在于样本数据包文件往往不够纯净,即其中虽包含大量的准确样本数据包,但也包含部分其他数据包,比如APR、DHCP等局域网数据,这些数据的滤除对于后期的训练和测试都是有意义的。
步骤2循环读取数据包:预处理过程逐个读取流量样本数据集中每一个分组,对该分组完成预处理之后再读取下一个分组,直至文件中最后一个分组为止。
步骤3分组截断(Truncation)和补零(zero-padding):形成分组字节矩阵(Packet Byte Matrix,PBM)作为深度学习模型的输入。其中,PBM的每一行都是流量样本中的一个分组,也是网络的输入基本单元,称为分组字节向量(Packet Byte Vector,PBV)。考虑到深度学习的输入维度需统一,而每个分组的大小都不一样,因此需要考虑要么统一截断,要么长度不足的补零。定义Truncation_len为截断长度,需要考虑如下3个问题:
1)每个分组的大小最大值为MTU,即1 500 Byte,即以太网传输的最大IP报文(包含IP头部)是1 500 Byte。所以,Truncation_len值的理论范围为0 Byte~1 500 Byte。
2)Truncation_len的选值。该值过大,会造成深度学习训练的输入参数过多,从而加大训练的复杂度;该值过小,则会牺牲识别的准确性,因为有可能被截断的净荷内容中是包含有流量识别的特征信息。
3)数据集中的分组大小分布。从数据集中的分组大小的分布可以看出,分组大小主要分布在头部(前300 Byte)和尾部(后1 200 Byte~1 500 Byte)。因此,本文从保障准确性的角度出发,选择Truncation_len为最大值,即1 500 Byte。
步骤4归一化(Normalization):为了提升训练的性能,将每个分组归一化至0~1。每个分组大小为0~255,因此每个分组大小均除以256。
步骤5类别不平衡的样本数据集处理。详述见节2.2。
步骤6样本标记:根据流量样本数据集对数据包文件的标记。对PBM进行标记,可以通过在矩阵中增加一列用于标记每一行,即PBV,也可单独建立标记向量用于标记PBV。
无论是浅层机器学习,还是深度学习,分类识别研究基础都是基于一种假设:各种网络应用流都是均匀分布在网络中,即网络数据流的应用类别是平衡的。然而,现实网络中各种加密应用数据流分布很不均衡,比如通过加密协议承载的音、视频流远大于即时通信、纯网页加密流等。网络流类别不平衡是指流量样本数据集中存在的类别样本数量不均衡,通过训练,这些分类算法可能会忽略少数类别的流样本导致欠拟合,或重视少数类的差别造成过拟合[13]。
在进行深度学习训练之前,本文采用过抽样和欠抽样2种办法来处理不平衡数据集。对于比例过大的样本采用欠抽样方法来减少样本数量;对于比例过小的样本采用过抽样技术提高样本的可分性,拓展分类的决策边界。SMOTE算法是一种随机过抽样方法,其主要思想是应用K-最近邻方法,在少数类样本之间利用线性插值生成新的样本,从而增加少数类样本的数量,使数据集的类别数量相对平衡[14]。SMOTE 算法按照一定规则,利用插值方法合成新样本有良好的泛化作用,避免了随机复制原有样本的盲目和局限。没有引进少数类的冗余信息,扩展决策区域,避免过拟合问题,改善了数据集的可分性。
本文所采用的数据来源于“ISCX VPN-non VPN traffic dataset”[15],该数据集包括常规加密和VPN隧道传输的2类加密应用。本文选择常规加密流量中的15种应用作为训练和测试的样本数据,样本数据集均为PCAP文件格式。为了说明不平衡样本对性能的影响,同时给出了平衡样本,详细描述见表1。从表1可以看出,不平衡样本中比例最高的netflix可以达到27.701%,比例最少的aim_chat仅有0.663%;对于样本量少的类别采用SMOTE过抽样方法,而对于样本量多的类别采用欠抽样方法,通过这2种方式预处理之后可以看出,样本基本都在5%~8%。
表1 样本数据集描述
根据第1节所述的SAE模型的训练过程,可将基于SAE的加密流量识别模型的搭建和训练分为2大阶段:第一阶段是SAE的训练过程,这一深度学习训练过程是无监督的,称之为SAE训练过程;第二阶段是将训练好的SAE与分类输出相连,完成一个基于MLP的分类模型的训练,这一阶段是有监督的,称之为SAE分类器训练过程。基于上述的2个训练过程,本文所提出的SAE模型架构也分为2个部分:SAE训练过程和SAE分类器训练过程。
如图3所示,第一阶段,SAE训练过程中由3个自动编码器堆叠而成。
图3 SAE模型架构
训练过程分为如下几步:
Z=∑WY+b
(3)
计算后得到的结果采用ReLu作为激活函数,其公式表示如下:
ReLU(Z)=max[0,Z]
(4)
输出层与输入层相同,由1 500个神经元构成。定义损失函数为MSE,为尽可能减少重构误差,实质上就是最小化输入与输出的误差,假设n为输出神经元个数,则定义如下:
(5)
在反向传播的过程中,采用随机梯度下降(Stochastic gradient descent,SGD)算法更新权值W、偏置b以最小化损失函数,计算公式如下:
(6)
(7)
其中,ρ为学习速率。
第1阶段整体处理过程总结见算法1,即SAE模型训练算法。
算法1SAE模型训练算法
输入Y={y1,y2,…,yk},k=1 500,即PBV
1.设定相关初始化参数。激活函数α= ReLU; е为训练周期,即epoches;τ为mini_batch的大小;
2.for t from 1 to e do
3.for each τ do
4.针对每一个流量样本y∈Y,执行如下步骤:
5.前向传播:计算式(3);
6.激活函数:计算式(4);
7.计算损失函数并最小化:计算式(5);
8.反向传播更新权值:计算式(6)和式(7);
9.end for
10.end for
第2个阶段是SAE分类器训练过程,如图3所示,由1个输入层、3个隐藏层和1个输出层构成,训练过程分为如下6步:
步骤1输入数据采用第2.1节所描述的数据预处理后所得到的PBV,训练数据输入维度为1 500,即输入为1 500个神经元。
步骤23个隐藏层分别使用SAE模型中训练好的Autoencoder1、Autoencoder2和Autoencoder3,神经元个数分别为740、92和32,对输入数据进行加权、偏置,见式(3)。
步骤3计算后得到的结果均采用ReLu作为激活函数,见式(4)。
(8)
步骤5在模型训练过程中,采用交叉熵作为损失函数,假设L表示损失函数,则定义如下:
(9)
步骤6在反向传播的过程中,同样采用SGD算法更新权值W、偏置b以最小化损失函数,见式(6)和式(7)。
第2阶段整体处理过程总结见算法2,即SAE分类模型训练算法。
算法2SAE分类模型训练算法
输入Y={y1,y2,…,yk},k=1 500,即PBV
1.设定相关初始化参数。隐藏层激活函数α= ReLU; 分类激活函数s = Softmax;е为训练周期,即epoches;τ为mini_batch的大小;
2.for t from 1 to e do
3.for each τ do
4.针对每一个流量样本y∈Y,执行如下步骤:
5.前向传播:计算式(3);
6.激活函数:计算式(4);当到达输出层时,计算式(8);
7.计算损失函数并最小化:计算式(9);
8.反向传播更新权值:计算式(6)和式(7);
9.end for
10.end for
为了测试并对比SAE的流量识别性能,本文选择最基本的深度学习模型——MLP来与之对比,实验环境参数见表2。本文设计了一个简单的MLP模型用于加密流量识别,模型采用1个输入层,1 500个神经元;2个隐藏层,分别为128和32个神经元,激活函数为ReLU;1个输出层,15个神经元,激活函数为Softmax用于分类。
表2 实验环境参数
在训练过程中,将数据集随机的分成2部分:一部分是训练集,占比为60%;剩下的40%为测试集。深度学习的模型训练过程中所采用的优化器、损失函数、epoches以及mini_batch等参数信息见表3。
表3 模型训练参数设置
图4为SAE模型的训练过程中准确率和损失率的变化趋势。可以看出,在200个训练周期中,SAE模型的准确率稳定攀升,直至0.99,最后趋于稳定;而损失率持续下降并趋于稳定。
图4 训练过程中的准确率和损失率变化曲线
为了评估模型的性能,本文采用以下2类指标:
1)精确率和召回率
误报(False Positive,FP)是指非类别C(C指代一个特定的类别)的流量被分类成为类别C;真阴性(True Negative,TN)是指非类别C的流被分成非类别C;漏报(False Negative,FN)是指属于类别C的流量被分类为非类别C;真阳性(True Positive,TP)是指属于类别C的流量而被分类成类别C。
精确率(Precision)和召回率(Recall)计算如下:
(10)
(11)
2)F1-Score
F1-Score是精确率和召回率加权调和平均,用于综合反映整体的指标[18],最常见的F1-Score计算公式为:
(12)
为了验证不平衡数据集与平衡数据集对分类性能的影响,本文分别用节2.2中所描述2种数据集,采用基于MLP的深度学习方法进行模型训练和测试,得出的分类混淆矩阵如图5所示。在该矩阵中,对角线上的元素代表分类正确的样本数量,其他元素均为误判。可以非常明显地看出,图5(a)中有不少分类错误的样本,而图5(b)中分类性能较好。可以看出,不平衡数据集对于分类器的性能有直接的影响,因此本文中后续的实验均基于第2.2节所描述的平衡数据集,以期最大程度上减少对分类性能的影响。
图5 基于平衡、不平衡数据集的MLP识别方法混淆矩阵
图6展示了基于平衡数据集训练出来的MLP和SAE 2种加密流量识别方法的分类混淆矩阵。从对角线上的元素数量,也即分类正确的样本数量来看,基于SAE的分类方法要高于MLP方法。比如,对于aim_chat与ICQ这2种加密应用而言,因均为聊天类的应用,所以流量特征方面较为相近,容易造成误判。在MLP识别方法中,aim_chat被误判为ICQ的样本数量高达174,已接近测试集的10%;而在SAE识别方法中,aim_chat被误判为ICQ的样本数量仅为59,大致为测试集的3%。
图6 基于SAE、MLP的加密流量识别方法混淆矩阵
从混淆矩阵中还不能直观的反映出2种方法的分类性能,图7和图8分别展示了MLP和SAE 2种加密流量识别方法在精确度、召回率和F1-Score 3个指标上的对比。虽然基于MLP的加密流量识别方法显示出比较好的性能,但可以明显看出,在aim_chat、Facebook、hangout和ICQ这4种流量特征相近的即时通信类加密应用的分类性能上,有比较大的差距。而图8所展示出的基于SAE的加密流量识别方法则展示出了很好的分类性能。从表4中更能清晰地看到每一种加密应用的3项指标,尤其是总体指标,可以看出,基于SAE的加密流量识别方法在分类精度、召回率和F1-Score 3项指标均达到99%,高于基于MLP的加密流量识别方法的指标(96%),显示出了优秀的分类性能。
图7 基于MLP方法的精度、召回率和F1-Score
图8 基于SAE方法的精度、召回率和F1-Score
表4 SAE、MLP的精确度、召回率和F1-Score
本文提出一种基于SAE的深度学习方法对加密应用流量进行分类识别,利用SAE的无监督特性及在数据降维方面的优势,并结合MLP的有监督分类学习,实现对加密流量的准确识别。同时考虑到样本数据集的类别不平衡性对分类精度的影响,本文采用SMOTE过抽样方法对不平衡数据集进行处理。实验结果表明,该方法在样本数据集类别平衡的情况下识别精确度和召回率可以达到99%。在未来工作中,将进一步减少训练参数,并研究采用非监督的方式对加密应用实现准确识别。