网络流量在线分析系统的设计与实现Word文档下载推荐.docx
《网络流量在线分析系统的设计与实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《网络流量在线分析系统的设计与实现Word文档下载推荐.docx(42页珍藏版)》请在冰豆网上搜索。
在这些统计数据的基础上分析不同网络应用的流量特征。
二、实训内容
(1)能够实时抓取网络中的数据包。
并实时显示在程序界面上。
用户可自定义过滤条件以抓取所需要的数据包。
(2)分析各个网络协议格式,能够显示各协议字段的实际意义。
例如,能够通过该程序反映TCP三次握手的实现过程。
(3)采用Hash链表的形式将网络数据以连接(双向流)的形式存储。
例如,抓取一段时间(如30分钟)的网络流量,将该段时间以固定时长(如1分钟)为单位分成若干个时间片,计算网络连接在每一个时间片内的相关统计量。
并在上述统计数据的基础上分析不同应用如WEB、DNS、在线视频等服务的流量特征。
注意,可根据实际的流量分析需要自己定义相关的统计量。
三、主要设备及环境
硬件设备:
(1)台式计算机或笔记本计算机(含网络适配器)
软件设备:
(2)Windows操作系统
(3)网络数据包捕获函数包,Windows平台为winpcap
(4)编程语言选用C/C++。
(5)编程环境为codeblocks
四、设计与步骤
(1)设计代码检索机器所连接的所有网络适配器,并在屏幕中显示适配器的名称和详细信息,用户可以输入适配器编号选择指定的适配器用来捕获包,如果没有找到适配器,提示用户检查WinPcap是否安装,代码与结果显示如下:
/*setthesource*/
if(pcap_createsrcstr(source,PCAP_SRC_IFLOCAL,NULL,NULL,NULL,errbuf)==-1){
printf("
%s\n"
errbuf);
exit(-1);
}
printf("
source:
%s"
source);
/*findalldevices*/
if(pcap_findalldevs_ex(source,NULL,&
alldevs,errbuf)==-1){
/*chooseonedevices*/
d=alldevs;
while(d!
=NULL){
%s,%s\n"
d->
name,d->
description);
d=d->
next;
chooseadevice[numberbetween1to4]:
"
);
scanf("
%d"
&
i);
while(--i)
printf("
\n----------------------------------------------\n"
selecteddevice:
%s\n"
name);
实验结果显示如下:
(2)选择指定适配器后,调用ifprint();
函数计算本机的IP地址、掩码、广播地址、目标地址等信息,并用声明staticcharb;
用来记录本机IP地址,为接下来查找Hash表判断流量包的流向做准备:
voidifprint(pcap_if_t*d)
{
pcap_addr_t*a;
/*名称*/
//printf("
d->
/*描述*/
if(d->
description)
\tDescription:
/*回环地址*/
\tLoopback:
(d->
flags&
PCAP_IF_LOOPBACK)?
yes"
:
no"
/*IP地址*/
for(a=d->
addresses;
a;
a=a->
next)
{
printf("
\tAddressFamily:
#%d\n"
a->
addr->
sa_family);
switch(a->
sa_family)
caseAF_INET:
printf("
\tAddressFamilyName:
AF_INET\n"
if(a->
addr)
/*Y-IP地址*/
{
printf("
\tAddress:
iptos(((structsockaddr_in*)a->
addr)->
sin_addr.s_addr));
b=iptos(((structsockaddr_in*)a->
sin_addr.s_addr);
}
if(a->
netmask)
/*Y-掩码*/
\tNetmask:
netmask)->
broadaddr)
/*Y-广播地址*/
\tBroadcastAddress:
broadaddr)->
dstaddr)
/*Y-目标地址*/
\tDestinationAddress:
dstaddr)->
break;
default:
/*未知*/
Unknown\n"
}
\n"
}
/*来自tcptracert,把数字IP地址转换为点格式*/
#defineIPTOSBUFFERS12
char*iptos(u_longin)
staticcharoutput[IPTOSBUFFERS][3*4+3+1];
staticshortwhich;
u_char*p;
p=(u_char*)&
in;
which=(which+1==IPTOSBUFFERS?
0:
which+1);
sprintf(output[which],"
%d.%d.%d.%d"
p[0],p[1],p[2],p[3]);
returnoutput[which];
结果显示如下:
(3)接收到用户输入的适配器编号,打开指定适配器:
/*openonedevice*/
cap_ins_des=pcap_open(d->
name,65536,PCAP_OPENFLAG_PROMISCUOUS,1000,NULL,errbuf);
if(cap_ins_des==NULL){
pcap_freealldevs(alldevs);
(4)打开指定文件存储捕获的数据包:
/*openafiletodumpdata*/
dumpfp=pcap_dump_open(cap_ins_des,"
traffic1"
if(dumpfp==NULL){
Erroronopeningoutputfile\n"
(5)在main()函数开始做一个声明,方便用户自由选择过滤规则,声明如下:
intswitchnum;
chart1[]="
ip"
;
//ip过滤规则
chart2[]="
ipandtcp"
//tcp过滤规则
chart3[]="
ipandudp"
//udp过滤规则
chart4[]="
//mac帧过滤
charpacket_filter[100];
//thefilter
设置过滤规则时使用swich()语句判断用户输入的编号,是对应的编号与对应的过滤规则相一致:
/*getthenetmask,usedatcompilingthefilter*/
if(d->
addresses!
=NULL)
netmask=((structsockaddr_in*)(d->
addresses->
netmask))->
sin_addr.S_un.S_addr;
/*@#$%^&
*!
*/
else
netmask=0xffffff;
/*255.25.255.0*/
//netmask=0;
/*选择过滤规则*/
printf("
printf("
%d:
1,"
IP协议"
2,"
IP和TCP协议"