查看文章 |
在2006年趋势大赛中,题目要求对应用协议进行识别,而我后来想到一个别人可能觉得很不实际的方法(比赛的落败可能也是这个原因)。在此我想谈谈我这个方法。这是一个基于文本分类的方法(虽然我当时还没有系统学过IR)。 可能当你看到这里就已经觉得我小题大做,因为网络协议的格式都是有所规定的,查阅RFC文档会有详细的说明。但在此我再次提醒几点。 1、 这时应用层的协议,如Http,ftp,snmp,ssh,pop,imap等等,它们虽然有相应的格式指令,但却不像网络协议那样固定位置有固定标志,这些应用协议头的协议长度和内容位置都不定的,当然上述的困难可以通过对协议头进行句法分析解决,但前提是我们能截获协议。 2、 要保证截获协议头,就一定要保证该应用程序发出的每一个数据包都截获并分析(注意:有些狡猾的程序会在不同时间在同一端口发送不同协议的包,例Http,ftp它都用21端,虽然这种情况很罕见,但完全可以实现)。如果每个包都截下分析的话,你的CPU占用率内存占用率绝对高居不下,遇到传送大文件的情况,你的系统很可能崩溃。这样就要求只能抽样检查,但这样就不能保证一定截获协议头,或者更准确地说是完整的协议头(因为TCP,UPP都会分片),例如一个1K大小的包会被分成24B和1000B的两个包发送,你可能只截获前者) 现在开始正式介绍我们的识别流程: 1、 收集样本数据,这个过程是无技术性的,就是开着一个截包器,侦听特点端口的包,当然这样端口我们已经知道是什么协议了,例如80端口是Http),然后不停使用该程序收发包,这样就可以获得特定协议的大量包的文本。 2、 提取特定协议关键字,当然这个过程也包含去掉停止词的工作。提取特定协议关键字过程如下:A、 英文分词后,我们将获得词表w:{w1,w2,……wn} B、 按出现Wi的文档个数对Wi排序 C、 去掉与采样环境相关的词,如果这些有采样者提供采样对经常去某一站点,就应该自身出现次数顺序排在词表开头,目的是保留这些关键字。 D、把PFC文档中涉及该协议的词提取出来,并让它们按照自身出现次数顺排在词表开头,目的是保留这些关键字。 E、 把排序后词表的前1000位的词提取出来。3、 对各类关键字赋权,经过对各个协议(这里共是7个协议的关键字提取后,我们大约获得6000多个词,因为不同协议有相同的关键词),把tif方法把区分度低的词去掉,当然我们保留RFC文档提到的关键字。最后对剩下的1000个词赋权(7维向量),此时RFC文档中的词会乘以一个系数以获得更好的区分度。 该模型最大缺点就是很多参数要通过实验和经验来调整,因此我正在想利用贝叶斯图模型来获得更好的解决方案。 |