编程实现简单的流量统计器.docx
- 文档编号:3364044
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:12
- 大小:461.63KB
编程实现简单的流量统计器.docx
《编程实现简单的流量统计器.docx》由会员分享,可在线阅读,更多相关《编程实现简单的流量统计器.docx(12页珍藏版)》请在冰豆网上搜索。
编程实现简单的流量统计器
编程实现简单的流量统计器
学生XX:
指导老师:
摘要:
它是一个可以记录访客来源地址(包括ip、转入地址、搜索引擎地址、关键词、ie浏览器型号等),被访问页面地址(受访页面,停留时间、转出地址等)的数字递增的源代码程序。
通过使用JAVA中的JPCAP包设计并实现了一个流量统计系统.
关键词:
JAVA;JPCAP;编程;流量统计器。
1引言
计算机网络是这个时代的基石,整个信息的流动和交换全部依托于这个庞大的网络系统。
如果这个信息网络出现问题和故障,则会给社会、团体、个人等带来很大的损失。
有效的网络管理不仅能够保证网络的正常运行,而且能够有效地避免网络故障给我们带来的损失。
在网络管理过程中,网络流量监控是整个网络管理的一个重要部分。
对于一个网络管理员,有效的网络流量监控不仅能够让网络管理人员能够及时了解网络的运行状态,并且能够对网络出现的问题作出及时调整和排除。
1.1课程设计目的
以基础技能训练和能力培养为主线,从培养学生动手能力,培养工程技术实际应用型人才入手,强化综合性、实际性。
目的是通过实习使学生掌握计算机网络的实际开发所要掌握技术,培养其动手能力,观察能力,分析和解决实际问题的能力,巩固、加深理论课知识,增加感性认识,进一步加深对计算机网络的理解,提高对网络中所于奥实现的功能的系统设计能力和调试能力。
1.2课程设计内容
1.利用原始套接字实现简单的流量统计器。
2.系统功能包括:
2.1原始套接字与网卡邦定,并接收流经网卡的所有数据包;
2.2对数据包进行分析以获得源IP地址和目的IP地址;
2.3对数据包进行分析以获得运输层协议类型;
2.4对数据包进行分析以获得数据包的长度;
2.5对本机发送、接收的各运输层协议的数据流量进行统计,并显示统计结果。
1.3课程设计要求
(1)按要求编写课程设计报告书,能正确阐述设计结果。
(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。
(3)学会文献检索的基本方法和综合运用文献的能力。
(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。
2设计原理
图2-1流量统计器工作原理图
2.1流量统计器的工作原理
源代码放置在网页中,每次有用户浏览到这个网页时就会触发这个源代码程序工作,然后以全程记录所有信息,并以数字递增的方式把结果统计出来传到服务器,再到程序的服务器后台进行具体分析并实时保存,这就是流量统计器的原理了。
2.2JAVAJPCAP原理
Java语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。
JPCAP扩展包弥补了这一点。
JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给Java语言提供一个公共的接口,从而实现了平台无关性。
局域网监听利用的是所谓的“ARP欺骗”技术。
在以前曾经一段阶段,局域网的布局是使用总线式(或集线式)结构,要到达监听只需要将网卡设定为混杂模式即可,但现在的局域网络普遍采用的是交换式网络,所以单纯靠混杂模式来达到监听的方法已经不可行了。
所以为了达到监听的目的,我们需要“欺骗”路由器、“欺骗”交换机,即“ARP欺骗”技术。
假设本机为A,监听目标为B。
首先,伪造一个ARPREPLY包,数据链路层头及ARP内容部分的源MAC地址填入A的MAC地址,而源IP部分填入网关IP,目的地址填入B的MAC、IP,然后将这个包发送给B,而B接收到这个伪造的ARPREPLY包后,由于源IP为网关IP,于是在它的ARP缓存表里刷新了一项,将(网关IP,网关MAC)刷新成(网关IP,A的MAC)。
而B要访问外部的网都需要经过网关,这时候这些要经过网关的包就通通流到A的机器上来了。
接着,再伪造一个ARPREPLY包,数据链路层头及ARP内容部分的源MAC地址填入A的MAC地址,而源IP部分填入B的IP,目的地址填入网关MAC、IP,然后将这个包发给网关,网关接收到这个伪造的ARPREPLY包后,由于源IP为B的IP,于是在它的ARP缓存表里刷新了一项,将(B的IP,B的MAC)刷新成(B的IP,A的MAC)。
这时候外部传给B的数据包经过网关时,就通通转发给A。
这样还只是拦截了B的数据包而已,B并不能上网——解决方法是将接收到的包,除了目的地址部分稍做修改,其它原封不动的再转发出去,这样就达到了监听的目的——在B不知不觉中浏览了B所有的对外数据包。
3设计步骤
3.1相关必须程序包的安装和解压
1.JpcapSetup-0.7.exe的安装,双击即可。
图3-1JPCAP包的安装
2.WinPcap4.0.exe的安装,双击即可。
图3-2JPCAP包的安装
3.JpcapDumper-src.zip,解压。
图3-3JPCAP包的安装
3.2Myeclipse下的运行
1.运输层TCP协议包
this.packetCount++;
//如果截获的包为TCP包
if(packetinstanceofjpcap.packet.TCPPacket){
this.tcpPacketCount++;
TCPPackettcp=(TCPPacket)packet;
this.tcppPacketLength+=tcp.len;
System.out
.println("================================================================================");
System.out.println("TCPPacket");
System.out.println("|——*此数据包的源IP地址:
"+tcp.src_ip);
System.out.println("|——*此数据包的目的IP地址:
"+tcp.dst_ip);
System.out.println("|——*此数据包的传输层协议类型:
"+tcp.protocol+"(TCP)");
System.out.println("|——*此数据包的长度:
"+tcp.len);
图3-2-1TCP协议包的统计结果
图3-2-2TCP协议包的统计结果
2.运输层UDP协议包
{//如果截获的包为UDP包
this.udpPacketCount++;
UDPPacketudp=(UDPPacket)packet;
this.udpPacketLength+=udp.len;
System.out
.println("================================================================================");
System.out.println("UDPPacket");
System.out.println("|——*此数据包的源IP地址:
"+udp.src_ip);
System.out.println("|——*此数据包的目的IP地址:
"+udp.dst_ip);
System.out.println("|——*此数据包的传输层协议类型:
"+udp.protocol+"(UDP)");
System.out.println("|——*此数据包的长度:
"+udp.len);
图3-2-3UDP协议包的统计结果
3.协议包总统计
System.out.println("截止到目前:
");
System.out.println("|捕获到的运输层协议包的总数为:
"+this.packetCount);
System.out.println("|——*捕获到TCPPacket包的总数为:
"+this.tcpPacketCount +",总数据包长度为"+this.tcppPacketLength);
System.out.println("|——*捕获到UDPPacket包的总数为:
"+this.udpPacketCount +",总数据包长度为"+this.udpPacketLength);
}
图3-2-4JPCAP下流量统计器的统计结果
4出现的问题及解决方法
本次课程设计由于自己对知识的掌握不足够,所以出现了一些问题,不过在老师和同学的帮助下顺利克服了这个难题。
例如对JAVA语言不熟悉,和JPCAP包的不了解,导致程序运行不成功。
在调试的过程中,对myeclipse软件不够熟练,以至于调试了很长时间才得出结果。
因此,掌握好相关的知识,做课程设计的时候才能得心应手。
5结束语
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新月异,计算机网络技术已经成为当今计算机应用中空前活跃的领域,在生活中可以说是无处不在。
因此作为二十一世纪的大学生来说掌握计算机网络技术是十分重要的。
对于计算机网络课程设计来说,我们大多数同学还都是一X白纸,同样对于JAVA以及C++语言对于我们来说同样比较陌生,但是通过大家不懈的努力,从不知道变为知道,从简单操作到熟练运用,大家都付出了相应的心血。
虽然,在计算机网络这块领域上面我们还只是入门级别,但是我相信通过此次计算机网络课程设计的学习,大大增加了同学们的动手能力和思考能力,为我们今后步入社会打下了坚实的基础。
通过理论学习到实际应用,这次的计算机网络课程设计让我们切身体会到了什么才是学以致用。
由于是第一次做计算机网络课程设计,在设计之中也不免遇到了种种问题和困难,这样才能让我自己发现自己的不足之处,才能激发自己学习的乐趣,才能让自己在更远的学习道路上处于不败之地。
参考文献
[1]周明天,汪文勇.TCP/IP网络技术原理与技术[M].:
清华大学出社版社.
[2][美]RogersCadenhead.Java编程入门经典.梅兴文译.第4版.:
人民邮电,2007
[3]陈轶.姚晓昆编著.Java程序设计实验指导.:
清华大学,2006
[4]计算机网络技术,X明新莫林主编,XX大学.
程序附录:
TrafficStatictics.java
package.socket.lzf;
importjava.io.IOException;
importjpcap.JpcapCaptor;
importjpcap.NetworkInterface;
publicclassTrafficStatictics{
privatestaticTrafficStaticticsts;
publicstaticvoidmain(String[]args){
//启动统计线程
TrafficStatictics.ins();
}
publicsynchronizedstaticTrafficStaticticsins(){
if(null==ts){
TrafficStaticticsts=newTrafficStatictics();
ts.init();
}
returnts;
}
publicvoidinit(){
//获取本机上的网络接口对象
finalNetworkInterface[]devices=JpcapCaptor.getDeviceList();
for(inti=0;i NetworkInterfaceni=devices[i]; //大于零时为有效地址;不抓本机地址 if(ni.addresses.length>0){ //一个网卡可能有多个地址,只获取第一个 Stringaddr=ni.addresses[0].address.toString(); try{ //创建卡口上的抓取对象 JpcapCaptorjpcap=JpcapCaptor.openDevice(ni,2000,true, 20); //创建对应的抓取线程并启动 LoopPacketThreadlpt=newLoopPacketThread(jpcap,addr); lpt.start(); System.out.println(addr+"上的采集线程已启动! ! ! "); }catch(IOExceptione){ e.printStackTrace(); System.out.println("抓取数据包时出现异常! ! ! "); } } } } } ============================================================================================== ·LoopPacketThread.java package.socket.lzf; importjpcap.JpcapCaptor; publicclassLoopPacketThreadextendsThread{ privateJpcapCaptorjpcap=null; privateStringipAddr=""; publicLoopPacketThread(JpcapCaptorjpcap,StringipAddr){ this.jpcap=jpcap; this.ipAddr=ipAddr; } //-1表示永久抓包 publicvoidrun(){ this.jpcap.loopPacket(-1,newReceivePacket(this.ipAddr)); } } ============================================================================================== ·ReceivePacket.java package.socket.lzf; importjava.text.SimpleDateFormat; importjava.util.Date; importjpcap.PacketReceiver; importjpcap.packet.Packet; importjpcap.packet.TCPPacket; importjpcap.packet.UDPPacket; publicclassReceivePacketimplementsPacketReceiver{ privateStringipAddr=""; privatestaticintpacketCount=0; privatestaticinttcpPacketCount=0; privatestaticintudpPacketCount=0; privatestaticinttcppPacketLength=0; privatestaticintudpPacketLength=0; publicReceivePacket(StringipAddr){ this.ipAddr=ipAddr; } publicvoidreceivePacket(Packetpacket){ this.packetCount++; //如果截获的包为TCP包 if(packetinstanceofjpcap.packet.TCPPacket){ this.tcpPacketCount++; TCPPackettcp=(TCPPacket)packet; this.tcppPacketLength+=tcp.len; System.out .println("================================================================================"); System.out.println("TCPPacket"); System.out.println("|——*此数据包的源IP地址: "+tcp.src_ip); System.out.println("|——*此数据包的目的IP地址: "+tcp.dst_ip); System.out.println("|——*此数据包的传输层协议类型: "+tcp.protocol+"(TCP)"); System.out.println("|——*此数据包的长度: "+tcp.len); }elseif(packetinstanceofjpcap.packet.UDPPacket){//如果截获的包为UDP包 this.udpPacketCount++; UDPPacketudp=(UDPPacket)packet; this.udpPacketLength+=udp.len; System.out .println("================================================================================"); System.out.println("UDPPacket"); System.out.println("|——*此数据包的源IP地址: "+udp.src_ip); System.out.println("|——*此数据包的目的IP地址: "+udp.dst_ip); System.out.println("|——*此数据包的传输层协议类型: "+udp.protocol+"(UDP)"); System.out.println("|——*此数据包的长度: "+udp.len); }else{ //如果截获的包非运输层协议包 System.out.println("***捕获到非运输层协议的其他包! ! ! "); } System.out.println(); System.out.println("截止到目前: "); System.out.println("|捕获到的运输层协议包的总数为: "+this.packetCount); System.out.println("|——*捕获到TCPPacket包的总数为: "+this.tcpPacketCount +",总数据包长度为"+this.tcppPacketLength); System.out.println("|——*捕获到UDPPacket包的总数为: "+this.udpPacketCount +",总数据包长度为"+this.udpPacketLength); } privatestaticStringcurrentTime(){ Datedate=newDate(); SimpleDateFormatsdf=newSimpleDateFormat("yyyy/mm/ddhh: ff: mm"); StringstrTime=sdf.format(date); returnstrTime; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 实现 简单 流量 统计