NetFlow流量采集与聚合的研究实现
近年来,随着信息技术的飞速发展,越来越多的企业和大型机构在其内部构建基于网络的应用,复杂程度及对网络的依赖程度日益提高,各种各样的网络问题也随之产生。网络流量监测是网络管理和系统管理的一个重要组成部分,网络流量数据为网络的运行和维护提供了重要信息。这些数据对网络的资源分布、容量规划、服务质量分析、错误监测与隔离、安全管理都十分重要。因此,对网络流量及相关情况实施科学合理的监管和深入分析,成为网络管理的重要环节之一;同时,它也为网络问题提供有效解决方案及进行网络的规划。
目前的网络流量分析方法主要有基于SNMP、基于实时抓包分析、基于网络探针和基于:Flow技术等几种。NetFlow基于Flow技术,目前已得到大多数网络设备厂商的支持,提供了网络监测方面非常完善的应用。基于NetFlow的流量采集方法可以获得包括源/目的主机IP、应用协议类型、源/目的端口等详细信息,根据这些信息就可以对协议(应用)、主机IP(用户)以及AS域等进行统计排行和趋势分析,也可对异常流量进行监测分析。此外,NetFlow避免了大量部署和配置监测探针的复杂过程,使得网络性能分析更加全面、灵活且简单易用。
l NetFlow技术
NetFlow是Cisco公司提出的基于Cisco IOS系统的一种应用。它用于提供网络设备上数据包形成的“流”的统计信息,并逐渐演变成为网络流量统计和安全分析的主要手段。目前利用:NetFlow可以实现网络流量监测,用户应用监控,网络安全,网络规划以及流量计费等功能。
NetFlow有两个核心的组件:NetFlow缓存,存储IP流信息;NetFlow的数据导出或传输机制,NetFlow利用此机制将数据发送到网络管理采集器。
1.1 流(Flow)的定义
一条流由一个源主机与一个目的主机间的单方向传输的网络数据包组成,其中,源和目的主机由各自的IP地址和端口号来标识。一条流一般由以下七个关键字段惟一标识:
?源地址
?目的地址
?源端口号
?目的端口号
?第3层协议类型(如TCP,UDP)
?服务类型
?入逻辑接口标示符
1.2 流(Flow)格式
启动NetFlow的设备会输出其缓冲区里的信息,以UDP包的形式传送给NetFlow流量采集器。包由包头和若干流记录组成。常用的NetFlOW输出包格式共有5个版本,它们分别是Version 1,Version 5,Ver-sion 7,Version 8和Version 9,其中V5是最为流行和成熟的版本,目前得到最广泛的使用。最新的V9已经被列入IETF的标准,并有待进一步研究和规范。V9采用了模板技术与流记录相结合的方式,使NetFlow输出包的格式具有动态和可扩展的特性。NetFlow V9的输出格式主要由三部分构成:
(1)包头部(Packet Header):包括版本号、包中数据流总数、系统时间、数据流序列、数据源ID等。
(2)模板流集(Template FlowSet):包含一个或多个模板,模板是用于描绘数据流中各个数据段的含义,可以在路由器上根据需要自行设置模板。
(3)数据流集(。Data FlowSet):包含多个数据流,每个数据流集通过模板ID对应某个模板。数据采集端根据模板来解析数据流。
2 NetFlow流量采集与聚合
2.1 系统概述
根据NetFlow的特点,设计并实现了一个网络流量监测系统,其系统结构如图1所示。
当NetFlow采集器接收到从路由器发送来的Net-Flow数据包后,采集器将进行数据包的解析和数据流聚合,形成多种适合统计分析需要的数据,再分门别类地存入数据库。分析器则根据前端不同的查询请求,依照一定的查询策略从数据库不同的表中提取相应数据进行分析展现。
本系统的后台采集器和聚合处理部分用JAVA编写实现,数据库采用开源的MySQL,而NetFlow流量分析利用Tomcat服务器通过Web方式展现,前台部分用JSP编写实现。工作的重点即在于数据采集、数据聚合以及数据库设计部分。
2.2 NetFlow流采集
2.2.1 采集器的设计
数据采集模块是整个系统的基础。由于。NetFlow数据流量非常大,为防止丢包系统采用缓冲区和线程池结构,如图2所示。
当采集器监听到一个NetFlow数据包时,将该数据包接收到缓冲区,并从包解析线程池中取出一个线程,根据相应的NetFlow的报文格式解析出数据流信息,将该原始流信息放入缓冲区,然后将原始流存入数据库,同时采用相应的聚合策略聚合原始流生成聚合流并存入相应的数据库中。
2.2.2 NetFlow数据包接收与解析
由于NetFlow数据是借助于UDP数据报来传送,因而倘若后续的处理速度跟不上数据包到达的速度,则会出现严重丢包的现象。为解决高速大流量数据的及时接收及较低丢包率问题,采用了多线程的方式来实现。用独立的两个线程分别完成数据接收和解析操作:接收数据的线程在特定的IP地址监听相应的UDP端口,接收到的数据暂存在缓冲区中;解析线程从缓冲区提取数据,按照相应的报文格式进行解析。由于接收线程和解析线程共享同一个临界资源,即接收的缓冲区,需要对临界资源进行加锁操作。
下面为部分实现多线程采集的JAVA代码实例,其中packet为接收的NetFlow数据包对象,linkedLst为linkedList容器,利用synchronized进行线程间同步。
(1) 接收线程
- 气动泵流量控制系统的设计(06-27)
- 一种新型超声多普勒流量计探头的设计(07-07)
- 基于单片机的气体流量计检测仪(12-13)
- 数控流量比值控制系统设计(01-18)
- 电磁流量计的AD饱和故障及其排除(03-28)
- LDE流量计和V锥流量计的在线验证方法(12-07)