监控IP包流量

监控IP包流量
监控IP包流量

1

计算机网络课程设计

目录

一、课程设计目的: (2)

二、课程设计要求: (2)

三、课程设计主要思路分析: (2)

四、设计流程图: (4)

五、运行结果: (5)

六、总结: (6)

参考文献 (6)

源代码: (6)

2 一、课程设计目的

随着Internet技术的发展,基于IP协议的应用成为网络技术研究与软件开

发的一个重要基础,因此学习网络层以基本概念,了解IP协议的基本内容,对

于掌握TCP/IP协议的主要内容和学习网络课程是十分重要的,通过本次课程设计,有助于熟悉IP包格式和加深对IP协议的理解。

二、课程设计要求

编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的

源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中

或用图形表示出来(建议用图形表示出统计结果)。

程序的具体要求如下:

用命令行运行:IPStatistic time logfile

其中,IPStatistic是程序名;time是设定的统计时间间隔(单位为分钟,

比如,2表示2分钟);logfile表示统计结果写入的日志文件名(若用图形表示

统计结果则可以不选这个参数)。

相关知识:

IP是ICP/IP协议体系中的网络层协议,TCP、UDP、ICMP和IGMP等其他协议都

是以IP 协议为基础的。IP的特点如下:

(1)IP协议是一种不可靠、无连接的数据报传送协议。

(2)IP协议是点对点的网络层通信协议。

(3)IP协议向通信层隐藏了物理网络的差异。

三、课程设计主要思路分析

1.课程设计中的重点及难点

(1)程序中会用到Winpcap, Winpcap是Windows packet capture的缩写,这

是UNIX下的lipbcap移植到Windows下的产物,是Win32环境下数据包捕获的

开放代码函数库。Winpcap由内核级的数据包过滤器,底层动态链接库(packet.dll)和一个高层的独立于系统的库(wpcap.dll)组成。

Winpcap提供以下功能:

1)捕获原始数据报,包括共享网络上各主机发送/接收的数据报以及各主机之间

3 交换的数据报。

2)在数据报发往应用程序之前,按照自定义的规则过滤某些特殊的数据报。

3)将用户构造的数据报发送到网络中。

4)统计网络的流量。

Winpcap的主要功能在于独立于主机协议(如TCP/IP)发送和接收原始数据报。

也就是说,Winpcap不能阻塞、过滤或控制其他应用程序数据报的收发,它只是

监听共享网络上传送的数据报。因此,它不能用于QoS调度程序或个人防火墙。

基于Winpcap的应用程序一般按照下面几个步骤编写:

1)获取网络设备列表。

2)选择网卡并打开。

3)当捕获数据包时,可能需要设置过滤器。

4)捕获数据包或者发送数据包。

Packet.dll相关数据结构

typedef struct_ADAPTER ADAPTER //描述一个网络适配器

typedef struct_PACKET PACKET具 //描述一组网络数据报的结构

typedef struct NetType NetType //描述网络类型的数据结构

typedef struct npf_if_addr npf_if_addr //描述一个网络适配器的IP地址struct bpf_hdr //数据报头部

struct bpf_stat //当前捕获数据报

(2)列出网卡列表,让用户选择可用的网卡。

(3)注意过滤器的使用,只需捕获IP所,别的包都需过滤掉。

2.参考算法

(1)取得当前网络设备列表(在标准输出上显示,以让用户进行选择)。

(2)将用户选择的Ethernet卡以混杂模式打开,以接收到所有的数据包。

(3)设置过滤器,此处的过滤器“IP”。

(4)捕获IP包并按包的源地址进行统计(用链表结构进行实现)。程序流程如

图1-1所示:

4 四、设计流程图。

图1-1程序流程图

5 五、运行结果:

安装好WinPcap软件,在VC++界面上点击工具->选项->目录。添加Include文

件夹下的所有文件和Lib下的所有内容,调试完程序无误后,点击开始—>运行“cmd”进入目标文件夹Debug下运行IPI.EXE文件并加入参数2 bl.txt。此时

程序会检测电脑系统中的网卡数,然后选择程序运行时的网络接口,耐心等待两

分钟后就会得到程序的运行结果.

图1-2系统中网络接口数

图1-3选择第一个网络接口

图1-4 1分钟之后捕获的ip地址和数据包

6 六、总结:

通过本次计算机网络课程设计,我更加充分的理解了课本上的知识,并能够加以扩展,

从而应用于实践当中,这几天的课程设计令我受益匪浅,我意识到我们所学的东西将来都是

要付诸实践的,所以一切要从实际情况出发,理论联系实际,这样才能真正发挥我们所具备

的能力。这次计算机网络课程设计历时二个星期,在整整十多天的日子里,可以说得是苦多

于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到

了很多在书本上所没有学到过的知识。以前对于编程工具的使用还处于一知半解的状态上,

但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果。通过这次

课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所

学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己

的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕

竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,

对以前所学过的知识理解得不够深刻,掌握得不够牢固。这次课程设计终于顺利完成了,在

设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身

上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导

老师再次表示忠心的感谢!

参考文献

[1] 吴功宜胡晓英.计算机网课程设计北京:机械工业出版社,2007.12.

[2] 张荛学郭国强.计算机网络与Internet教程(第二版) 北京:清华大学出版

社2006.11.

[3] 王春晓赵艳标.计算机网络教程北京:机械工业出版社,2005.08.

[4] 张仁何云.计算机网络课程设计指导北京:清华大学出版社 2006.05.

源代码:

//主程序

#include

7 #include

#include

#include

#include

#include

#include "pcap.h"

//#include "IPNodeList.h"

#pragma comment(lib,"Wpcap.lib")

#pragma comment(lib,"Ws2_32.lib")

//IP包的头部包括

struct ip_header{

unsigned char ver_ihl; //版本号(4位)+头部长度(4位)

unsigned char tos; //服务类型

unsigned short tlen; //总长度

unsigned short identification; //标识

unsigned short flags_fo; //标志+片偏移

unsigned char tll; //生存时间

unsigned char proto; //协议

unsigned short crc; //校验码

DWORD saddr; //源地址

DWORD daddr; //目的地址

unsigned int op_pad; //选项+填充

};

class IPNode

{

private:

long m_lIPAddress; //IP地址

long m_lCount; //发送数据包数

public:

8 IPNode *pNext; //指向下一个IP结点

//构造函数

IPNode(long sourceIP)

{

m_lIPAddress=sourceIP;

m_lCount=1; //初始化数据包个数为1

}

//数据包个数加1

void addCount()

{

m_lCount++;

}

//返回数据包个数

long getCount()

{

return m_lCount;

}

//返回IP地址

long getIPAddress()

{

return m_lIPAddress;

}

};

//结点链表

class NodeList

{

IPNode *pHead;

IPNode *pTail;

public:NodeList()

9 {

pHead=pTail=NULL;

}

~NodeList()

{

if(pHead!=NULL)

{

IPNode *pTemp=pHead;

pHead=pHead->pNext;

delete pTemp;

}

}

//IP结点加入链表

void addNode(long sourceIP)

{

if(pHead==NULL) //当链表为空时

{

pTail=new IPNode(sourceIP);

pHead=pTail;

pTail->pNext=NULL;

}

else //不为空时

{

for(IPNode *pTemp=pHead;pTemp;pTemp=pTemp->pNext)

{

//如果链表中存在此IP,发送数据包个数加1

if(pTemp->getIPAddress()==sourceIP)

{

pTemp->addCount();

10

break;

}

}

//如果链表中没有此IP,则加入链表

if(pTemp==NULL)

{

pTail->pNext=new IPNode(sourceIP);

pTail=pTail->pNext;

pTail->pNext=NULL;

}

}

}

//输出IP结点,即IP地址和其他送的IP包的个数

ostream& print(ostream & out)

{

for(IPNode *pTemp=pHead;pTemp;pTemp=pTemp->pNext)

{

long lTemp=pTemp->getIPAddress();

out<

out<getCount()<

}

return out;

}

};

void main(int argc,char *argv[])

{

if (argc!=3) //判断是否正确

11

cout<<"Usage:IPStatistic time logfile"<

cout<<"Press any key to continue..."<

_getch();

return;

}

double min=atof(argv[1]);

pcap_if_t *alldevs; //网络设备结构

pcap_if_t *d,*head=NULL;

pcap_t *fp; //网卡描述

char errbuf[PCAP_ERRBUF_SIZE]; //错误信息

unsigned int netmask; //子网掩码

char packet_filter[]="ip"; //过滤,选择IP协议

struct bpf_program fcode;

struct pcap_pkthdr *header;

const unsigned char *pkt_data;

//获取网络设备列表

if(pcap_findalldevs(&alldevs,errbuf) == -1)

{

cout<<"Error in pcap_findalldevs:"<

return;

}

int i=1; //网卡数

if(i==0) //无设备

{

cout<<"\nNo interfaces found! Make sure Winpacp is installed.\n";

return;

}

if(i>=1)

12

int j=0;

for(d=alldevs;d;d=d->next) //列出网卡列表,让用户进行选择

{

cout<<++j<<":"<name;

if(d->description)

cout<<" "<description<

}

cout<<"\nEnter the interface number(1-"<

int k;

cin>>k;

if(k<1||k>j)

{

cout<<"out of range"<

return;

}

for(d=alldevs,i=1;inext,i++); //找到选择的网卡

head=d;

}

//以混杂模式方式打开网卡

if((fp=pcap_open_live(head->name,1000,1,1000,errbuf))==NULL)

{

cout<<"\nUnable to open the adapter."<

pcap_freealldevs(alldevs);

return;

}

//获取子网掩码

if(head->addresses!=NULL)

netmask=((struct

sockaddr_in*)(head->addresses->netmask))->sin_addr.S_un.S_addr;

13

else

//没有地址则假设为C类地址

netmask=0xFFFFFF00;

//编译过滤器

if(pcap_compile(fp,&fcode,packet_filter,1,netmask)<0)

{

cout<<"\nUnable to compile the packet filter.Check the syntax.\n";

pcap_freealldevs(alldevs);

return;

}

//设置滤波器

if(pcap_setfilter(fp,&fcode)<0)

{

cout<<"\nError setting the filter.\n";

pcap_freealldevs(alldevs);

return;

}

//显示提示信息及每项的含义

cout<<"\t\tlistening on"<description<<"..."<

ofstream fout(argv[2],ios::app); //日志记录文件

fout<<"\tIP Statistic:("<

time_t tmp=time(NULL);

fout<

cout<<"IP Statistic:("<

fout<<" Sour ip"<<"\tpacket numbers"<

//释放设备列表

pcap_freealldevs(alldevs);

NodeList link; //存储数据用链表

int res;

14 time_t beg;

time_t end;

time(&beg); //获取当前时间

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地址加入链表

}

cout<<"Sour IP"<<'\t'<<"packet numbers"<

link.print(cout); //输出到屏幕

link.print(fout); //输出到日志

fout<

}

网络程序设计IP数据包流量统计

一、题目及要求 (一)题目:IP数据包流量统计 (二)要求:编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP 数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中或用图形表示出来(建议用图形表示出统计结果)。 用命令行运行:IPSta time logfile;其中IPSta是程序名,time是设定的统计时间间隔,logfil表示统计结果写入的日志文件名(若用图形表示统计结果则可以不选这个参数)。或在此基础上用图形化界面实现上述功能。 二、系统概要设计 (一)流量统计主要功能模块图 图中取得网络适配器列表主要是得到网卡的相关信息,即网卡的个数、连接情况等,选择要监听的网络适配器就是要用户选择网卡,编译并设置过滤器是为了只捕获网络数据流的某些数据,将网络适配器设置为统计模式就是接受所有经过网卡的数据包,包括不是发给本机的数据包,接下来的任务就是开始主循环调用回调函数来显示网络流量了。

(二)程序流程图

图中获取网卡列表是为了得到网卡的相关信息,以便于用户进行选择,选取Ethermet网卡是用户所选择的网卡类型,编译设置过滤器是为了编译并设置过滤器是为了只捕获网络数据流的某些数据,打开网卡既将网卡设置为混杂(统计)模式是为了接受所有经过网卡的数据包,包括不是发给本机的数据包,开始主循环以是否超时为判断条件,循环体内主要有捕获IP数据包、将IP包的源地址加入链表、条件判断,循环结束后输出链表内容,程序至此结束。 三、系统详细设计 1. 取得网络适配器列表 //取得网络适配器列表步骤中,alldevs是pcap_if_it指针,指向链表头,errbuf 是char类型数组,存储错误信息[3]。 pcap_findalldevs(&alldevs,errbuf); cout<<”网络适配器列表:”<<’\n’; for(d=alldevs;d;d=d->next) { cout<<++i<<":"<name; if (d->description) cout<<""<description; else cout<<"No description available!"<<'\n'; } 2. 指定要监听的网络适配器并打开 cout<<”输入要监听的网络适配器号:”<>inum; for(d=alldevs,i=0;inext,i++); fp=pcap_open_live(d->name,65536,1,1000,errbuf); 3. 编译并设置过滤器 //编译过滤器,fp指向打开的网络适配器,fcode为编译完成后的过滤器存储地址,“tcp“给出了过滤条件,下一个参数表示是否被优化(0为false,1为

ip包流量监控实验报告

目录 一、课程设计目的 (2) 二、课程设计要求 (2) 三、课程设计分析 (2) 四、运行结果: (5) 五、心得体会: (5) 参考文献 (7) 源代码: ............................................................ 错误!未定义书签。

一、课程设计目的 随着Internet技术的发展,基于IP协议的应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层以基本概念,了解IP协议的基本内容,对于掌握TCP/IP协议的主要内容和学习网络课程是十分重要的,通过本次课程设计,有助于熟悉IP包格式和加深对IP协议的理解。 二、课程设计要求 编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中或用图形表示出来(建议用图形表示出统计结果)。 程序的具体要求如下: 用命令行运行:IPStatistic time logfile 其中,IPStatistic是程序名;time是设定的统计时间间隔(单位为分钟,比如,2表示2分钟);logfile表示统计结果写入的日志文件名(若用图形表示统计结果则可以不选这个参数)。 相关知识: IP是ICP/IP协议体系中的网络层协议,TCP、UDP、ICMP和IGMP等其他协议都是以IP 协议为基础的。IP的特点如下: (1) IP协议是一种不可靠、无连接的数据报传送协议。 (2) IP协议是点对点的网络层通信协议。 (3) IP协议向通信层隐藏了物理网络的差异。 三、课程设计分析 1.课程设计中的重点及难点 (1)程序中会用到Winpcap, Winpcap是Windows packet capture的缩写,这是UNIX下的lipbcap移植到Windows下的产物,是Win32环境下数据包捕获的开放代码函数库。Winpcap由内核级的数据包过滤器,底层动态链接库(packet.dll)和一个高层的独立于系统的库(wpcap.dll)组成。 Winpcap提供以下功能: 1)捕获原始数据报,包括共享网络上各主机发送/接收的数据报以及各主机之间

计算机网络课程设计-监控IP包流量

目录 一、课程设计目的: (3) 二、课程设计要求: (3) 三、课程设计主要思路分析: (3) 四、设计流程图: (4) 五、运行结果: (5) 六、总结: (6) 参考文献 (6) 源代码: (6)

一、课程设计目的 随着Internet技术的发展,基于IP协议的应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层以基本概念,了解IP协议的基本内容,对于掌握TCP/IP协议的主要内容和学习网络课程是十分重要的,通过本次课程设计,有助于熟悉IP包格式和加深对IP协议的理解。 二、课程设计要求 编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中或用图形表示出来(建议用图形表示出统计结果)。 程序的具体要求如下: 用命令行运行:IPStatistic time logfile 其中,IPStatistic是程序名;time是设定的统计时间间隔(单位为分钟,比如,2表示2分钟);logfile表示统计结果写入的日志文件名(若用图形表示统计结果则可以不选这个参数)。 相关知识: IP是ICP/IP协议体系中的网络层协议,TCP、UDP、ICMP和IGMP等其他协议都是以IP 协议为基础的。IP的特点如下: (1)IP协议是一种不可靠、无连接的数据报传送协议。 (2)IP协议是点对点的网络层通信协议。 (3)IP协议向通信层隐藏了物理网络的差异。 三、课程设计主要思路分析 1.课程设计中的重点及难点 (1)程序中会用到Winpcap, Winpcap是Windows packet capture的缩写,这是UNIX下的lipbcap移植到Windows下的产物,是Win32环境下数据包捕获的开放代码函数库。Winpcap由内核级的数据包过滤器,底层动态链接库(packet.dll)和一个高层的独立于系统的库(wpcap.dll)组成。 Winpcap提供以下功能: 1)捕获原始数据报,包括共享网络上各主机发送/接收的数据报以及各主机之间

IP数据包流量统计

IP数据报流量统计 学生姓名:指导老师: 摘要本课程设计主要是编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中或用图形表示出来。程序中会用到Winpcap,它主要功能在于独立于主机协议发送和接收原始数据报。本次课程设计中用VC++实现基于Winpcap的网络数据包的捕获和统计,基于Winpcap的应用程序将根据获取网络设备列表;选择网卡并打开;设置过滤器;捕获数据包或者发送数据包;列出网卡列表,让用户选择可用的网卡的步骤进行编写,同时对于TCP/IP协议以及IP数据抱的格式有了进一步的了解和掌握。通过编写程序从而实现对网络中IP数据包流量的统计。 关键词IP数据包;流量统计;Winpcap;VC++ 1 引言 随着Internet技术的发展,基于IP协议的应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层以基本概念,了解IP协议的基本内容,对于掌握TCP/IP协议的主要内容和网络课程的学习是十分重要的,通过本次课程设计,有助于熟悉IP数据包格式并加深对IP协议的理解。 1.1 课程设计目的 本次课程设计主要是通过用VC++编程实现对网络中IP数据包流量的统计,实际上是编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,同时应用Winpcap,Winpcap提供了很好的捕获网络数据包的方法,通过本次课程设计可以将VC++知识与Winpcap结合起来实现在一段时间内对IP数据包的流量进行统计。加深了对Winpcap的理解和运用能力,同时也增长了知识,开阔了视野,对于以后的学习有很大的帮助。

监控IP包流量-代码

#include #include #include #include #include #include #include //等同于点击"Project-Setting-link"打开Object/library modules 编辑框后加入lib文件#pragma comment(lib,"Wpcap.lib") #pragma comment(lib,"Ws2_32.lib") //IP结点类,存放IP包的源IP地址和其发送的数据包个数 class IPNode { private: long m_lIPAddress; //IP地址 long m_lCount; //发送数据包个数 public: IPNode * pNext; //指向下一个IP结点 //构造函数 IPNode(long sourceIP) { m_lIPAddress=sourceIP; m_lCount=1; //初始化数据包个数为1 } //数据包个数加1 void addCount() { m_lCount++; } //返回数据包个数 long getCount() { return m_lCount; } //返回IP地址 long getIPAddress() { return m_lIPAddress; } }; //结点链表 class Nodelist { IPNode * pHead; //链表头

IPNode * pTail; //链表尾 public:Nodelist() { pHead=pTail=NULL; //初始化链表 } ~Nodelist() { if(pHead!=NULL) { IPNode * pTemp=pHead; pHead=pHead->pNext; delete pTemp; } } //Ip结点加入链表 void addNode(long sourceIP) { if(pHead==NULL) //当链表为空时 { // cout<<"the first node"<pNext=NULL; } else { for(IPNode * pTemp=pHead;pTemp;pTemp=pTemp->pNext) { //如果链表中存在此IP,发送数据包个数加1 if(pTemp->getIPAddress()==sourceIP) { // cout<<"same sourceip "<addCount(); break; } } if(pTemp==NULL) { // cout<<"a new sourceip"<pNext=new IPNode(sourceIP); pTail=pTail->pNext; pTail->pNext=NULL; } }

监控IP包流量课程设计报告

目录 一、课程设计目的 (1) 二、课程设计要求 (1) 三、课程设计分析 (1) 四、运行结果: (4) 五、心得体会: (4) 参考文献 (6) 源代码: (7)

一、课程设计目的 随着Internet技术的发展,基于IP协议的应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层以基本概念,了解IP协议的基本内容,对于掌握TCP/IP协议的主要内容和学习网络课程是十分重要的,通过本次课程设计,有助于熟悉IP包格式和加深对IP协议的理解。 二、课程设计要求 编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中或用图形表示出来(建议用图形表示出统计结果)。 程序的具体要求如下: 用命令行运行:IPStatistic time logfile 其中,IPStatistic是程序名;time是设定的统计时间间隔(单位为分钟,比如,2表示2分钟);logfile表示统计结果写入的日志文件名(若用图形表示统计结果则可以不选这个参数)。 相关知识: IP是ICP/IP协议体系中的网络层协议,TCP、UDP、ICMP和IGMP等其他协议都是以IP 协议为基础的。IP的特点如下: (1) IP协议是一种不可靠、无连接的数据报传送协议。 (2) IP协议是点对点的网络层通信协议。 (3) IP协议向通信层隐藏了物理网络的差异。 三、课程设计分析 1.课程设计中的重点及难点 (1)程序中会用到Winpcap, Winpcap是Windows packet capture的缩写,这是UNIX下的lipbcap移植到Windows下的产物,是Win32环境下数据包捕获的开放代码函数库。Winpcap由内核级的数据包过滤器,底层动态链接库(packet.dll)和一个高层的独立于系统的库(wpcap.dll)组成。 Winpcap提供以下功能: 1)捕获原始数据报,包括共享网络上各主机发送/接收的数据报以及各主机之间

监控IP包流量05062124(吴文强)

南昌航空大学计算机学院 课程设计说明书 课程名称:计算机网络课程设计 设计题目:监控IP包流量 专业:网络工程班级: 050621 姓名:吴文强学号: 24 评分:指导教师:周之平邓林生 2008 年 6 月 29 日

一.课程设计目的 随着Internet技术的发展,基于IP协议的网络应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层的基本概念,了解IP 协议的基本内容,对于掌握TCP/IP协议的主要内容和学习网络课程是十分重要的。通过本课程设计,有助于熟悉IP包格式和加深对IP协议的理解。 二.需求分析 1.编制程序,监控网络,捕获一段时间内网络上IP数据包,按IP 数据包的源地址统计出该源地址在该时间内发出的IP包个数,将其写入日志文件中或用图形表示出来。 2.设计可视化图形界面,可以进行捕获操作和停止操作,并且捕获完成后有统计结果显示和日志文件生成。 3.程序设计采用C++或者Java(本次设计决定采用C++)。 三.概要设计 本次课程设计的主要目的是接收统计IP包,所以主要任务就是设置网卡以及相关的一系列操作,而图形界面的设计要求次之,所以主要介绍下我门对接收统计IP包的一些设计: ⑴定义一些用于存储所要记录的源地址和该源地址发出的包的个数的结构体以及链表; ⑵主要是查找网卡,设置网卡为混杂模式,编辑过滤器,设置过滤器; ⑶捕获IP数据包并按包的源地址进行统计(存入链表中)。 程序流程图如下:

图1程序流程图 四.详细设计及编码 (1)新建一个基于对话框的MFC AppWizard[exe]工程,取名为IPStatistic。在IDD_IPSTATISTIC_DIALOG中加入界面所需要的控件,所加的控件从上到下依次有静态文本取名为网卡列表,下拉列表框(定义变量为m_comboboxx),静态文本取名为捕获包个数,静态文本(设置ID为IDC_CLOCK,用于显示捕获的包个数),开始捕获按钮,停止按钮,退出按钮,静态文本(设置ID为IDC_STATE,用于表示当前状态),一个组合框(取名为统计结果如下:), 一个清空列表按钮,最后一个是列表控制框(用于显示最后捕获的数据统计),此时的界面如下图:

Per_IP流量控制方法

0引言 带宽资源是有限的,因此如何进行精确的网络流量控制和合理的带宽管理策略成了网络管理中一个急需解决的问题。通过一条规则来控制指定范围内的每个IP 的策略叫着Per-IP 策略。网络通讯时刻存在着相互性,接受方在接收到发送方的数据包以后,总要发送一定的确认信息,以便发送方进行下一步的动作。因此流量控制是双向的,即要控制流入量也要控制流出量,特别是在P2P [1]盛行的时候,更需要对网络的每个IP 进行流出流量进行控制。Linux 平台下的Traffic Con-trol [2]在流量控制上有多种控制队列策略,但只适用于外向流量[3],另外在单接口上控制双向流入流出不行[4]。TC 在控制对象上也不能针对一个网段内的用户进行统一平均流量分配的灵活策略。 1Netfilter 结构 Netfilter [5]是Linux 内核中的一个包过滤框架,默认地,它在这个框架上实现了包过滤、状态检测、网络地址转换和包标记等多种功能,因为其设计的开放性,任何有内核开发经验的开发人员可以很容易地利用它提供接口,在内核的数据链路 层、网络层,实现自己的功能模块。当网络中一个数据包到达时(如图1所示),从左边进入Linux 的Netfilter 框架,进行IP 校验以后,数据包经过第一个钩子函数NF_IP_PRE_ROUTING ,然后进入路由选择模块,该模块决定数据包是需要转发还是发给本机的。若数据包是发给本机的,则经过钩子函数NF_IP_LOCAL_IN 处理后传递给上层协议;如果该数据包被转发则由NF_IP_FORWARD 处理;通过NF_IP_FORWARD 的数据包经过最后一个钩子函数NF_IP_POST_ROUTING 后再传输到网络上。本机产生的数据包经过NF_IP_LOCAL_OUT 进行过滤,然后通过路由选择处理,最后经过NF_IP_POST_ROU-TING 处理以后发送到网络上。 Linux 内核模块可以在图1的5个钩子处进行注册并监听和控制数据包。在钩子处编写钩子函数可以对数据包可以进行任何处理,每个钩子函数经过处理后都将返回一定的值,并把处理结果通知Netfilter 核心代码,以便对数据包采取相应的处理方法。 2Linux 中Per-IP 限速的当前情况 Iptables 提供limit [6]和hashlimit 两个扩展,可以限制单位时间内客户端的发包数,hashlimit 是根据limit 改进而来的,它比 收稿日期:2009-05-28;修订日期:2009-08-16。 网络与通信技术

基于局域网的IP数据包监控软件的实现

Network World ? 网络天地Electronic Technology & Software Engineering 电子技术与软件工程? 17【关键词】局域网 IP 数据包 网络监控 1 基于局域网的IP数据包监控软件的实 现原理 本软件具有对IP 数据包的监控分析的基 本功能,主要采用嗅探器的基本原理抓取网络 有效信息,通过微软的系统网络编程,从中过 滤抓取有用的数据,从而完成对IP 数据包的 监控,并以此保证程序的安全性得到保障。 常见的捕包方式有三种,分别为NDIS , WinPcaP ,Raw Socket 三种技术。本软件要完 成对IP 数据包的监控技术,大致需要五个步 骤才能完成。首先是成功捕获IP 数据包,然 后分析捕获的IP 数据包,一般是根据用户提 供的条件对IP 数据包筛选从而确认数据包状 态,分类汇总流量,然后保存下来。 2 基于局域网的IP数据包监控软件的功 能介绍 2.1 数据监听功能 因特网是由无数的局域网连接形成的。 互联网的内部网络的连接方式是什么?它是基 于拓扑结构来完成基础网络的架构。基础架构 规定一段信息的传输都是从一点到另外一点的 模式,这里有客户端和服务器端的区分,服务 器端却是基于它的特性分布在局域网当中。但 互联网上的主机通常是在局域网中,局域网通 常都会连接到外网,局域网是一种广播网络, 在服务器端放上信息,像网站源码,应用程序 之类都可发布到IIS 服务器上,任何一个客户 端都可以在互联网上通过IP 地址或者具体域 名来进行访问。如果以太网中计算机的网卡接 受模式设置为混合模式,则网卡将捕获所有数 据包并向上传递数据包。通过这种方式,可以 窃听和拦截以太网内传输的信息,软件就是基 于此原理来完成对数据的监听。 2.2 网络流量监控功能 根据监听的原理,本监控软件主要完成 了监听局域网内数据包、对数据包进行拆分并 且以不同方式显示,对拦截的数据包的端口、 协议类型以及P 地址进行过滤。为了实现这些基于局域网的IP 数据包监控软件的实现 文/王一军 功能,将其分为四个部分:数据包截获、分组分割、分组过滤和分组显示。2.3 扫描程序功能该软件能够对局域网中的一切计算机信息和共享文件完成扫描,这其中又分为高速扫描模式和完全扫描模式。扫描后可获得计算机名称、IP 地址、MAC 地址、共享资源等信息。2.4 ping程序Ping 是网络中非常有用的TCP/IP 工具,能够经过Ping 查看连通性问题。这个问题却是可以由于许多因素引发的,例如系统配置出错、网络协议故障,当然还可能是电脑或者服务器故障。2.5 路由追踪功能路由跟踪可用于确定IP 数据包的最终目标的路径。tracert 命令使用IP 生存期(TTL )字段和ICMP 错误消息来确定网络上从一个主机到另一个主机的路由,通过向目标发送不同IP 生存时间(TTL)值的“Internet 控制消息协议(ICMP)”回应数据包,Tracert 诊断程序确定到目标所采取的路由。在转发数据包之前,对于路径也会有一定的规定,要求路径上的每个路由器的数据包里的TTL 属性最少要往下减1。数据包的TTL 属性的波动幅度可能会不断减少,当其变为0时,路由器会发送超时的信息到客户端,当数据包的TTL 为1时,软件会发送相应的响应包,数据包发送一次,TTL 值就会增加1,目标会随着数据包的发送进行响应,路由就会得到确认,或者是TTL 增加到最大值,此时路由也会确定。路由确定时,路由器会发送相应的超时消息来进行提醒。有些路由器丢弃TTL 过期的数据包而不提出任何疑问,这在本程序中却是看不到的。3 监控软件实现的关键技术3.1 NDIS技术NDIS 的主要目的就是为NIC 制定出标准的API 接口。MAC 设备驱动封装了所有的NIC 硬件实现这一点,以便能够经过公共编程接口访问应用同一媒体的任意NIC 。NDIS 同时也提供一个函数库(又时也称作wrapper ),这个库中的函数可以被MAC 驱动调用,它还能由高级协议(如TCP/IP )驱动程序来进行调用。同时,这些包装器函数减少了驱动程序对工作台的依赖。早期版本的NDIS 是由微软和3COM 开发的。在Windows9x 和Windows NT 中,WFW (用于工作组的Windows )使用的当前NDIS 版本由Microsoft 开发。 3.2 winPcap技术Winpcap 是windows 平台下一个免费的公共的网络访问系统,通过Winpcap 技术可以完成对数据包的抓取和发送等操作。可用通过对Winpcap 的int pcap_?ndalldevs_exAPI 的调用来获得所有本地的网络接口,然后通过pcap_t* pcap_open 对指定的网络设备进行抓包/发包,通过int pcap_next_ex()和int pcap_sendpacket()实现具体的抓包和发包操作。3.3 Raw Socket技术要使用原始套接字,必须经过创建原始套接字、设置套接字选项(ioctlsocket 函数)和创建并填充相应协议头这三个步骤。3.4 TCP/IP协议的分析技术分析IP 数据包格式、TCP 、UDP 等数据格式,如源IP 地址和目标IP 地址可以通过IP 分组获取,IP 数据包信息包标识可以计数IP 数据包流量。而端口信息可从TCP ,UDP 获得。3.5 IP数据包的构成IP 数据包主要由版本,头长,服务类型,包裹总长,重组标识,标志,段偏移量,生存时间,协议代码,头校验和32位源码地址已经32位目的地址组成。3.6 网络数据包捕获技术网络数据抓包,有必要监控软件和服务器之间的网络节点,监控任何一个网络节点(网卡),获取通过网卡的所有数据,并根据网络协议解析数据。这就是数据包捕获的基本原理。4 总结本文主要是基于局域网的功能的基础上来对IP 数据包进行监控的技术软件进行了可行性分析,主要对IP 数据包的抓取和发送的原理进行分析,对数据监听,Ping 程序的使用以及路由追踪技术的分析,基于这些基本技术之上也就完成了一个IP 数据包监控软件的一个组成和架构。参考文献[1]凌俊峰.TCP/IP 协议浅释[J].韶关学院学报,2001(09).作者简介王一军(1977-),男,湖南省衡阳市人。硕士学位。讲师。研究方向为计算机科学与技术。作者单位湖南财经工业职业技术学院 湖南省衡阳市 421002

网络流量监控

网络流量监控 组长:李天翼 组员: 网络流量监控:主要实现了在局域网中,使用路由器上网,能够把整个局域网的计算机的据 包,截获然后转发,根据截获的数据包,来进行流量的监控。进一步能够实现对流量的控制。 在java 程序中要实现数据包截获,转发等操作必须了解一下JPCAP 。 JPCAP : 1.Jpcap 类库介绍 1.1 Jpcap 的使用 Jpcap 是2003年日本开发的一套能够捕获、发送网络数据包的java 类库。因为核心Java API 不能访问底层的网络数据,但Jpcap 是一种提供在Windows 或UNIX 系统上进行这种访问的Java API 。Jpcap 不是一种纯粹的Java 解决方案,它依赖本地库的使用。在Windows 或 UNIX 上,你必须有必要的第三方库,分别是WinPcap 或libpcap 。要在java 中使用Jpcap 类库需要安装Jpcap 的运行和开发环境。 1.2 Jpcap 介绍 Jpcap 类库的基本结构如下图: Jpcap 类库结构 1.2.1 Packet 基类及其子类 Packet 这个类是所有被捕获的数据包的基类,可以提供被捕获数据包的长度,被捕获数 据包的时间标记等基本信息。 ARPPacket 和IPPacket 是继承Packet 的子类,它们将被捕获包分成两类。 ARPPacket

按照ARP数据报的内容,将其各数据段的数据取出。IPPacket则被分得更细。这两个类主要与是与数据链路层密切相关的,其与MAC地址相关的信息在EthemetPacket类中表示出来。EthemetPacket是从DatalinkPacket继承而来的。 IPPacket下有三个子类,分别是ICMPPacket、TCPPacket、UDPPacket。这三个类分别表示的是被存储在IP数据报的报文中发送的ICMP、TCP、UDP报文。 1.2.2 Jpcap的主要功能 Jpcap提供了十分方便的数据包捕获方法。Jpcap使用一个事件模型来处理包。首先,必须创建一个执行接口jpcap.JpcapHandler的类。 public class Jpcaphandler implements JpcapHandler { public void handlePacket(Packet packet){ System.out.println(packet); } } 为了捕获包,需要让Jpcap知道要用哪个网络设备来监听。API提供了jpcap.Jpcap.getDeviceList()方法以满足这一目的。这个方法返回一列字符串,可以按一下方法如下使用它: String[] devices = Jpcap.getDeviceList(); 一旦有了一个设备名称的目录,只要从其中选取一个用来监听: String deviceName = devices[0]; 选择一个设备之后,通过Jpcap.openDevice()方法打开它。openDevice()方法需要四个参数:即将打开的设备名,从设备上一次读取的最大字节数,说明是否将设备设为混杂模式的Boolean值,和以后调用processPacket()方法要使用到的超时值。 Jpcapjpcap = Jpcap.openDevice(deviceName, 1024, false, 10000); openDevice()方法将一个参数返回到用以捕获的Jpcap对象。既然有了Jpcap实例,你可以调用processPacket() 或loopPacket()开始监听了。这两种方式都带有两个参数:捕获的最大包数可以是-1(说明没有限制);执行JpcapHandler的一个类的实例。 如果你调用processPacket(),那么Jpcap将一直捕获包,直到超过openDevice中规定的时限

相关文档
最新文档