Jnetpcap

实验目的

  1. 捕获IP数据包并解析,显示并写入日志文件。我是自己边学边写的奥,在做TCP/IP的课程设计,一直到验收完我才会发布。
  2. 一些基础知识大家自己去了解吧包括网络编程,以太网对数据帧的封装,IP数据报格式。
  3. 我的实验环境是:Windows,Eclipse,Java,Jnetpcap。

基础知识

  1. 以太网帧结构:数据帧(Frame)是数据链路层的数据单元,以太网的帧结构注意帧头的信息(MAC地址,协议类型等)。
  2. 数据包(Packet):TCP/IP协议通信传输中的数据单位,封装在Frame中。

实验步骤

一、查找并获取网络接口名称,以便我们可以告诉jNetPcap打开一个或多个以进行读取。因此,首先我们查询系统上的接口列表:

public static int findAllDevs(java.util.List < PcapIf > alldevs,
                              java.lang.StringBuilder errbuf)

参数:
alldevs-列表中填充了PcapIf接口对象;列表一定不能一成不变
errbuf -错误缓冲区,包含错误消息,失败时为字符串
返回值:
失败时返回-1,在这种情况下,errbuf会填入适当的错误消息;成功返回0

  • alldevs列表中的每个元素的类型为pcap_if_t,其结构体和pcap_if相同,用来描述网络设备结构,结构成员如下:
struct pcap_if {
struct pcap_if *next; //指向列表中下一个元素的指针
char *name;           //该字符串为设备传递给pcap_open_live()的名称
char *description;    //如果不为NULL,则为指向字符串的指针,该字符串给出了设备可读的描述
struct pcap_addr *addresses; //指向接口地址列表中第一个元素的指针
bpf_u_int32 flags;    //如果接口是回送接口,则设置PCAP_IF_LOOPBACK
};
  • 上面结构体的 pcap_addr 的数据结构,同样有五个属性:ip地址、子网掩码、广播地址、目标地址
struct pcap_addr {
struct pcap_addr *next; //指向列表中下一个元素的指针;列表的最后一个元素为NULL
struct sockaddr *addr; //指向包含地址的struct sockaddr的指针
struct sockaddr *netmask; //如果不为NULL,则指向结构sockaddr的指针,该结构包含与addr指向的地址相对应的网络掩码
struct sockaddr *broadaddr; //指向结构sockaddr的指针,该结构包含与addr指向的地址相对应的广播地址;如果接口不支持广播,则可以为null
struct sockaddr *dstaddr; //指向结构sockaddr的指针,其中包含与addr指向的地址相对应的目标地址;如果接口不是点对点接口,则可以为null
};
  • 还有关于sockaddr,sockaddr_in,in_addr的结构体,可以理解为就是网络编程时表示IP地址,具体的IP地址有多种表示方法:网络字节序,点分十进制等等,也有具体的函数实现各种表示方式之间的转换。

二、打开与指定的网络接口设备关联的实时捕获。

public static Pcap openLive(java.lang.String device,
                            int snaplen,
                            int promisc,
                            int timeout,
                            java.lang.StringBuilder errbuf)

参数:
device:指定要打开的网络设备的字符串
snaplen:指定要捕获的最大字节数
promisc:指定是否将接口置于混杂模式
timeout:以毫秒为单位指定读取超时
errbuf:返回错误或警告文本
返回值:
原始结构pcap_t原始libpcap调用返回的C结构数据打开

  • snaplen指定的是可以捕获的最大的字节数,如果 snaplen的值比我们捕获的包的大小要小, 那么只有snaplen大小的数据会被捕获并以packet data的形式提供。

  • IP数据报的最大长度是65535,而以太网的MTU为1500 字节,为了使IP数据包能够通过,必须要进行分片。下图是使用ping命令发送5000字节ICMP请求时,使用wireshark抓的包。(IP数据包中和分片有关的字段:标识、标志、分片偏移)
    IP报文分片

  • promisc -1表示处于混杂模式,0表示非混杂。Pcap.MODE_PROMISCUOUS,该模式用于网络信息监视捕捉,监视所有经过网卡的数据包,包括不是发给本机的数据包。

三、编译过滤器并将其应用于网络接口

通常我们只对特定网络通信感兴趣。可以通过compile()和setfilter()来设置数据流过滤规则。

  • 编译一个数据包过滤器,将高级过滤表达式转换为可由内核级过滤引擎解释的程序。
public int compile(PcapBpfProgram program,
                   java.lang.String str,
                   int optimize,
                   int netmask)

参数:
program :PcapBpfProgram过滤器对象
str :包含要编译的文本表达式的字符串
optimize :1表示进行优化,任何其他值表示没有
netmask :确定广播地址所需的网络掩码
返回值:
1表示错误,在这种情况下getErr() 可用于显示错误文本。

  • PcapBpfProgram对象遵循BPF过滤规则,使用str过滤表达式来指定过滤规则。
PcapBpfProgram filter = new PcapBpfProgram();
		String expression = "tcp";
		 int res = pcap.compile(filter, expression, 1, 0);
		 pcap.setFilter(filter);
		 if (res != 0) {
			 System.out.println("Filter error:" + pcap.getErr());
		 }
  • 指定过滤程序
public int setFilter(PcapBpfProgram program)

四、捕获数据包

public <T> int loop(int cnt,
                   PcapPacketHandler<T> handler,
                   T user)

参数:
cnt -要处理的数据包数量
handler -用户提供的数据包处理程序
user -自定义不透明用户对象
返回值:
成功时为0,错误时为-1,如果使用了breakloop,则为-2中断验证

pcap_loop()一直读取数据包,直到处理cnt数据包或发生错误为止。

五、关闭pcap

必须调用close()释放所有Libpcap资源。

### 回答1: Jnetpcap1.4是一个用于Java编程语言的开源库,用于捕获和分析网络数据包。它基于pcap库的Java封装,提供了一种简单而强大的方式来获取网络数据包,并对其进行处理和分析。 Jnetpcap1.4的主要功能包括捕获和保存网络数据包、对数据包进行过滤和分析、提取数据包中的关键信息等。使用该库,开发人员可以轻松地编写Java程序来监控和分析网络流量,从而实现网络安全监控、协议分析、流量分析等功能。 Jnetpcap1.4的优点在于其简单易用和高效性能。它提供了一套简洁而直观的API,开发人员可以轻松地进行网络数据包的捕获和处理操作。同时,该库在处理大规模数据包时表现出色,能够实现高性能的网络数据包处理和分析。 除了基本的网络数据包捕获和处理功能外,Jnetpcap1.4还提供了一些高级特性,如支持多线程操作、支持将数据包导出为其他格式等。这使得开发人员可以更加灵活地使用该库来实现各种网络数据包处理和分析的需求。 总之,Jnetpcap1.4是一个功能强大且易于使用的Java网络数据包捕获和处理库。它提供了一种简单而高效的方式来实现网络数据包的监控和分析,为开发人员提供了丰富的功能和灵活性。无论是进行网络安全监控还是协议分析,Jnetpcap1.4都是一个值得使用的工具。 ### 回答2: Jnetpcap1.4是一个Java库,用于在Java应用程序中进行网络封包捕获和分析。它是基于libpcap和WinPcap的Java绑定库,可以在不同平台上使用。 使用Jnetpcap1.4,我们可以编写Java程序来捕获网络封包,并对封包进行分析和处理。它提供了丰富的功能,包括过滤、数据包分割、统计和流量分析等。我们可以使用它来监控和分析网络流量,识别异常行为或安全威胁。 Jnetpcap1.4具有高性能和灵活性。它通过直接访问底层网络设备,实现了高速数据包捕获和处理。同时,它支持多线程处理,可以同时处理多个网络连接和数据包,提高了系统的处理效率。 此外,Jnetpcap1.4还提供了友好的API和示例代码,使得使用和开发变得更加简单。我们可以根据需要使用不同的API函数,或者参考示例代码来编写自己的应用程序。 总之,Jnetpcap1.4是一个强大的网络封包捕获和分析工具,可以在Java环境下使用。它提供了高性能和灵活性,能够满足我们对网络封包处理的需求。无论是进行网络流量监控还是安全分析,Jnetpcap1.4都是一个值得考虑的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值