当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

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}
2.JpcapCaptor
该类供应了一系列静态办法实现一些基本的功效.该类一个实例代表成立了一个与指定设备的链接,可以通过该类的实例来掌握设备,比方设定网卡情势、设定过滤关键字等等.
数据成员
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()终止.
3.JpcapSender
该类专门用于掌握数据包的发送.
办法成员
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全部的对外数据包.

ARP数据包解析 单元:Byte
Ethernet头部 ARP数据部份
2 2 2 2
目标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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • JPCAP-JAVA中的数据链路层掌握
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        100%(1)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .