计算机网络原理 实验3《IP数据包捕获及数据分析》

实验3《IP数据包捕获及数据分析》

一、实验目的

  JPCAP是一个能够捕获、发送网络数据包的java类库包。这个包用到了Winpcap/Libpcap和原始套接字API,目前,JPCAP在FreeBSD 3.x、Linux RedHat 6.1、Solaris 和Microsoft Windows 2000/XP系统上已经做过测试,并且支持Ethernet, IPv4, IPv6, ARP/RARP, TCP, UDP, ICMPv4协议。JPCAP是由在美国加利福尼亚大学Irvine分校(UCI)攻读博士学位的日本人Keita Fujiiy研制发布的,其主页为http://netresearch.ics.uci.edu/kfujii/ 。
  JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点。JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用Winpcap/Libpcap,给JAVA语言提供一个公共的接口,从而实现了平台无关性,并能够捕获、发送网络数据包。
  通过本次实验熟悉使用JPCAP捕获数据包,并从捕获的数据了解ip数据包包含的信息。

二、实验内容
  1. 使用Keita Fujiiy编写的基于JPCAP 的JPCAPDumper软件捕获网络数据,了解JPCAP能实现的功能。JPCAPDumper为英文程序,可参考反编译和汉化后的程序数据包捕获器,功能一致;
  2. 熟悉JPCAP API的常用类(ARPPacket、DatalinkPacket、IPAddress、IPPacket等);
  3. 熟悉JPCAP环境的安装步骤;
  4. 使用JPCAP编写简单的ip数据包捕获程序;
  5. 参考反编译和汉化的数据包捕获器代码,实现可视化ip数据包捕获程序(选作)。
三、实验方法

  利用Intellij IDEA开发工具实现IP抓包实验,利用JpcapDumper可演示Jpcap功能(JpcapDumper是Keita Fujiiy编写的基于Jpcap的网络分析软件)。

四、实验步骤
  1. 阅读资料里提供的JPCAP API,熟悉JPCAP常用类和方法。
    (1) Jpcap0.4版本共有1个分析器接口14个分析器类,分别简介如下:
    (2) JpcapHandler :这个接口用来定义分析被捕获数据包的方法
    (3) ARPPacket :这个类描述了ARP/RARP包,继承了Packet类
    (4) DatalinkPacket :这个抽象类描述了数据链路层
    (5) EthernetPacket :这个类描述了以太帧包,继承DatalinkPacket类
    (6) ICMPPacket :这个类描述了ICMP包,继承了IPPacket类
    (7) IPAddress :这个类描述了IPv4和IPv6地址,其中也包含了将IP地址转换为域名的方法
    (8) IPPacket :这个类描述了IP包,继承了Packet类,支持IPv4和IPv6
    (9) IPv6Option :这个类描述了IPv6选项报头
    (10) Jpcap :用来捕获数据包
    (11) Jpcap.JpcapInfo :Jpcap的内部类, 它包含被捕获数据包的信息 (在jpcap0.4修改部分BUG之后不再使用这个类)
    (12) JpcapSender :它用来发送一个数据包
    (13) JpcapWriter :它用来将一个被捕获的数据包保存到文件
    (14) Packet :这个类是所有被捕获的数据包的基类
    (15) TCPPacket :这个类描述TCP包,继承了IPPacket类
    (16) UDPPacket :这个类描述了UDP包,继承了IPPacket类
  2. 运行JpcapDumper演示Jpcap功能;
  3. 利用Intellij IDEA编程实现Jpcap抓包;
    3.1 下载安装配置jdk;
    3.2 下载安装WinPcap4.1.3,WinPcap4.1.3可以为win32应用程序提供访问网络底层的能力。它用于windows系统下的直接的网络编程。
    3.3 下载Jpcap.dll,复制到系统的jre环境下,用于后续实验,本次实验存放在C:\Program Files\Java\jre1.8.0_211\bin目录下。
    3.4 下载Jpcap.jar包,用于抓包实验运行,下载官网为http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html,但是官网目前没用了,后来我在网上找到的最新的存放在github中,可以在此下载(https://github.com/zz2summer/jpcap),Jpcap.dll也存放在这里。
    下载完成后复制到jre的相关目录下,本次实验存放目录为C:\Program Files\Java\jre1.8.0_211\lib\ext。
    3.5 利用Intellij IDEA创建java工程,先导入Jpcap.jar包;
    3.6 根据Jpcap.jar包的相关类与方法进行实验编写,编写代码如下所示:
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;

import java.io.IOException;

public class IPPacketTest {
    public static void main(String[] args) throws IOException {
        //-----------第一步绑定网卡设备---------------
        //返回一个网络设备列表
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
        for(NetworkInterface n : devices){
            System.out.println(n.name + "   |       " + n.description );
        }
        System.out.println("-------------------------------------");

        JpcapCaptor jpcap = null;
        int caplen = 1514;
        boolean promiscCheck = true;

        //caplen限制每一次收到一个数据,只提取该数据包中前多少字节
        //Promise:设置是否混杂模式。处于混杂模式将接受所有数据包,若之后又调用了包过滤函数setFilter()将不在起任何作用
        //50这个参数主要用于processPacket()方法,指定超时的时间
        jpcap = JpcapCaptor.openDevice(devices[0],caplen, promiscCheck,20);

        //--------------------第二步抓包------------------
        int i=0;
        while( i < 10 ){
            Packet packet = jpcap.getPacket();
            String protocol = null;
            if(packet instanceof IPPacket && ((IPPacket)packet).version==4){
                i++;
                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);

                switch (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("----------------------------------------------");
            }
        }
    }
}
  1. 运行程序,分析结果。
五、实验结果
  1. 运行JpcapDumper.jar,观察Jpcap演示效果;

1.1 运行程序,显示抓包结果;
计算机网络原理 实验3《IP数据包捕获及数据分析》_第1张图片
计算机网络原理 实验3《IP数据包捕获及数据分析》_第2张图片
计算机网络原理 实验3《IP数据包捕获及数据分析》_第3张图片
1.2 选择获取结果中任一个,点击后即可在下方获取该IP包的详细信息;
计算机网络原理 实验3《IP数据包捕获及数据分析》_第4张图片
1.3 查看本次实验的整体信息;
计算机网络原理 实验3《IP数据包捕获及数据分析》_第5张图片
计算机网络原理 实验3《IP数据包捕获及数据分析》_第6张图片
1.4 查看网络层协议图形信息;
计算机网络原理 实验3《IP数据包捕获及数据分析》_第7张图片
计算机网络原理 实验3《IP数据包捕获及数据分析》_第8张图片
1.5 查看连续的网络层协议图形统计信息;
计算机网络原理 实验3《IP数据包捕获及数据分析》_第9张图片
计算机网络原理 实验3《IP数据包捕获及数据分析》_第10张图片
1.6 通过Statistics功能可以查看更多的统计信息。

  1. 运行Intellij IDEA编写的抓包程序,获取结果如下所示:
    计算机网络原理 实验3《IP数据包捕获及数据分析》_第11张图片
六、实验小结

  通过本次主要学会和了解了Jpacap的使用,加深了对IP包的熟悉程度,实验过程中要多多注意Jpcap.dll和Jpcap.jar包的版本问题,一个是32位还是64位,还要一个问题是要尽可能用最新版,一些老版本有部分方法不包含,比如我之前一直遇到报错java.lang.NoSuchMethodError: setPacketValue,导致getPacket一直获得结果为null,最后发现是Jpcap.jar包的问题,换了最新版就没问题了。
在这里插入图片描述

参考文章:【1】Jpcap获得网卡信息
     【2】安装配置Jpcap,使用jpcap抓包
     【3】Jpcap包的安装与配置
     【4】jovigb/jpcap-x64
     【5】jpcap实验中报错java.lang.NoSuchMethodError: setPacketValue,getPacket一直获得结果为null

你可能感兴趣的:(计算机网络原理)