IP包流量分析程序的设计与实现Word下载.docx
- 文档编号:6359464
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:20
- 大小:173.24KB
IP包流量分析程序的设计与实现Word下载.docx
《IP包流量分析程序的设计与实现Word下载.docx》由会员分享,可在线阅读,更多相关《IP包流量分析程序的设计与实现Word下载.docx(20页珍藏版)》请在冰点文库上搜索。
这些功能留给上层。
我们将使用“数据报”(datagram)这个词汇指一个完整的IP信息,使用“数据包”(packet)这个词汇指一个单个的IP数据包。
在IP协议层中没有“重试一下”的概念。
由于各种原因,数据包有可能出现丢失、损坏、重复、不按照顺序传递或者延迟等问题。
IP协议还负责处理IP选项并且以ICMP错误和控制消息等方式提供反馈信息。
IP协议的特点:
(1)IP协议是一种不可靠,无联系的数据包传送协议;
(2)IP协议是点对点的网络层通信协议;
(3)IP协议向传输层隐藏了物理网络的差异。
2.1.2IP实现网络互连
各个厂家生产的网络系统和设备,如以太网、分组交换网等,它们相互之间不能互通,不能互通的主要原因是因为它们所传送数据的基本单元(技术上称之为“帧”)的格式不同。
IP协议实际上是一套由软件程序组成的协议软件,它把各种不同“帧”统一转换成“IP数据包”格式,这种转换是因特网的一个最重要的特点,使所有各种计算机都能在因特网上实现互通,即具有“开放性”的特点。
数据包也是分组交换的一种形式,就是把所传送的数据分段打成“包”,再传送出去。
但是,与传统的“连接型”分组交换不同,它属于“无连接型”,是把打成的每个“包”(分组)都作为一个“独立的报文”传送出去,所以叫做“数据包”。
这样,在开始通信之前就不需要先连接好一条电路,各个数据包不一定都通过同一条路径传输,所以叫做“无连接型”,它大大提高了网络的坚固性和安全性。
每个数据包都有包头和包文这两个部分,包头中有目的地址等必要内容,使每个数据包不经过同样的路径都能准确地到达目的地。
在目的地重新组合还原成原来发送的数据。
这就要IP具有分组打包和集合组装的功能。
在实际传送过程中,数据包还要能根据所经过网络规定的分组大小来改变数据包的长度,IP数据包的最大长度可达65535个字节。
图2.1IP数据报格式
IP协议中还有一个非常重要的内容,那就是给因特网上的每台计算机和其它设备都规定了一个唯一的地址,叫做“IP地址”。
由于有这种唯一的地址,才保证了用户在连网的计算机上操作时,能够高效而且方便地从千千万万台计算机中选出自己所需的对象来。
现在电信网正在与IP网走向融合,以IP为基础的新技术是热门的技术,如用IP网络传送话音的技术(即VoIP)就很热门,其它如IPoverATM、IPoverSDH、IPoverWDM等等,都是IP技术的研究重点。
2.2JPCAP的简介
Java,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。
用Java实现的HotJava浏览器(支持Javaapplet)显示了Java的魅力:
跨平台、动态的Web、Internet计算。
但众所周知,Java语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。
JPCAP扩展包弥补了这一点。
JPCAP是一个能够捕获、发送网络数据包的Java类库包。
这个包用到了Libpcap和原始套接字API。
JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给Java语言提供一个公共的接口,从而实现了平台无关性。
在官方网站上声明,JPCAP支持FreeBSD3.x,LinuxRedHat6.1,FedoraCore4,Solaris,andMicrosoftWindows2000/XP等系统。
JPCAP的整个结构大体上跟wincap/libpcap是很相像的,例如NetworkInterface类对应wincap的typedefstruct_ADAPTERADAPTER,getDeviceList()对应pcap_findalldevs()等等。
3.系统设计
3.1设计规划
3.1.1扫描目标的选取
综合笔者现阶段技术水平和课程设计要求的考虑,通过设计程序来扫描IP包流量信息。
同时扫描程序能扫描出MAC地址,网卡信息。
然后通过用户选择网卡号,时间来捕获IP数据流量,并且最后把捕获数据总数显示出来。
本课题通过编制程序来监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址和目的地址统计出该源地址在该时间段内发出的IP包的个数,将其统计结果在控制台现实出来。
该程序的主要流程结构:
(1)取得当前网络设备列表(在MyEclipse6.5控制台输出上显示,以让用户进行选择)。
通过使用JpcapCaptor类中的静态方法getDeviceList来获取可以获取IP包的网卡的信息并存在都NetworkInterface数组中,然后在遍历数组将各个网卡的信息打印到控制台上。
(2)将用户选择的网卡打开并设定抓包时间。
在控制台接受用户选择网卡的号码和抓包时间后调用抓包方法来打开相对应的网卡和设定抓包时间。
(3)设置过滤器,此处的过滤器“IP”,开始捕获数据包。
通过调用JpcapCaptor类的静态方法openDevice打开指定的网卡后并返回一个JpcapCaptor类的实例,然后用该实例调用方法setFilter来设定为IP过滤,从而捕获IP数据包。
(4)捕获IP包并按包的源地址和目的地址进行统计。
从文本中读取数据包的信息,将源地址和目的地址提取出来建表,根据源地址和目的地址来进行数据包流量的统计。
如图3.1所示。
图3.1程序流程图
3.2各模块工作原理及设计
IP包流量分析程序的设计共包括四个模块,分别为:
(1)获取网络设备列表;
(2)用户选择网卡,接收数据包;
(3)设置过滤器,新建文本存放数据包信息;
3.2.1获取网络设备列表
(1)工作原理:
(2)代码实现:
//获取网络接口列表
publicstaticvoidgetDevices(){//静态方法getDevices
NetworkInterface[]devices=JpcapCaptor.getDeviceList();
//获取网络接口
for(inti=0;
i<
devices.length;
i++){//循环输出接口信息
System.out.println(i+"
:
"
+devices[i].name+"
("
+devices[i].description+"
)"
);
System.out.println("
datalink:
+devices[i].datalink_name+"
+devices[i].datalink_description+"
System.out.print("
MACaddress:
"
for(byteb:
devices[i].mac_address)//根据MAC地址来显示输出信息
System.out.print(Integer.toHexString(b&
0xff)+"
System.out.println();
//变成十进制显示
for(NetworkInterfaceAddressa:
devices[i].addresses)
System.out.println("
address:
+a.address+"
+a.subnet
+"
+a.broadcast);
//输出格式
}
}
3.2.2选择网络
(1)此模块为用户选择网卡,从而接收数据包。
工作原理:
Scannerconsole=newScanner(System.in);
getDevices();
//显示PC机上可用的网卡的信息
System.out.println("
请输入网卡号<
0-2>
intnum=console.nextInt();
//获取用户要打开的网卡号
请输入抓包时间(分钟)"
intminuets=console.nextInt();
//获取用户抓包时间
oneByOneReceiver(num,minuets);
//调用抓包方法
3.2.3设置过滤器
(1)次模块为设置过滤器,并通过新建文本存放数据包信息。
//使用逐个捕获方法,从网络接口捕获数据包
publicstaticvoidoneByOneReceiver(intindex,inttime)throwsIOException{
NetworkInterface[]devices=JpcapCaptor.getDeviceList();
JpcapCaptorcaptor=JpcapCaptor.openDevice(devices[index],65535,
false,20);
PrintWriterpw=newPrintWriter(newFileWriter(newFile("
packets.txt"
)));
//打印流信息
captor.setFilter("
ip"
true);
//设置过滤器
intcounter=0;
Packetpacket;
//定义接受包类
longstartTime=System.currentTimeMillis();
//得到当前时间
while(startTime+time*60*10>
=System.currentTimeMillis()){
packet=captor.getPacket();
//控制显示循环
System.out.println(packet);
//输出包信息
if(packet!
=null){//if判断包为空的信息
Stringips=packet.toString().split("
\\s+"
)[1];
//把包信息转换字符串
pw.write(ips);
//往里边写入ips信息
pw.println();
//把写入的信息输出
counter++;
//循环
}
pw.close();
//关闭流
CounterPacketscp=newCounterPackets();
//创建一个CounterPackets对象
cp.readPackets();
//读取包信息
cp.print();
System.out.println("
PacketNumbers:
+counter);
//输出包的数量
3.2.4捕获IP包
(1)次模块为捕获IP包并按包的源地址和目的地址进行统计。
publicclassCounterPackets{
ArrayList<
String>
ips;
//存放读取文本信息
HashMap<
String,Integer>
counter;
//存放地址和对应的数据包的数量
publicCounterPackets(){
counter=newHashMap<
String,Integer>
();
//建一个HashMap的存储对象
//从packet.txt.中读取捕获到的IP数据包信息
publicvoidreadPackets()throwsIOException{
ips=newArrayList<
BufferedReaderbr=newBufferedReader(newFileReader("
));
while(br.read()!
=-1){
ips.add(br.readLine());
counter();
//统计流量
publicvoidcounter(){
ips.size();
i++){
String[]result=getIps(ips.get(i));
Stringindex=result[0]+"
+result[1];
setNumber(index);
//获取源地址和目的地址
publicString[]getIps(Stringips){
StringBuffersb=newStringBuffer(ips);
ips.length();
if(ips.charAt(i)=='
/'
||ips.charAt(i)=='
>
'
-'
){
sb.replace(i,i+1,"
ips=sb.toString().trim();
returnips.split("
//数目叠加
publicvoidsetNumber(Stringindex){
if(counter.containsKey(index)){
intvalue=counter.get(index);
counter.put(index,value+1);
}else{
counter.put(index,1);
//将结果打印到控制台
publicvoidprint(){
源地址"
+"
目的地址"
PacketNumber"
Iteratorit=counter.keySet().iterator();
//定义遍历类
while(it.hasNext()){//while控制循环
Stringindex=(String)it.next();
//从it中得到下一个字符串
String[]ips=index.split("
//切割成字符串数组
StringsrcIp=String.format("
%-6s"
ips[0]);
StringdstIp=ips[1];
intnumber=counter.get(index);
System.out.println(srcIp+"
+dstIp+"
+number);
//输出信息
}
4运行结果
4.1获取网络设备列表
运行程序,扫描到PC机当前网络设备列表,格式以网卡号加网卡设备参数以及MAC地址信息。
选择网卡号,进行IP流量扫描。
如图4.1所示。
图4.1当前网络设备列表
4.2选择网卡
扫描出网卡信息后,然后选择网卡后,用户选择抓包时间进行扫描,如图4.2所示.
图4.2用户选择时间操作
4.3设置过滤器
当开始程序运行时,扫描出用户PC的网卡信息,然后选择网卡号和抓包世界,然后开始捕获IP数据包的信息,程序运行后,会捕获到该时间段网卡的IP流量信息,然后显示再控制台。
如图4.3所示。
图4.3捕获IP数据包的信息
4.4捕获IP包
程序捕获数据包的过程中,首先显示如图4.3的流量监控形式。
然后以源地址,目的地址,包数量的形式进行统计,显示再控制台。
IP数据包流量统计的结果,如图4.4所示。
图4.4统计结果
5.结束语
5.1课程设计应有的态度
本人认为,程序设计目的在于开阔眼界,把课本知识联系实际实践,给予学生处理实际问题的机会,而不应该只是一味地从网上搜索,这种快餐式文化,显然是与课程设计的目的背道而驰的。
课程设计的目的是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力。
对大三学生来说,更应该重视与珍惜课程设计,因为这是个很好的实践机会,然后应该深入了解题目,理清思路,通过课程设计培养联系实际和解决实际问题的能力。
5.2课程设计心得体会
为期两周的课程设计结束了,但它却给我留下深刻的印象:
我清楚的感到,随着科技的发展以及计算机网络在各行各业的广泛应用,计算机网络以自己的独特的优点在我们的生活中占据着重要的位置。
通过本课程设计的学习,我对计算机网络的基本系统有了比较深刻的理解。
以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,同时在设计的过程中发现了自己的不足之处,以前所学过的知识理解得不够深刻,掌握得不够牢固。
不论是做学问,还是为人处事,首先,我们要明确目的,该做什么不该做什么。
其次,分析问题,理清思路,时刻保持清醒的头脑。
最后,还要有信心,恒心和不怕失败的决心。
我会把我的收获带到以后的学习生活中,端正生活和学习的态度,永远追求积极向上的生活。
参考文献
[1]吴功宜胡晓英.计算机网络课程设计北京:
机械工业出版社,2007.12.
[2]王春晓赵艳标.计算机网络教程北京:
机械工业出版社,2005.08.
[3]谢希仁.计算机网络[M].北京:
电子工业出版社,2009.
[4](美)埃克尔著,陈昊鹏译.Java编程思想(第4版)北京:
机械工业出版社,2007.06.01
[5](美)Y.DanielLiang著,万波译.Java语言程序设计(第6版)北京:
机械工业出版社,2008.06.
附录
程序名:
TestJpcap.java
importjava.io.File;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.Scanner;
importjpcap.JpcapCaptor;
importjpcap.NetworkInterface;
importjpcap.NetworkInterfaceAddress;
importjpcap.packet.Packet;
publicclassTestJpcap{
publicstaticvoidmain(String[]args)throwsIOException{
Scannerconsole=newScanner(System.in);
int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IP 流量 分析 程序 设计 实现