基于上面对网络流量数据采集的种种讨论,下面介绍第三种方法,采用建立流量监控工作站Traf— fie Monitoring Workstation的方法o 3.1 系统组成 采用流量监控工作站的方法,首先需要满足一 定的条件,即所有到路由器的流量该工作站都能监 听到,否则会造成流量数据的不可靠。我们采用让 路由器和流量监控工作站处在同一个物理网段上来 实现这种方法,因此这必须是完完全全的第一层的 互连设备。流量监控工作站的网卡必须使用混杂 (promiscuous)模式,以便能接收到以太网上所有的 数据包。 系统主要包括数据采集和数据分析这两个部 分,还包括数据库存储等其它方面。 3.2 网络拓扑 3.2.1 路由器/网关方式 在该方式中,刷流量监控系统与路由器处于同一物 理网段,所有经过路由器侗关的数据包都会经过流 量监控工作站,而且可同时进行流量统计和访问控 制,用户需要登录才可以访问互联网,如图1所示。 I 图l 路由器/网关方式 3.2.2 侦听方式 在该方式中,流量监控系统处于侦听状态,实际 的网络数据包并不直接经过该工作站,而是直接经过 路由器侗关,这种监控系统只进行流量统计,不提供 访问控制,用户访问互联网不需要登录,如图2所示。 图2 侦听方式 3.3 实现方法刷网站流量的采集通常方法都是通过一定的捕获 机制,捕获所有经过路由器的数据包,通过拆包分析 包头的内容,获得IP包头的一些主要参数,其中最常 用的就是源IP地址、目的IP地址、数据包的总长度。 众所周知,以太网络是广播型的网络,网上的站 点共享信道,一站点发出数据,其它站点均能收到。 面目前大多数网络主机都使用以太网卡,在默认设 置下,以太网卡只接受到达本地的数据包,而过滤掉 其它数据包。但以太网卡有一个“混杂模式”选项, 可以关掉过滤功能,从而检查途经网卡的所有数据 包。通过这种捕获机制,就可以将途经路由器的数 据包全部抓获。 数据采集和数据分析是获得网络刷流量的两个重 要环节。而数据采集又是其中最重要也是最复杂 的,下面我们主要来讨论一下数据采集方法。 从网络上抓获数据主要两种方法H J:一是采用 专用的硬件,另一种是使用连接到网络中的PC和 工作站。在第二种方法中,计算机的网卡用来获得 网络中的帧,而软件完成了大量的捕获过程。想要 从网络上截获数据包,必须和网卡打交道,所以操作 系统必须提供一套捕获原语来从网卡发送和接收数 据,这些原语的目的主要是从网络上截获数据,屏蔽 与网卡的交互,并且把他们传递给调用函数。这种 方法对操作系统的依赖性很强,因此不同的操作系 统实现起来也大相径庭。内核中的数据包捕获部分 必须迅速和有效,因为它必须能够工作在流量负荷 较大的高速链路上,同时能够把丢包率控制在一定 的范围里,并且使用较少的系统资源。我们可以通 过一个捕获栈来直观了解捕获的整个实现过程,下 面是一个捕获栈的结构,如图3所示。
最底层的是网卡,用来抓获网络中传送的数据 包。在捕获过程中,网卡通常工作在混杂模式,强行
接收所有的数据包。数据包捕获驱动(Packet cap— ture driver)是捕获栈最底层的软件模块,它是工作 在内核级别的,通过与网卡进行交互来获得数据包。 它向应用程序提供了一套访问数据链路层的函数, 以便应用程序能够从网络中发送和读取。Packet, dn工作在用户级别,但它与捕获程序是分离的。它 是从驱动程序中分离出来的,向应用程序提供与系 统独立的捕获接口。Pcap或者叫libcap是应用程序 的数据包捕获部分的一个静态库【5 J,它使用由 Packet,dll提供的服务,向应用程序提供一个高层的 有力的数据包捕获接口。用户接口是捕获程序的最 高层,它负责与用户的交互并显示捕获结果。 上面的这个捕获结构从宏观上展示了整个数据 包捕获的过程,但是在实际的捕获过程中还需要做 些改善,主要有以下3个方面: (1)把丢包率限制在一定的范围内。数据包捕 获驱动程序应当建立一个缓冲区,当应用程序还未 做好准备来处理所接受到的数据包的时候可以将其 存储在该缓冲区内,从而控制了丢包。应用程序一 旦准备好,被存储在缓冲区中的数据包应当能够立 刻传送给应用程序。 (2)为了使应用程序和驱动程序之间内容交换 的次数最少,它们应当分别工作在用户级别和内核 级别,并且使用单一的读调用来传送数据包。 (3)应用程序应当只接收自己感兴趣的数据包。 这就要求数据包捕获驱动程序只传送对应用程序有 用的包,因此应用程序必须设置过滤器对所接收到的 数据包进行过滤,以接收满足过滤器的数据包。 UNIX环境下享誉盛名的BPF(Berkeley Packet Filter)~好地完成了这几个方面。BPF结构在整个 协议栈中的位置示意图如图4所示。 BPF使得每个捕获过程都要经过过滤器和两 个缓冲区。过滤器是由应用程序产生的,通过一个 IoCTL调用传递给BPF。缓冲区是由BPF静态分 配的,通常为4k,这两个缓冲区中第一个缓冲区 (store buffer)是从网卡中获得数据,第二个缓冲区 (hold buffer)是把数据包拷贝到应用程序中去,当第 一个缓冲区满而第二个缓冲区空的话,BPF对其进 行交换,这样一来不会与网卡驱动程序互相干扰,二 来可以解决应用程序来不及处珊数据包时的存包问 题,大大减小了丢包率。 Tap用来设置把数据包反馈给应用程序的过滤 器,这个过滤器由用户自己来定义,接收用户自己感 兴趣的数据,这其中包括接收 些包,以及拷贝哪些
字节,这样就极大地加快了应用程序处理的速度,节 省了CPU 资源。网卡设置成混杂模式后,强行接收所有网络中 流经该工作站的数据包,这是由网卡驱动程序(NIC Driver)完成的。接收到了数据包后,由network tap 来处理,network tap是BPF代码中的回调函数,当 数据包到来时,网卡驱动程序唤醒它,network tap 接收到数据包拷贝后,向上传送至过滤器,在过滤器 中进行过滤,如果是用户感兴趣的,就被过滤器接 收,否则丢弃。当数据包被过滤器所接收时,如果应 用程序已经准备好了接收数据包,数据包会立即被 拷贝到应用程序的缓冲区中去;如果应用程序没有 准备好接收,为了避免丢包,必须将数据包传送到内 核缓冲区(kernel buffer)中存储起来,一旦应用程序 准备好,就把它拷贝到应用程序的缓冲区中去。 过滤器有个特点,就是不仅可以返回是否接收这个数据包,还可以返回要拷贝的数据包部分的长 度,这样就极大地优化了捕获过程,因为只有应用程 序需要的部分才被拷贝过来,很大地节省了CPU 和 缓冲区的资源。 当新的数据包到达内核缓冲区的时候,如果缓 冲区已满,则数据包会被丢弃。内核缓冲区的大小 对于整个捕获过程的效率有很大的影响。事实上, 一个捕获应用程序对每个数据包进行处理的时候, 还要和其它的应用程序分享CPU 资源,这是无法与流量负荷较大时的网络速度相比的,尤其是在速度 较慢的机器上这个问题更加明显。而驱动程序是运 行在内核级别上的,所以处理速度非常快,通常是不 会丢包的,因此在应用程序忙的时候,开辟一段缓冲 区来存放那些数据包可以避免应用程序较慢的处理 速度和网络流量大的时候所引起的丢包。 应用程序在接收到了拷贝之后,通过Packet.dll 这个动态链接库提供的捕获接口,并调用Libpcap 库中的函数完成对数据包的分析和处理。对于我们 十分关心的流量统计,都可以在应用程序中去完成, 整个捕获的实现过程就是这样的。