计算机网络原理 实验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协议。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数据包捕获程序(选做)。

三、实验方法

1、利用jpcap.jar、substance.jar等相关Java工具包提供的方法、类,实现对本机网络端口的获取、侦听及对各类协议的数据包的抓取、解析;
2、使用Java Swing构造图形化抓包程序JPcapDumper实现对抓包的图形化控制。主要使用的开发环境为NetBeans。

四、实验步骤

1、JPCAP环境的安装(Windows 10)
(1) 安装WinPcap (http://winpcap.polito.it/),选定版本为4.1.3


(2) 下载并解压缩Jpcap的最新版本


(3) 复制Jpcap.dll到C:\WINDOWS\system32目录下
(4) 在NetBeans环境中导入jpcap.jar包、substance.jar包,并启动WinCap程序。


2、构建简单的抓包程序进行抓包测试
构建简单的Java程序进行抓包,检测WinCap与JPCAP工具是否都正确起作用。以抓取IP数据包为例,JPCAP抓包基本步骤为:绑定网络设备、抓包、分析。代码如下。

package csu;

import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;
import java.io.IOException;

public class Test {
    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;
        // 设置是否混杂模式。
        // 处于混杂模式则接收所有的数据包,若之后又调用了包过滤函数getFilter()则不起作用
        boolean promiseCheck = true;

        // openDevice方法获得某个网卡接口的连接
        // 50主要用于processPacket()方法,设定超时时间
        try {
            jpcap = JpcapCaptor.openDevice(devices[3], caplen, promiseCheck, 50);
        } catch (IOException e) {
            e.printStackTrace();
        }

        /*--               第二步抓包               --*/
        int i = 0;
        while (i < 10) {
            Packet packet = jpcap.getPacket();
            if (packet instanceof IPPacket && ((IPPacket) packet).version==4) {
                i++;
                IPPacket ip = (IPPacket) packet;

                System.out.println("版本:IPv4");
                System.out.println("优先权:"+ip.priority);
                System.out.println("服务设置-是否为最大吞吐量:"+ip.t_flag);
                System.out.println("服务设置-是否有更低时延:"+ip.d_flag);
                System.out.println("服务设置-是否有最高的可靠性:"+ip.r_flag);
                System.out.println("长度:"+ip.length);
                System.out.println("标识:"+ip.ident);
                System.out.println("数据偏移设置-有无碎片标识:"+ip.rsv_frag);
                System.out.println("数据偏移设置-末尾碎片标识:"+ip.dont_frag);
                System.out.println("数据偏移设置-有碎片标识:"+ip.more_frag);
                System.out.println("分段偏移:"+ip.offset);
                System.out.println("生存时间(周期):"+ip.hop_limit);

                String protocol = "";
                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: protocol="Other"; 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("----------------------------------");
            }
        }
    }
}

3、可视化监控数据包并分析
参考反编译和汉化的数据包捕获器代码,以上述测试代码的核心部分为基础,使用NetBeans实现可视化IP数据包捕获程序。即实现数据包捕获器菜单栏里统计选项内的功能。

五、实验结果

1、简单抓包测试程序测试结果:


2、可视化监控抓包程序IP Packets Catcher。
(1) 初始化,上面是控制按钮,有两个页面:detail & list页面显示抓包结果,Configure页面对抓包过程进行配置。点击Config按钮进入Configure页面,分为两个个模块:左侧是配置,右侧是使用说明。


(2) 回到detail & list页面点击Start按钮开始抓包,点击Stop按钮暂停抓包。左侧显示抓到的所有的包的简略信息列表,右侧显示的是最近一次抓到的包的信息。


对左侧任一表项双击,即可获取该数据包的详细信息(覆盖在右侧展示区域)。

六、实验结论

对于IPv4数据包,主要包含的信息包括IP版本、优先权、长度、服务设置、标识、数据偏移设置、分段偏移、生存周期、协议、源IP、目的IP、源主机名、目的主机名等等。对于其他的数据包,主要的信息也包括长度、生存周期、协议、源/目的IP等等信息。

七、实验小结

本次实验主要是体验了网络数据包的抓取与解析等实际的工作,对各类协议的数据包头部组成有了更为深入和直观的了解,对JPCAP等抓包相关工具的使用更加熟悉。实验中发现的一点是双绞线接入的网络与WIFI接入的网络端口应该是不同的,因为两种网络能抓到包的端口不同。实验遇到的问题是一开始忘记打开WinCap程序导致jpcap获取不到端口也抓不到数据包,仔细检查实验流程解决了这个问题。

IPv4即网际协议版本4(英语:Internet Protocol version 4,IPv4),又称互联网通信协议第四版,是网际协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署的版本。IPv4是互联网的核心,也是使用最广泛的网际协议版本,其后继版本为IPv6,直到2011年,IANA IPv4位址完全用尽时,IPv6仍处在部署的初期。IPv4是一种无连接的协议,操作在使用分组交换的链路层(如以太网)上。此协议会尽最大努力交付数据包,意即它不保证任何数据包均能送达目的地,也不保证所有数据包均按照正确的顺序无重复地到达。这些方面是由上层的传输协议(如传输控制协议)处理的。

IPv4使用32位(4字节)地址,因此地址空间中只有4,294,967,296(2)个地址。不过,一些地址是为特殊用途所保留的,如专用网络(约1800万个地址)和多播地址(约2.7亿个地址),这减少了可在互联网上路由的地址数量。随着地址不断被分配给最终用户,IPv4地址枯竭问题也在随之产生。基于分类网络、无类别域间路由和网络地址转换的地址结构重构显著地减少了地址枯竭的速度。

八、附录

可视化监控抓包程序IP Packets Catcher源码(NetBeans 项目)地址:IP-Packets-Catcher

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐