监控IP包的流量.docx
《监控IP包的流量.docx》由会员分享,可在线阅读,更多相关《监控IP包的流量.docx(10页珍藏版)》请在冰豆网上搜索。
监控IP包的流量
计算机网络课程设计报告
课题:
监控IP包的流量
专业班级:
计科10101班
(学号):
鸣宇(201017010103)
:
玮(201017010143)
指导教师:
梅晓勇
评阅意见:
评定成绩:
指导老师签名:
年月日
一目的和意义
从社会角度来说,随着人们对Internet的依赖性越来越高,网络传输的业务类型变得缤纷多彩,在此背景下,需要对网络状况,网络性能进行准确的检测和评估,而这次课程设计正是对流量工程容研究。
从学习的角度来说,此次课程设计将我们带入网络编程领域,进一步网络知识的应用,监控IP包的流量课程设计让我们进一步了解IP协议的基本容,对于掌握TCP/IP协议的主要容和学习网络课程是十分重要的,此外,也加深了对Winpcap的理解和运用能力,同时也增长了知识,开阔了视野,对于以后的学习有很大的帮助。
二基本原理
2.1概述
1.IP协议
IP是TCP/IP模型中的网络层协议,又称为互联网协议,是支持网间互连的数据报协议,它与TCP协议一起构成了TCP/IP协议族的核心。
它提供网间连接的完善功能,包括IP数据报规定互联网围的IP地址格式[2]。
在因特网中IP协议是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。
任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。
IP地址具有唯一性,根据用户性质的不同,可以分为不同的类别。
IP协议的特点如下:
(1)IP协议是一种不可靠、无连接的数据报传送协议。
(2)IP协议是点对点的网络层通信协议。
(3)IP协议向通信层隐藏了物理网络的差异。
(4)IP协议以一种数据报的形式传输数据,每个数据报独立传输,可能通过不同路径传输,因此可能不按顺序到达目的地,或者出现重复。
2.关于Winpcap库
Winpcap(windowspacketcapture)是windows平台下一个买费的、公共的基于windows的网络接口API库。
主要为win32应用程序提供访问网络底层的能力。
Winpcap的主要功能在于独立于主机协议(如TCP/IP)发送和接收原始数据报。
也就是说,Winpcap不能阻塞、过滤或控制其他应用程序数据报的收发,它只是监听共享网络上传送的数据报。
因此,它不能用于QoS调度程序或个人防火墙。
其功能有:
(1)捕获原始数据包,包括在共享网络上各主机发送接收的以及相互之间
交换的数据包;
(2)捕获原始数据包,包括在共享网络上各主机发送接收的以及相互之间
(3)在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包
过滤掉;
(4)在网络上发送原始数据包;
(5)收集网络通信过程中的统计信息。
2.2作用
对IP包流量的控制主要是通过用VC++编程实现对网络中IP数据包流量的统计,实际上是编制程序,监控网络,捕获一段时间网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段发出的IP包的个数。
程序中会用到Winpcap,它主要功能在于独立于主机协议发送和接收原始数据报。
本次课程设计中用VC++实现基于Winpcap的网络数据包的捕获和统计,基于Winpcap的应用程序将根据获取网络设备列表;选择网卡并打开;设置过滤器;捕获数据包或者发送数据包;列出网卡列表,让用户选择可用的网卡的步骤进行编写
三需求分析
3.1系统功能需求分析
近年来,网络病毒的出现和传播更加剧了网络状况的复杂和不稳定性.在此背景下,需要对网络状况,网络性能进行准确的检测和评估,而这些正是流量工程的研究容.而流量工程的主要任务是测量和评估网络的运行状况,性能。
并能够容易地使网络的最终用户看到和理解评估结果,能够对网络中的突发时间能够做出积极有效的反应,以及研究和改进网络协议,网络工作模式的机制,以促进网络服务的可靠性,保证网络的正常运行。
而我们在在这个课程设计里将编制一个程序,监控网络,捕获一段时间网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段发出的IP包的个数,将其写入日志文件中或用图形表示出来。
3.2功能函数部分
本次课程设计主要运用了以下功能函数:
1系统函数——
1)pcap_findalldevs(&alldevs,errbuf)
说明:
用来获得网卡的列表,alldevs为网络适配器的列表的指针;char型指针,当打开列表错误时返回错误信息
2)pcap_open_live(head->name,1000,1,1000,errbuf)
说明:
以混杂模式方式打开网卡,name为要抓取的网络设备的字符串,最大可抓取的字节长度为1000字节,超时时间为1000ms,当在超时上没有数据到来时对网卡的读操作将返回错误信息
3)pcap_compile(fp,&fcode,packet_filter,1,netmask)
说明:
编译过滤器,fp是对网卡描述符,型号、名字,fcode是一个bpf_program结构的指针,在pcap_compile()函数中被赋值。
1表示对结果代码进行优化。
netmask参数指定本地网络的网络掩码
4)pcap_setfilter(fp,&fcode)
5)说明:
设置过滤器,用来联系一个在核驱动上过滤的过滤器,一旦调用,这时所
有网络数据包都将流经相关的过滤器,并拷贝到应用程序中,把pcap_compile()构造的filter设置到fp上 ,
6)pcap_freealldevs(alldevs)
7)说明:
释放网络适配器列表空间
8)pcap_next_ex(fp,&header,&pkt_data)
说明:
该函数从网络设备中读取一个数据包,fp-设备指针,header-数据,pkt_data-数据包容
2.自定义函数
1)main(intargc,char*argv[])
说明:
主函数通过调用主函数和其他自定义函数,实现IP包流量监控的功能,argv[]是argc第0个参数,其中第0个参数是程序的全名,以后的参数,命令行后面跟的用户输入的参数。
2)addNode(longsourceIP)
说明:
将IP结点加入链表
四概要设计
4.1编程环境
MicrosoftVisualC++6.0
4.2模块分析
课程设计的主要目的是接收统计IP包,所以主要任务就是设置网卡以及相关的一系列操作,以下为一些主要功能模块:
(1)取得当前网络设备列表(在标准输出上显示,以让用户进行选择)。
(2)将用户选择的Ethernet卡以混杂模式打开,以接收到所有的数据包。
(3)编译并设置过滤器,此处的过滤器为“IP”。
(4)捕获IP包并按包的源地址进行统计(用链表结构进行实现)
其程序流程图如下:
五详细设计
5.1具体实现过程
首先获取网卡列表是为了得到网卡的相关信息,以便于用户进行选择,选取Ethermet网卡是用户所选择的网卡类型,编译设置过滤器是为了编译并设置过滤器是为了只捕获网络数据流的某些数据,打开网卡既将网卡设置为混杂(统计)模式是为了接受所有经过网卡的数据包,包括不是发给本机的数据包,开始主循环以是否超时为判断条件,循环体主要有捕获IP数据包、将IP包的源地址加入链表、条件判断,循环结束后输出链表容,程序至此结束。
具体的实现如下:
1取得网络适配器列表并找到要监听的网络适配器,alldevs是pcap_if_it指针,指向链表头,errbuf是char类型数组,存储错误信息[3]。
for(d=alldevs;d;d=d->next)//列出网卡列表,让用户进行选择
{cout<<++j<<":
"<name;
if(d->description)
cout<<""<description<}
for(d=alldevs,i=1;inext,i++);//找到选择的网络适配器
head=d;//
2采用混杂模式打开网络适配器
if((fp=pcap_open_live(head->name,1000,1,1000,errbuf))==NULL)
{
cout<<"\nUnabletoopentheadapter."<pcap_freealldevs(alldevs);
return;
}
3编译并设置过滤器
if(pcap_compile(fp,&fcode,packet_filter,1,netmask)<0)//编译并设置过滤器
{
cout<<"\nUnabletocompilethepacketfilter.Checkthesyntax.\n";
pcap_freealldevs(alldevs);
return;
}
if(pcap_setfilter(fp,&fcode)<0)//设置滤波器
{
cout<<"\nErrorsettingthefilter.\n";
pcap_freealldevs(alldevs);
return;
}
4在给定的时间循环捕获IP数据包,并将该IP数据包的源地址加入链表
while((res=pcap_next_ex(fp,&header,&pkt_data))>=0)
{
time(&end);//获得系统时间
if(end-beg>=min*60)//计算系统时间
break;
if(res==0)
continue;//超时
ip_header*ih;
//找到I头得位置
ih=(ip_header*)(pkt_data+14);//14为以太头的长度
link.addNode(ih->saddr);//将源IP地址加入链表
}
5.2主要数据结构
1)此次课程设计主要采用了链表数据结构,具体的实现如下:
classNodeList
{
IPNode*pHead;
IPNode*pTail;
public:
NodeList()
{
pHead=pTail=NULL;
}
~NodeList()
{
if(pHead!
=NULL)
{
IPNode*pTemp=pHead;
pHead=pHead->pNext;
deletepTemp;
}
}
2)IP部结构/structip_header
{
unsignedcharver_ihl;//版本号(4位)+头部长度(4位)
unsignedchartos;//服务类型
unsignedshorttlen;//总长度
unsignedshortidentification;//标识
unsignedshortflags_fo;//标志+片偏移
unsignedchartll;//生存时间
unsignedcharproto;//协议
unsignedshortcrc;//校验码
DWORDsaddr;//源地址
DWORDdaddr;//目的地址
unsignedintop_pad;//选项+填充
}
六实现与测试
6.1实现与测试
1)取得网络适配器列表并找到要监听的网络适配器号
.