基于JPcap的数据包捕获实验报告 本文关键词:捕获,数据包,实验,报告,JPcap
基于JPcap的数据包捕获实验报告 本文简介:实验报告实验名称基于JPcap的数据包捕获器课程名称计算机网络原理与技术姓名李辉成绩班级软件0806学号3901080608日期2010.4地点电子楼四楼实验室备注:小组合作实验,组员:李辉、黄钰1.实验目的基于java第三方包JPcap编写数据包捕获器,该捕获器具有以下功能:a)监听并捕获以太网帧
基于JPcap的数据包捕获实验报告 本文内容:
实
验
报
告
实验名称
基于JPcap的数据包捕获器
课程名称
计算机网络原理与技术
姓名
李辉
成绩
班级
软件0806
学号
3901080608
日期
2010.4
地点
电子楼四楼实验室
备注:
小组合作实验,组员:李辉、黄钰
1.实验目的
基于java第三方包JPcap编写数据包捕获器,该捕获器具有以下功能:
a)
监听并捕获以太网帧
b)
分析IP数据报
c)
分析ARP/RARP
d)
分析TCP、UDP数据报
e)
分析ICMP报文
f)
分析HTTP报文
g)
简单的网络流量分析功能
2.实验环境(软件、硬件及条件)
1)
Jpcap和Wincap简介
Jpcap是一个能够捕获、发送网络数据包的java类库包。这个包用到了Libpcap/Winpcap和原始套接字API,目前,Jpcap在FreeBSD
3.x,Linux
RedHat
6.1,Solaris,and
Microsoft
Windows
2000/XP系统上已经做过测试,并且支持Ethernet,IPv4,IPv6,ARP/RARP,TCP,UDP,ICMPv4协议。Jpcap是由在美国加利福尼亚大学Irvine分校(UCI)攻读博士学位的日本人Keita
Fujiiy研制发布的,其主页为http://netresearch.ics.uci.edu/kfujii/
。其最初版本是2000.6发布的Jpcap0.1版,此后几经修改,到2003.4发布了发布Jpcap0.4版。
JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点。
JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,给JAVA语言提供一个公共的接口,从而实现了平台无关性,并能够捕获、发送网络数据包。
Winpcap(windows
packet
capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
2)
编程环境要求
i.
安装Java
SDK(http://java.sun.com)
ii.
安装最新版本的LibPcap(对于UNIX平台,http://ee.lbl.gov/)
或者WinPcap
(对于Windows平台,http://winpcap.polito.it/)
iii.
下载并解压缩Jpcap的最新版本(http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html
)。
iv.
以Window
XP系统为例,具体准备工作如下:
1.
复制Jpcap.dll到C:/WINDOWS/system32
2.
安装winpcap4.0.2
3.
在工程中导入
jpcap.jar
3.实验方法
Jpcap0.4版本共有1个分析器接口14个分析器类,分别简介如下:
1、
接口综述
JpcapHandler
:这个接口用来定义分析被捕获数据包的方法
2、
类综述
ARPPacket
:这个类描述了ARP/RARP包,继承了Packet类
DatalinkPacket
:这个抽象类描述了数据链路层
EthernetPacket
:这个类描述了以太帧包,继承DatalinkPacket类
ICMPPacket
:这个类描述了ICMP包,继承了IPPacket类
IPAddress
:这个类描述了IPv4和IPv6地址,其中也包含了将IP·地
址转换为域名的方法
IPPacket
:这个类描述了IP包,继承了Packet类,支持IPv4和IPv6
IPv6Option
:这个类描述了IPv6选项报头
Jpcap
:用来捕获数据包
Jpcap.JpcapInfo
:Jpcap的内部类,
它包含被捕获数据包的信息
(在jpcap0.4修改部分BUG之后不再使用这个类)
JpcapSender
:它用来发送一个数据包
JpcapWriter
:它用来将一个被捕获的数据包保存到文件
Packet
:这个类是所有被捕获的数据包的基类
TCPPacket
:这个类描述TCP包,继承了IPPacket类
UDPPacket
:这个类描述了UDP包,继承了IPPacket类
具体api帮助文档见附录。
4.实验分析
以下以抓取ip数据包为例讲解抓包基本步骤:
1.绑定网络设备
2.抓包
3.分析
以下代码见Test工程
import
java.io.IOException;
import
jpcap.JpcapCaptor;
import
jpcap.NetworkInterface;
import
jpcap.packet.IPPacket;
import
jpcap.packet.Packet;
/**
ip数据包捕获演示例子
@author
李辉/
public
class
IPPacketTest
{
public
static
void
main(String[]
args)
{
/*-------------第一步绑定网络设备--------------------*/
NetworkInterface[]
devices=JpcapCaptor.getDeviceList();
//返回一个网络设备列表
for(NetworkInterface
n
:
devices)
System.out.println(n.name
+
“|
“+
n.description
);
System.out.println(“------------------------------------“);
JpcapCaptor
jpcap=null;
int
caplen
=
1512;
boolean
promiscCheck
=
true;
//caplen限制每一次收到一个数据包,只提取该数据包中前多少字节
//Promisc:设置是否混杂模式。处于混杂模式将接收所有数据包,若之后又调用了包过滤函数setFilter()将不起任何作用
//50这个参数主要用于processPacket()方法,指定超时的时间
try
{
jpcap=JpcapCaptor.openDevice(devices[1],caplen,promiscCheck,50);
}
catch
(IOException
e)
{
e.printStackTrace();
}
/*----------------第二步抓包---------------*/
int
i
=
0;
while(i
<
10)
{
Packet
packet
=
jpcap.getPacket();
if(packet
instanceof
IPPacket
IPPacket
ip=(IPPacket)packet;
//将包强制转为IP包
System.out.println(“版本:IPv4“);
System.out.println(“优先权:“+
ip.priority);
System.out.println(“区分服务:最大的吞吐量:“+
ip.t_flag);
System.out.println(“区分服务:最高的可靠性:“+
ip.r_flag);
System.out.println(“长度:“+
ip.length);
System.out.println(“标识:“+
ip.ident);
System.out.println(“DF:Don
t
Fragment:“+
ip.dont_frag);
System.out.println(“MF:More
Fragment:“+
ip.more_frag);
System.out.println(“片偏移:“+
ip.offset);
System.out.println(“生存时间:“+
ip.hop_limit);
String
protocol
=
null;
switch(new
Integer(ip.protocol))
{
case
1:protocol
=
“ICMP“;break;
case
2:protocol
=
“IGMP“;break;
case
6:protocol
=
“TCP“;break;
case
8:protocol
=
“EGP“;break;
case
9:protocol
=
“IGP“;break;
case
17:protocol
=
“UDP“;break;
case
41:protocol
=
“IPv6“;break;
case
89:protocol
=
“OSPF“;break;
default:break;
}
System.out.println(“协议:“+
protocol);
System.out.println(“源IP:“+
ip.src_ip.getHostAddress());
System.out.println(“目的IP:“+
ip.dst_ip.getHostAddress());
System.out.println(“源主机名:“+
ip.src_ip);
System.out.println(“目的主机名:“+
ip.dst_ip);
System.out.println(“------------------------------------“);
}
}
}
}
其他抓包过程类似,已经能够抓取的数据包:
详细程序代码见附录PacketCapure工程
5.实验结论
数据包捕获器界面
6.参考资料
1.
贵州大学2002级硕士研究生学年报告
《基于JPcap的网络流量分析研究与应用》
李
祥
赵新辉
2.
JpcapDumper
ver.0.3
Keita
Fujiiy
7.附件
1.
代码文件夹下有Test工程和PacketCapure工程,其中PacketCapure即为本实验所做的捕获器,Test为原理演示工程。
2.
API文件夹下是帮助文件
3.
所需第三方类库文件夹下是所需的第三方类库
4.
参考资料文件夹下有《基于JPcap的网络流量分析研究与应用》和JpcapDumper
ver.0.3
5.
根目录下有本实验报告电子版和演示ppt
10