JPCAP-JAVA中的数据链路层掌握[Java编程]
本文“JPCAP-JAVA中的数据链路层掌握[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
一.JPCAP简介
众所周知,JAVA语言固然在TCP/UDP传输方面赐与了杰出的定义,但关于网络层以下的掌握,倒是无能为力的.
JPCAP扩大包补偿了这一点. JPCAP实际上并非一个真正去实现对数据链路层的掌握,而是一此中间件,JPCAP调用wincap/libpcap,而给JAVA语言供应一个大众的接口,从而实现了平台无关性.在官方网站上声明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系统.
二.JPCAP机制
JPCAP的整个构造大体上跟wincap/libpcap是很相像的,比方NetworkInterface类对应wincap的typedef struct _ADAPTER ADAPTER,getDeviceList()对应pcap_findalldevs()等等. JPCAP有16个类,下面就此中最重要的4个类做阐明.
1.NetworkInterface 该类的每一个实例代表一个网络设备,普通就是网卡.这个类只有一些数据成员,除了担当自java.lang.Object的基本办法以外,没有定义别的办法.
数据成员 | |
NetworkInterfaceAddress[] | addresses 这个接口的网络地址.设定为数组应当是考虑到有些设备同时衔接多条线路,比方路由器.但我们的PC机的网卡普通只有一条线路,所以我们普通取addresses[0]就够了. |
java.lang.String | datalink_description. 数据链路层的描写.描写所在的局域网是什么网.比方,以太网(Ethernet)、无线LAN网(wireless LAN)、令牌环网(token ring)等等. |
java.lang.String | datalink_name 该网络设备所对应数据链路层的名称.具体来说,比方Ethernet10M、100M、1000M等等. |
java.lang.String | description 网卡是XXXX牌子XXXX型号之类的描写.比方我的网卡描写:Realtek RTL8169/8110 Family Gigabit Ethernet NIC |
boolean | Loopback 标志这个设备能否loopback设备. |
byte[] | mac_address 网卡的MAC地址,6个字节. |
java.lang.String | Name 这个设备的名称.比方我的网卡名称:\Device\NPF_{3CE5FDA5-E15D-4F87-B217-255BCB351CD5} |
该类供应了一系列静态办法实现一些基本的功效.该类一个实例代表成立了一个与指定设备的链接,可以通过该类的实例来掌握设备,比方设定网卡情势、设定过滤关键字等等.
数据成员 | |
int | dropped_packets 丢弃的包的数目. |
protected int | ID 这个数据成员在官方文档中并没有做任何阐明,查看JPCAP源代码可以发现这个ID实际上在其JNI的C代码部份传进来的,这类本身并没有做出定义,所以是供其内部利用的.实际上在对JpcapCator实例的利用中也没有办法调用此数据成员. |
protected static boolean[] | instanciatedFlag 一样在官方文档中没有做任何阐明,预计其为供内部利用. |
protected static int | MAX_NUMBER_OF_INSTANCE 一样在官方文档中没有做任何阐明,预计其为供内部利用. |
int | received_packets 收到的包的数目 |
办法成员 | |
static NetworkInterface[] | getDeviceList() 返回一个网络设备列表. |
static JpcapCaptor | openDevice(NetworkInterface interface, int snaplen, boolean promisc, int to_ms) 成立一个与指定设备的衔接并返回该衔接.注意,以上两个办法都是静态办法. Interface:要翻开衔接的设备的实例; Snaplen:这个是对比简单搞混的一个参数.其实这个参数不是限制只能捕捉多少数据包,而是限制每一次收到一个数据包,只提取该数据包中前多少字节; Promisc:设置能否稠浊情势.处于稠浊情势将接纳全部数据包,若之后又调用了包过滤函数setFilter()将不起任何作用; To_ms:这个参数主要用于processPacket()办法,指定超时的时间; |
void | Close() 关闭调用该办法的设备的衔接,相关于openDivece()翻开衔接. |
JpcapSender | getJpcapSenderInstance() 该返回一个JpcapSender实例,JpcapSender类是专门用于掌握设备的发送数据包的功效的类. |
Packet | getPacket() 捕捉并返回一个数据包.这是JpcapCaptor实例中四种捕捉包的办法之一. |
int | loopPacket(int count, PacketReceiver handler) 捕捉指定数目的数据包,并交由实现了PacketReceiver接口的类的实例处理,并返回捕捉到的数据包数目.假如count参数设为-1,那么无限循环地捕捉数据. 这个办法不受超时的影响.还记得openDivice()中的to_ms参数么?那个参数对这个办法没有影响,假如没有捕捉到指定数目数据包,那么这个办法将一向阻塞等候. PacketReceiver中只有一个抽象办法void receive(Packet p). |
int | processPacket(int count, PacketReceiver handler) 跟loopPacket()功效一样,唯一的辨别是这个办法受超时的影响,超越指按时间自动返回捕捉到数据包的数目. |
int | dispatchPacket(int count, PacketReceiver handler) 跟processPacket()功效一样,辨别是这个办法可以处于“non-blocking”情势工作,在这种情势下dispatchPacket()大概当即返回,即便没有捕捉到任何数据包. |
void | setFilter(java.lang.String condition, boolean optimize) .condition:设定要提取的包的关键字. Optimize:这个参数在阐明文档以及源代码中都没有阐明,只是说这个参数假如为真,那么过滤器将处于优化情势. |
void | setNonBlockingMode(boolean nonblocking) 假如值为“true”,那么设定为“non-blocking”情势. |
void | breakLoop() 当调用processPacket()和loopPacket()后,再调用这个办法可以强迫让processPacket()和loopPacket()终止. |
该类专门用于掌握数据包的发送.
办法成员 | |
void | close() 强迫关闭这个衔接. |
static JpcapSender | openRawSocket() 这个办法返回的JpcapSender实例发送数据包时将自动填写数据链路层头部份. |
void | sendPacket(Packet packet) JpcapSender最重要的功效,发送数据包.需求注意的是,假如调用这个办法的实例是由JpcapCaptor的getJpcapSenderInstance()得到的话,需求自己设定数据链路层的头,而假如是由上面的openRawSocket()得到的话,那么无需也不能设置,数据链路层的头部将由系统自动生成. |
4.Packet 这个是全部别的数据包类的父类.Jpcap所支持的数据包有:
ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket
三.利用JPCAP实现监听
1.监听原理 在具体说用JPCAP实现网络监听实现前,先简单介绍下监听的原理. 局域网监听操纵的是所谓的“ARP拐骗”技术.在从前曾经一段阶段,局域网的筹划是利用总线式(或集线式)构造,要到达监听只需求将网卡设定为稠浊情势便可,但目前的局域网络广泛采取的是交换式网络,所以纯真靠稠浊情势来到达监听的办法已经不可行了.所认为了到达监听的目的,我们需求“拐骗”路由器、“拐骗”交换机,即“ARP拐骗”技术.
假定本机为A,监听目标为B.
首先,假造一个ARP REPLY包,数据链路层头及ARP内容部份的源MAC地址填入A的MAC地址,而源IP部份填入网关IP,目的地址填入B的MAC、IP,然后将这个包发送给B,而B接纳到这个假造的ARP REPLY包后,由于源IP为网关IP,于是在它的ARP缓存表里革新了一项,将(网关IP,网关MAC)革新成(网关IP,A的MAC).而B要拜候外部的网都需求经过网关,这时刻这些要经过网关的包就通通流到A的机械上来了. 接着,再假造一个ARP REPLY包,数据链路层头及ARP内容部份的源MAC地址填入A的MAC地址,而源IP部份填入B的IP,目的地址填入网关MAC、IP,然后将这个包发给网关,网关接纳到这个假造的ARP REPLY包后,由于源IP为B的IP,于是在它的ARP缓存表里革新了一项,将(B的IP,B的MAC)革新成(B的IP,A的MAC).这时刻外部传给B的数据包经过网关时,就通通转发给A. 这样还只是拦阻了B的数据包罢了,B并不能上网——办理办法是将接纳到的包,除了目的地址部份稍做改正,别的原封不动的再转发出去,这样就到达了监听的目的——在B不知不觉中浏览了B全部的对外数据包.
Ethernet头部 | ARP数据部份 | |||||||||
6 | 6 | 2 | 2 | 2 | 2 | 2 | 4 | 6 | 4 | 6 |
目标MAC地址 | 源地MAC地址 | 范例号0x0800:ip 0x0806:ARP | 局域网范例 以太网0x0001 | 网络协议范例 IP网络0x0800 | MAC/IP地址长度,恒为0x06/04 | ARP包范例 REPLY 0x0002 | ARP目标IP地址 | ARP目标MAC 地址 | ARP源IP地址 | ARP源MAC地址 |
以上是“JPCAP-JAVA中的数据链路层掌握[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |