传统的协议识别--基于端口的协议识别
什么是端口:
网络中多种应用层协议可以同时运行在同一台计算机的同一个 IP 地址上。由于 IP 地址与网络应用程序的关系是一对多的关系,所以主机需要通过端口号来区分不同的网络服务。
对于端口号的分配,有两种基本的方式:
1)全局分配,即由一个公认的中央机构(LANA)统一进行分配。虽然这样容易确定应用程序和端口的对应关系,但不能适应大量且迅速变化的端口使用环境;
2)本地分配,即动态分配。当某应用程序进程需要访问网络时,主机操作系统临时为该进程分配一个本地唯一的端口号。但本地分配方式使得其它主机无法获知分配情况,无法建立通信。
Internet 同时采用上述两种分配方式,将端口分成两部分:
1)保留端口,以全局方式(IANA)进行分配。这样每一个标准的服务器应用程序都拥有一个或多个全局的公认端口号;
2)另一部分是自由端口,以本地方式进行分配。当某应用程序想要通过网络和远地程序通信之前,它会首先申请自由端口号与远地程序通信,主机操作系统临时为该进程分配一个本地唯一的端口号。
随着越来越多的网络协议不使用固定的端口进行通信,基于报文端口的协议识别受到很大限制,准确性受到很大挑战。但由于基于公知端口进行协议识别操作简单,识别速度快,现在的带宽越来越大,在识别 DNS、SMTP、POP3 等目前端口比较固定的传统协议时依然有一定的价值。
基于测度的协议识别
基于测度的协议识别根据各协议产生的流测度的差异识别应用层协议。基于负载的协议识别(基于正则表达式)---重点
基于负载的协议识别主要有采用固定字符串和正则表达式来表示协议特征两种方式
采用固定字符串的方式过于笨拙,在这不在做介绍,
正则表达式:又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE)。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
正则表达式语法学习网站:http://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx