1.Java网络编程的局限性

首先我们先抛出一个问题,那就是Java怎么在网络层面进行编程?很多小伙伴肯定会说,Java不是有网络编程么?其实Java本身对网络编程是不够底层的,就如我们现在要进行抓包分析的话肯定是不够。因为Java本身所实现的网络编程是在应用层进行操作的,如果我们需要进行抓包的话,就需要深入到底层的协议去了。如下图中的各种协议,应用层之下的协议,在Java中可能就束手无策了。
在这里插入图片描述

2.相关使用技术介绍

2.1.Java使用libpcap流程介绍

本章节我们将使用Jnetpcap来进行学习,在此之前我们需要了解如下一个流程,我们Java本身是不支持直接使用libpcap,因此需要一个JNI技术来作为桥梁,使得我们Java语言可以调用C语言的库,然后jnetpcap中,然后是的Java使用jnetpcap进行开发的时候,直接使用Java方式就可以了,不用关心Java怎么集成JNI调用C语言库。
在这里插入图片描述

2.2.libpcap/winpcap

libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。

当前最流行的包嗅探和分析工具(tcpdump,Wireshark,Snort,nmap,ngrep等许多工具),都是基于libpcap函数库的。
而winpcap就是windows下的libpcap。
在这里插入图片描述

2.3.JNI

SUN公司发布的Java 本地接口(JNI)提供了将Java与C/C++、汇编等本地代码集成的方案,该规范使得在 Java 虚拟机内运行的 Java 代码能够与其它编程语言互相操作,包括创建本地方法、更新Java对象、调用Java方法,引用 Java类,捕捉和抛出异常等,也允许 Java代码调用 C/C++或汇编语言编写的程序和库。

因此,我们可以通过Java——》JNI——》libpcap的方式来调用C语言库。

2.4.jnetpcap

jNetPcap是 libpcap的一个Java完整封装。jNetPcap使 用与libpcap相同风格的API。libpcap是unix/linux平台下的网络数据包捕获函数库,大多数网络监控软件都以它为基础。 Libpcap可以在绝大多数类unix平台下工作。Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。

同时jnetpcap中,集成了JNI,因此在Java应用程序中,使用jnetpcap你就不需要在去额外使用jni了,就像你使用SpringBoot开发时,SpringBoot已经集成了tomcat。

目前版本jnetpcap-1.4.r1425-1g所支持的操作系统如下
在这里插入图片描述

3.环境安装

这里我们主要以windows环境进行搭建为主。我们需要如下几个步骤

3.1.操作系统

这一步至关重要,因为这将确定你的项目到底能不能做。
不管目前我们用什么技术,我们必须认识到一点,那就是我们不管做了什么集成或者封装,底层还是用libpcap,因此如果libpcap不支持我们的服务器环境的话,说啥都没用。

因为不同操作系统使用不同的C语言函数库,并不是所有的操作系统都支持的,如上文中提到的,支持X86芯片的windows系统,amd64芯片的linux等,但是限制不仅仅是操作系统,还有你的CPU处理芯片。这个需要你先确定好贵公司的服务器芯片。

一般公司来说,X86芯片和amd芯片居多,但是对于国产化要求高的企业单位,可能要求服务器是国产化的,因此可能使用一些龙芯,飞腾系列的芯片,则是不支持的。毕竟现阶段libpcap是不太可能去适配这些国产芯片的。

希望未来有一天我们的国产芯片能发展到让老外的软件及代码来适配我们的硬件基础设施。
希望未来能更多的企业投入到芯片的研究中,让中国芯片走向世界!

本人电脑X86芯片
在这里插入图片描述
系统为windows11专业版本
在这里插入图片描述

3.2.安装winpcap

具体安装winpcap这里我就不细说了,如果不知道winpcap从哪儿获取,最简单的方式就是安装一个wireshark,因为wireshark是基于winpcap的。
在这里插入图片描述
如果你的系统是linux,则你需要安装的是libpcap。

3.3.maven/SpringBoot集成jnetpcap

3.3.1.创建Maven或者SpringBoot项目

这里我们使用maven的方式进行环境集成,就不再使用导入jnetpcap.jar的方式进行集成了,毕竟网上到处的找包也不方便。当然你可以使用maven的方式集成了jnetpcap,然后在maven仓库中找到jnetpcap,导入到非maven项目中也可以。
这里我采用Spring tool sute进行开发
使用你的IDE创建一个maven项目或者SpringBoot项目
在这里插入图片描述

3.3.2.引入jnetpcap依赖

获取你需要jnetpcap依赖,如下我们使用的是目前
https://mvnrepository.com/artifact/jnetpcap/jnetpcap/1.4.r1425-1g
在这里插入图片描述
当然你也可以选择使用其他的版本,我们可以看到目前最新的版本是2018年1月进行更新的
在这里插入图片描述
我们单独引入jnetpcap是不够的,因为jnetpcap目前还没上传到maven仓库中,或许是因为我用的阿里云仓库,国际仓库是否有,这个不清楚。

		<!-- jnetpcap抓包 -->
		<dependency>
            <groupId>jnetpcap</groupId>
            <artifactId>jnetpcap</artifactId>
            <version>1.4.r1425-1g</version>
        </dependency>
<!-- jnetpcap抓包的maven配置 -->
	<repositories>
  		<repository>
    		<id>Clojars</id>
    		<name>Clojars</name>
   	 		<url>https://clojars.org/repo/</url>
  		</repository>
	</repositories>

完整maven配置如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.10.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>jnetpcap_capture</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>jnetpcap_capture</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- jnetpcap抓包 -->
		<dependency>
            <groupId>jnetpcap</groupId>
            <artifactId>jnetpcap</artifactId>
            <version>1.4.r1425-1g</version>
        </dependency>
        
	</dependencies>
	
	<!-- jnetpcap抓包的maven配置 -->
	<repositories>
  		<repository>
    		<id>Clojars</id>
    		<name>Clojars</name>
   	 		<url>https://clojars.org/repo/</url>
  		</repository>
	</repositories>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

3.4.非maven集成jnetpcap

非maven环境集成jnetpcap时,比较简单,其实就是找到jnetpcap包,然后将jnetpcap导入项目即可,但是存在一个问题,就是如果我们仅仅导入jnetpcap包,是不够的,因为我们还需要与这个依赖包保持版本的jnetpcap函数库,这块反正网上到处找也费劲。所以如果你的项目是非maven项目,这里建议你创建一个maven或者springBoot项目,然后用maven的方式集成,然后在maven仓库中去找jnetpcap包。这样有个好处,就是maven中集成进来的jnetpcap包中就包含了jnetpcap的函数库。

如果你不想折腾maven,那就来这儿下载吧
在这里插入图片描述

3.5.安装jnetpcap函数库

从哪里获取jnetpcap函数库函数库嗯?网上到处下载,反正够折腾人的,jnetpcap依赖有几个版本,然后函数库也有几个版本,各版本之间是不能混合用的。主要现在jnetpcap官网也打不开,不知道是不是要科学访问还是什么的,反正到目前位置也快3年没更新了。jnetpcap最后一版是2018年1月更新的(楼主目前时间2021年9月)

首先找到我们的通过maven集成的jnetpcap包依赖。
1.将windows系统中的X86芯片 64位系统的jnetpcap.dll拷贝出来,这就是函数库。
在这里插入图片描述
在这里插入图片描述
2.将函数库复制到jdk/bin目录下
在这里插入图片描述
至此,windows开发环境搭建完毕。

4.获取网卡

为了显示查看方便,我们先把其他不用的网卡给禁用掉
在这里插入图片描述
然后在cmd中,输入ipconfig /all查看我们的网卡信息
在这里插入图片描述
然后我们用代码的方式来获取我们的网卡信息,和上面我们的网卡信息做对比。

import java.util.ArrayList;
import java.util.List;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class JnetApp {
	public static void main(String[] args) {
		SpringApplication.run(JnetApp.class, args);
		 List<PcapIf> devs = new ArrayList<PcapIf>();
	        StringBuilder errsb = new StringBuilder();
	        int r = Pcap.findAllDevs(devs, errsb);
	        if (r == Pcap.NOT_OK || devs.isEmpty()) {
	            System.err.println("未获取到网卡");
	        } else {
	            System.out.println("获取到网卡:");
	            System.out.println(devs);
	        }
	}
}
获取到网卡:
[<flags=0, 
 addresses=[
  [addr=[INET4:192.168.1.233], 
    mask=[INET4:255.255.255.0], 
    broadcast=[INET4:255.255.255.255], 
    dstaddr=null], 
  [addr=[INET6:FE80:0000:0000:0000:A069:D7CC:E18D:CEE1], 
    mask=[0], 
    broadcast=[0], 
    dstaddr=null]], 
    name=\Device\NPF_{BE377809-60C5-49AD-A224-0F6C3B355EFB}, 
    desc=Intel(R) Ethernet Connection (2) I219-LM>]

在这里插入图片描述
刚开始的时候我电脑是正常运行的,然后系统自动更新以后,就发现获取不到网卡,然后以管理员启动IDE在运行代码时,就能成功了。因此这里,防止权限不够的情况,建议以管理员方式启动。
至此,本章节结束!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐