统计引擎利用了内核级的数据包过滤器,来有效地为收集到的数据包进行分类。为了使用这个特性,编程人员必须打开一个适配器,并且,可以使用pcap_setmode()将它设置为统计模式(statistical mode)。特别注意,必须使用MODE_STAT来作为这个函数的mode参数。
在统计模式下,编写一个用于监听TCP网络流量的程序并不复杂,代码也不多。
实现源码:
在设置为统计模式前可以设置一个过滤器来指定要捕获的协议包。如果没有设置过滤器那么整个网络数据都将被监视。一旦设置了过滤器就可以调用pcap_setmode()来设置为统计模式,之后网卡开始工作在统计模式下。
需要指出的是pcap_open_live()的第四个参数(to_ms)定义了采样的间隔,回调函数pcap_loop()每隔一定间隔就获取一次采样统计,这个采样被装入pcap_loop()的第二和第三个参数,过程如下图所示:
____________________
|struct timeval ts |
|__________________|
|bpf_u_int32 |
|caplen=16 | struct pcap_pkthdr*
|__________________| (参数2)
| bpf_u_int32 |
| len=16 |
|__________________|
________________________________
|large_integer Accepted packet |
|______________________________| uchar *
| large_integer Accepted bits | (参数3)
|______________________________|
用两个64位的计数器分别记录最近一次间隔数据包数量和比特数量。
本例子中,网卡打开时设置超时为1000毫秒,也就是说dispatcher_handler()每隔1秒就被调用一次。过滤器也设置为只监视TCP包,然后pcap_setmode() and pcap_loop()被调用,注意一个指向timeval的指针作为参数传送到pcap_loop()。这个timeval结构将用来存储个时间戳以计算两次采样的时间间隔。
dispatcher_handler()用该间隔来获取每秒的比特数和数据包数,并把着两个数显示在显示器上。
最后指出的是目前这个例子是比任何一个利用传统方法在用户层统计的包捕获程序都高效。因为统计模式需要最小数量的数据拷贝和上下环境交换,同时还有最小的内存需求,所以CPU是最优的。