如何识别网络应用层协议?
能够标识出 Internet上每个流所使用的应用层协议是一系列网络应用的前提和基础。然而随着网络的高速化和协议的复杂化,传统的基于端 口识别应用层协议的算法已经不够准确,因此各种新的协议识别算法成为研究热点 。
本篇文章将重点介绍协议识别问题的几个基本概念 ,以及目前主要实现方式各自的优缺点及关键技术和当前具有代表性的实现项目。
一、基本概念
1.1 流
指在某一段固定时间间隔内通过网络上一个观测点的 IP报文集合。属于一个特定流的所有报文有一些相同的属性。 应用层协议识别的对象不是单个报文,而是将“流”作为一个整体考虑。
1.2 协议识别
标识出网络上每个流所使用的应用层协议 ,其是基于使用类型的流分类的延伸和精化。在基于使用类型的流分类问题中,每个类别可能包含某些属性类似的多种协议 ,但协议识别问题必须对流进行更精细的分类 , 使得每个类别中的流只使用一种应用层协议。
1.3 流分类
指利用流以及流中报文的某些信息将网络上的流分成既定的若干类别 (如长流/短流,快流/慢 流,或者各种使用类型的流),其是报文分类的扩展。
1.4 解决协议识别问题的基本思路
从本质上看 ,协议识别问题是多元统计学中的判别,分析在实际中的应用。首先根据所选择的 维流信息将流分为 k个类别 ,每个 类别对应一个协议,对于新到来的流,计算其 自身的n维流信 息值 ,根据结果将其划分到相应的类别中,给出类别号即协议名。从理论上说 ,流中每个报文的任意字段或流传输过程 中 的任何特性都可以作为一维的流信息即协议识别的依据。但实际使用中,如何选择最有效的流信息维度是面临的最大困难 。
二、实现方式
2.1 基于端口识别协议
这是最简单也是识别正确率最低的一种方式,传统的应用层协议识别算法只利用了端 口号一 维信息,其根据各个应用层协议在中注册的端 口号 来标识 协议 。例 如 ,若某个 TCP流使用 了端 口号 80、8080或 443,则将其标记为 Web流量,53端口识别为dns等。
2.2 基于负载识别协议
基于负载的算法仍是一个一元判别 问题 ,其需要事先详细分析待识别的应用层协议,找出其交互过程中不 同于其他任何协议的字段,作为该协议的特征。在识别的过 程中,该类算法检查流中每个报文 TCP首部之后的负载部分 ,若匹配到某协议的特征 ,则将该流标记为相应的协议。基 于负载的算法不仅能识别出使用单一连接进行通信的协议 ,而且能够识别出如 PASVFTP、流媒体等使用多个连接、动态端口进行通信的协议。在这些协议 中,数据传输所使用的端口是在事先建立的控制连接中协商的。基于负载的算法检查控制连接中的每个报文 ,找出协商得到的端口号,并以此端口识别数据连接 。
优缺点:正确率高,不过当协议规范发生变化或者新协议出现时,寻找特征的工作必须重新进行,工作量非常大,更新困难 ,因此 ,该类算法通常只被用在需准确识别数量较少的协议时,且需要有相当的工作量。
2.3 基于测度识别协议
基于测度识别协议的算法利用协议规范的不同所造成的流测度的差异区别各个协 议 。例如 ,Web流一般为短流小报 文 ,而 P2P流一般为长 流大报文 。基 于测度 的算法 要求事先有标准的训练集可用,即要用已按各个协议分类的 报文集合来训练识别器,使其在使用的过程中根据已知的标 准答案和新计算 的流测 度 ,按 照某 种判别算法得出当前流所属的类别 ,即所使用的协议 。
优缺点:成熟度不够,样本需求大,相关开源实现项目少;
2.4 基于行为特征的协议识别
将各个应用层协议的特点进行收集整理,对比数据包,匹配出对应的应用层协议。它需要训练数据集作为输入,构建一个分类器或者分类模型,通过模型识别为哪一种应用层协议
2.5 综合算法
综合上述方式实现对应用层协议的解析。
三、WireShark的识别方式
3.1 实现过程
1.基于传输层协议获取可能的应用层协议集合,例如基于udp实现的可能是dns、zookper等,基于tcp可能为http、grpc等;下图为TCP/IP详解一书中关于协议的引用。
2.基于负载匹配行为特征
3.2 源码分析 todo
四、参考链接
1.陈 亮 龚 俭 徐 选. 应用层协议识别算法综述