加载中…
个人资料
葡萄的酸味
葡萄的酸味
  • 博客等级:
  • 博客积分:0
  • 博客访问:3,372
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

数据包的接收和发送(课程设计)

(2008-01-20 20:53:22)
标签:

数据包

java

jpcap

分类: 设计
 网上已经有很多了,我也没有弄出什么新的来。没事可以看看,有事还是忽略较好。

第一章 课程实践简介

 

1.数据包简介

“包”(Packet)是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。通过数据包捕获软件,也可以将数据包捕获并加以分析。这样可以很清楚地看到捕获到的数据包的MAC地址、IP地址、协议类型端口号等细节。通过分析这些数据,网管员就可以知道网络中到底有什么样的数据包在活动了。

 

2.任务描述

发送数据包,接收数据包并进行分析。

 

3.任务实现

实现程序的界面化,使操作更简单。实现内容包括:自选需要监测的网卡,可设置过滤内容以查看符合过滤规则的数据包;分析所得数据包括获得数据包时间、源IP和MAC、目的IP和MAC、源端口和目的端口、解析协议(及上层协议)、报文头部、报文传输的数据;发送数据包,可以自选网卡,自己设置IP和MAC以达到欺骗的目的。

 

4.运行环境

Windows:使用辅助工具Winpcap。

Linux:使用辅助工具Libpcap。





 

 

第二章 总体设计

 

1.相关工具介绍

Winpcap:为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:1.捕获原始数据报;2.在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;3.在网络上发送原始的数据报;4.收集网络通信过程中的统计信息。

Jpcap:调用winpcap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。

JDK1.5:运行和调试java程序。

JBuilder2006:java程序的开发工具,可以使开发更简单。

 

2.运行环境搭建(windows)

1.下载并安装JBuilder2006和jdk。

2.下载并安装Winpcap1.4。Winpcap1.4可更好的在windows环境下运行。

3.下载jpcap0.6。jpcap0.6使用比jpcap0.7更加简单,并且运行相对稳定。将下载文件中的jpcap.jar和jpcap.dll解压,在环境变量java.library.path

添加jpcap.jar所在文件的路径,将jpcap.dll放入jdk文件lib文件内。

若在linux下运行,则将winpcap换为libpcap。

 

3.程序设计思路

核心Java API不能访问底层的网络数据。但Jpcap是一种提供在Windows或UNIX系统上进行这种访问的Java API。 Jpcap依赖本地库的使用,能够抓取与发送网络数据包,能够使用Jpcap从一个网络接口获取数据包,然后在Java中对它们进行分析和显示,同样也可以通过一个网络接口发送任意数据包。在Windows 或 UNIX上的第三方库分别是WinPcap或libpcap。

    本实验需要进行数据包的发送、接收和分析。因此需要用到的jpcap中的类及接口包括:

1. NetworkInterface

接口的每一个实例代表一个网络设备,一般就是网卡。

2. JpcapCaptor

该类一个实例代表建立了一个与指定设备的链接,可以通过该类的实例来控制设备,例如设定网卡模式、设定过滤关键字等等。

3. PacketReceiver

该接口用于处理接收到的数据包。

4. JpcapSender

该类专门用于控制数据包的发送。

5. Packet

这是所有其它数据包类的父类。

Jpcap所支持的数据包有:ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket。

6. ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket

这些类为各种类型的数据包类,包括了数据包的具体信息,可以利用这些包对数据包进行分析或组装(发送时使用)。

    图形界面主要以swing包中的组件实现。Swing包相对于awt功能更加强大,速度更优,界面更加美观。





 

 

第三章 程序实现

 

3.1数据包接收

1.获取网卡列表:

NetworkInterface[] devices=JpcapCaptor.getDivecList();

2.选择要监听的网卡,这里用JComboBox显示获取的网卡列表。获得一个与网卡连接的实例(index表示选取的网卡的序号):JpcapCaptor jpcap = JpcapCaptor.openDevice(optionPanel.devices[index],1024, true,1000);

3.创建一个数据包接收事件的处理类:

PacketReceiver handler=new PacketReceiver()

    {

      public void receivePacket(Packet packet)

      {

        deal(packet); //处理数据包的函数

      }

    };

4.开始循环接收数据包:jpcap.processPacket(-1,handler);

 

3.2数据包分析

分析函数deal(Packet packet)所得到的数据包括:

1.数据包的时间time = new Timestamp( (packet.sec * 1000) +(packet.usec / 1000));

2.数据包发送的内容data=new String(packet.data);

3.数据包类型获取方法:利用instanceof可以判断数据包类型,如if(packet instanceof ARPPacket) type=”ARP”。

4.数据包IP和MAC,根据不同的数据包类型进行获取:

 if(packet instanceof IPPacket)

    {

      proto+=((IPPacket) packet).protocol;//解析协议

      srcIP = ((IPPacket) packet).src_ip.toString();//源IP

      dstIP = ((IPPacket) packet).dst_ip.toString();//目的IP

      if(packet instanceof TCPPacket)

      {

        srcPort=""+((TCPPacket) packet).src_port;//源端口

        dstPort=""+((TCPPacket) packet).dst_port;//目的端口

        type=”TCP”;

      }

      else if(packet instanceof UDPPacket)

      {

        srcPort=""+((UDPPacket) packet).src_port; //源端口

        dstPort=""+((UDPPacket) packet).dst_port; //目的端口

       type=”UDP”;

}

      else if(packet instanceof ICMPPacket)

      {

        type= "ICMP";

      }

      DatalinkPacket pack = packet.datalink;

      if (pack instanceof EthernetPacket) {

        srcMAC +=( (EthernetPacket) pack).getSourceAddress();//源MAC

        dstMAC +=( (EthernetPacket) pack).getDestinationAddress();

//目的MAC

      }

    }

    else if(packet instanceof ARPPacket)

    {

      proto+=((ARPPacket)packet).prototype; srcIP+=((ARPPacket)packet).getSenderProtocolAddress();//源IP

      srcMAC+=((ARPPacket)packet).getSenderHardwareAddress();//源MAC

      dstIP+=((ARPPacket)packet).getTargetProtocolAddress();//目的IP

      dstMAC+=((ARPPacket)packet).getTargetHardwareAddress();

//目的MAC

      type="ARP";

    }

 

3.3数据包发送

1.获取网卡列表:与3.1第一步相同。

2. 选择要监听的网卡。获得一个与网卡连接的实例(index表示选取的网卡的序号):JpcapSender  sender = JpcapSender.openDevice(device[index]);

3.创建要发送的数据包的事例。以发送ARP包为例:

ARPPacket arp=new ARPPacket();

arp.hardtype = ARPPacket.HARDTYPE_ETHER;

arp.prototype = ARPPacket.PROTOTYPE_IP;

arp.operation = ARPPacket.ARP_REQUEST;

arp.hlen = 6;

arp.plen = 4;

arp.sender_hardaddr = device[device.length-1].mac_address;

arp.sender_protoaddr=src.getAddress();

arp.target_hardaddr = new byte[]{(byte)0xff,(byte)0xff,(byte)0xff,

              (byte)0xff,(byte)0xff,(byte)0xff};

arp.target_protoaddr = dstip;

4.发送数据包。因为实验室使用以太网,因此还要进行相关设置,设置完成后发送:

EthernetPacket ethernet = new EthernetPacket();

    if(pack instanceof IPPacket)

      ethernet.frametype = EthernetPacket.ETHERTYPE_IP;

    else ethernet.frametype = EthernetPacket.ETHERTYPE_ARP;

    ethernet.src_mac = srcmac;//设置源MAC

    ethernet.dst_mac = dstmac;//设置目的MAC

    pack.datalink = ethernet;

    try {

      sender.sendPacket(pack);

    }

    catch (Exception ex) {

    }

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
后一篇:失去
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    后一篇 >失去
      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有