网络流量在线分析系统的设计与实现.docx
《网络流量在线分析系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《网络流量在线分析系统的设计与实现.docx(42页珍藏版)》请在冰豆网上搜索。
综合实训报告
题目:
网络流量在线分析系统的设计与实现
信息学院计算机科学系
目录
一、实训目的………………………………………………3
二、实训内容………………………………………………3
三、主要设备及环境………………………………………3
四、设计与步骤……………………………………………4
五、过程与调试……………………………………………22
六、整理与小结……………………………………………23
七、参考文献………………………………………………24
八、附录……………………………………………………25
一、实训目的
设计并实现一个网络流量的分析系统。
该系统具有以下功能:
(1)实时抓取网络数据。
(2)网络协议分析与显示。
(3)将网络数据包聚合成数据流,以源IP、目的IP、源端口、目的端口及协议等五元组的形式存储。
(4)计算并显示固定时间间隔内网络连接(双向流)的统计量(如上行与下行的数据包数目,上行与下行的数据量大小等)。
在这些统计数据的基础上分析不同网络应用的流量特征。
二、实训内容
(1)能够实时抓取网络中的数据包。
并实时显示在程序界面上。
用户可自定义过滤条件以抓取所需要的数据包。
(2)分析各个网络协议格式,能够显示各协议字段的实际意义。
例如,能够通过该程序反映TCP三次握手的实现过程。
(3)采用Hash链表的形式将网络数据以连接(双向流)的形式存储。
(4)计算并显示固定时间间隔内网络连接(双向流)的统计量(如上行与下行的数据包数目,上行与下行的数据量大小等)。
例如,抓取一段时间(如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){
printf("%s\n",errbuf);
exit(-1);
}
/*chooseonedevices*/
d=alldevs;
while(d!
=NULL){
printf("%s,%s\n",d->name,d->description);
d=d->next;
}
printf("chooseadevice[numberbetween1to4]:
");
scanf("%d",&i);
d=alldevs;
while(--i)
d=d->next;
printf("\n----------------------------------------------\n");
printf("selecteddevice:
%s\n",d->name);
实验结果显示如下:
(2)选择指定适配器后,调用ifprint();函数计算本机的IP地址、掩码、广播地址、目标地址等信息,并用声明staticcharb;用来记录本机IP地址,为接下来查找Hash表判断流量包的流向做准备:
voidifprint(pcap_if_t*d)
{
pcap_addr_t*a;
/*名称*/
//printf("%s\n",d->name);
/*描述*/
if(d->description)
printf("\tDescription:
%s\n",d->description);
/*回环地址*/
printf("\tLoopback:
%s\n",(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->addr->sa_family)
{
caseAF_INET:
printf("\tAddressFamilyName:
AF_INET\n");
if(a->addr)
/*Y-IP地址*/
{
printf("\tAddress:
%s\n",iptos(((structsockaddr_in*)a->addr)->sin_addr.s_addr));
b=iptos(((structsockaddr_in*)a->addr)->sin_addr.s_addr);
}
if(a->netmask)
/*Y-掩码*/
printf("\tNetmask:
%s\n",iptos(((structsockaddr_in*)a->netmask)->sin_addr.s_addr));
if(a->broadaddr)
/*Y-广播地址*/
printf("\tBroadcastAddress:
%s\n",iptos(((structsockaddr_in*)a->broadaddr)->sin_addr.s_addr));
if(a->dstaddr)
/*Y-目标地址*/
printf("\tDestinationAddress:
%s\n",iptos(((structsockaddr_in*)a->dstaddr)->sin_addr.s_addr));
break;
default:
/*未知*/
printf("\tAddressFamilyName:
Unknown\n");
break;
}
}
printf("\n");
}
/*来自tcptracert,把数字IP地址转换为点格式*/
#defineIPTOSBUFFERS12
char*iptos(u_longin)
{
staticcharoutput[IPTOSBUFFERS][3*4+3+1];
staticshortwhich;
u_char*p;
p=(u_char*)∈
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){
printf("%s\n",errbuf);
pcap_freealldevs(alldevs);
exit(-1);
}
(4)打开指定文件存储捕获的数据包:
/*openafiletodumpdata*/
dumpfp=pcap_dump_open(cap_ins_des,"traffic1");
if(dumpfp==NULL){
printf("Erroronopeningoutputfile\n");
exit(-1);
}
(5)在main()函数开始做一个声明,方便用户自由选择过滤规则,声明如下:
intswitchnum;
chart1[]="ip";//ip过滤规则
chart2[]="ipandtcp";//tcp过滤规则
chart3[]="ipandudp";//udp过滤规则
chart4[]="";//mac帧过滤
charpacket_filter[100]; //thefilter
设置过滤规则时使用swich()语句判断用户输入的编号,是对应的编号与对应的过滤规则相一致:
/*openafiletodumpdata*/
dumpfp=pcap_dump_open(cap_ins_des,"traffic1");
if(dumpfp==NULL){
printf("Erroronopeningoutputfile\n");
exit(-1);
}
/*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("\n----------------------------------------------\n");
printf("%d:
%s\n",1,"IP协议");
printf("%d:
%s\n",2,"IP和TCP协议");