此程序是利用JPcap包,抓取通过本地网卡的数据帧,并分析各字段的程序。
这是我的一个网络课程设计,具体介绍在下面的实习报告中详细讲述,并附有源代码
不知道怎么上传文件,所以直接粘贴过来了。
目录
第一章 设计目的、任务与要求
1.1 设计的目的 ------------------------------------3
1.2 设计的任务与要求 ------------------------------3
第二章 系统分析设计
2.1 系统分析 --------------------------------------3
2.2 系统设计 --------------------------------------8
3.1 实现过程 --------------------------------------10
3.2 采用技术 --------------------------------------11
3.3 结果界面 --------------------------------------11
3.4 结果分析 --------------------------------------16
第四章 心得体会 ------------------------------------- 18
参考文献 --------------------------------------------19
附录 ------------------------------------------------20
第一章 设计目的、任务与要求
1.1:设计的目的
《计算机网络原理》课程是计算机科学与技术专业的重要专业课程之一。随着计算机网络技术的迅速发展和在当今信息社会中的广泛应用,给《计算机网络》课程的教学提出了新的更高的要求。
计 算机网络原理课程设计的目的与任务是为了使学生在课程学习的同时,通过在一个计算机网络环境中的实际操作,巩固《计算机网络原理》课堂教学所讲授网络的基 本理论、基本概念和方法技术,对现代计算机网络的基本功能有一个初步的了解。为学生今后使用计算机网络的理论和方法,开发大型、复杂的集成系统,打下一个 坚实的基础。
1 . 2 : 设计的任务与要求
本次实验的要求在网络环境, 使用 编程语言 实现捕获网络中的IP 数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。
程序的具体要求如下:
①: 在标准输出和日志文件中写入捕获的IP 包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源 IP 地址和目的 IP 地址等内容。
②:可扩展分析其他协议包。
第二章 系统分析设计
2.1:系统分析
实现网络抓包的方法有很多,下面介绍四种:
①:原始套接字
套接字是网络应用编程接口。应用程序可以使用它进行网络通信而不需要知道底层发生的细节。有时需要自己生成一些定制的数据包或者功能并希望绕开 Socket 提供的功能 , 原始套接字 ( Raw Socket) 满足了这样的要求。原始套接字能
够生成自己的数据报文 , 包括报头和数据报本身的内容。通过原始套接字 , 可以更加自如地控制 Windows 下的多种协议 , 而且能够对网络底层的传输机制进行控制。可以用原始套接字来发送和接收 IP 层以上的原始数据包 , 如 ICMP, TCP, UDP, 而且能够对网络底层的传输机制进行控制。 Raw Socket 的作用主要有三个方面 : ( 1) 接收发向本机的 ICMP, IGMP 协议包 , 或者发送这些协议包 ; ( 2) 接收发向本机的 IP 包 ; ( 3) 发送自定义的 IP 包。
②: LibPca p
可以从 http: / / ee. lbl. gov/ 找到并下载 LibPcap, 它是一个广泛应用的系统抓包库。 LibPcap 是一种与系统无关 , 采用分组捕获机制的分组捕获函数库 , 用于访问数据链路层 , 它在不同的平台上采用统一的编程接口 , 使用 LibPcap 编写的程序可自由的跨平台使用。同时 LibPcap 是一个独立于系统接口的用户级的抓包库 , 它为底层网络监听提供了可移植框架。它的应用包括网络统计集合、安全监听、网络调试等。
③: WinPca p
可以从 http: / /winPcap. polito. it / 找到 WinPcap 。 WinPcap 是 LibPcap 的 Windows 版本 , 它是一个基于 Win32 的捕获数据包和网络分析的体系结构 , 它包括一个内核级的包过滤器 , 一个底层的动态链接库 ( Packet. dll) , 一个高层并且与系统无关的库 ( WPcap. dll, 基于 LibPcap0. 6. 2 版本 ) 。 WinPcap 是集成于 Windows95, 98, ME, NT, 2000 和 XP 操作系统的设备驱动程序 , 它可以从网卡捕获或者发送原始数据 , 同时能够过滤并且存储数据包。开发 WinPcap 这个项目的目的在于为 Win32 应用程序提供访问网络底层的能力。它提供了以下四项功能 :
( 1) 捕获原始数据报 , 包括共享网络上各主机发送 / 接收的以及相互之间交换的数据报 ;
( 2) 在数据报发往应用程序之前 , 按照自定义的规则将某些特殊的数据报过滤掉 ;
( 3) 在网络上发送原始的数据报 ;
( 4) 收集网络通信过程中的统计信息。
④: JP ca p
可以从 http: / / netresearch. ics. uci. edu / kfujii / jpcap / doc /index. html 找到 JPcap 。 JPcap 是一个能够捕获、发送网络数据包的 Java 类库包。这个包用到了 LibPcap 和原始套接字 API 。目前 JPcap 在 FreeBSD 3. x, Linux RedHat 6. 1, Solaris 和 MicrosoftWindows 2000 /XP 系统上已经做过测试 , 并且支持 Ethernet, IPv4, IPv6, ARP/RARP, TCP, UDP, ICMPv4 协议。 JPcap 是一个 Java 类集合 , 它为网络数据包的捕获提供接口和系统支持。其最初版本是 2000 年 6 月发布的 JPcap0. 01 版 , 此后几经修改 , 到 2003 年 4 月发布了最新的 JPcap0.4 版。
由于本程序采用Java 编程语言,所以使用第四种方法,即 JPca p 来实现抓包。
现在选定了抓包工具,我们还得分析一下所获包的结构,只有弄清楚结构,才能很好的分析捕获包。
我们知道,网络软件是由多个协议层次组成的,在每一层里面都有自己的数据封装,以便实现每个层的功能。OSI 参考模型中定义了 7 层,从低到高分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP 参考模型中定义得比较少:互联网层(网络层)、传输层、应用层、主机至网络层(空白,可以理解为跟 OSI 模型一致)。而且我们知道,高层协议整个协议包是封装到低层协议的数据段中的,所以整体是一个嵌套的结构,如下图所示:
数据链路帧格式如下(以太帧):
网络层协议有IP 、 ICMP 、 ARP 等:
IP分为 IPv4 和 IPv6, 这里介绍 IPv4
IPv4协议格式如下:
ICMP用于控制,每一种控制有独特的格式,由于格式太多,这里不介绍,详情可参考 RFC792 - Internet Control Message Protocol 。
ARP协议格式如下:
传输层协议有TCP 、 UDP :
TCP协议格式如下:
UDP协议格式如下:
基于TCP 的应用层协议主要有 HTTP:
HTTP协议格式如下 ( 具体数据会不同,这里供参考 ) :
①:HTTP 请求:
GET 请求:
POST请求:
②:HTTP 响应:
基于UDP 的应用层协议主要有 DNS:
DNS协议格式如下:
以上这些协议是本程序所能分析出来的,由于网络协议有上千种,不可能都去分析,所以其他的协议在此忽略。
既然找到抓包工具,弄清协议格式,现在就开始系统设计吧。
2.2:系统设计
环境搭建:
设计少不了的一项工作就是环境搭建,以下是环境搭建的步骤:
①:jre 安装 ( 最好是最新版本—— jre6)
②:Myeclipse 或者 Eclipse 安装
③: 下载并安装winpcap (可以下载最新版本) 。
④: 配置Jpcap 路径:这一步也是最重要的一步。具体路径为,把 Jpcap 文件夹下 lib 文件夹里的 Jpcap.dll 复制到 "C:\Program Files\Java\jre1.6.0_07\bin" 文件夹里面(复制到你机器 JRE 文件夹放到 bin 文件夹里面就可以了,其中 JRE 的版本一定要与 Eclipse 配置的版本一致),再把 Jpcap 文件夹下 lib 文件夹里的 Jpcap.jar 复制到 "C:\Program Files\Java\jre1.6.0_07\lib\ext" 文件夹里面(复制到你机器 JRE 文件夹 ->lib->ext 放到 ext 文件夹里面就可以了) 。
⑤: 配置Eclipse 的 JRE 环境,(一定需要),选择 Window->preferences->Java->Installed JREs, 在 Installed JREs 选择框中选择相应的 JRE 版本,点 Edit ,
选择Add External JARs…, 选择你的 Jpcap.jar 包( "C:\Program Files\Java\jre1.6.0_07\lib\ext" 文件夹里),在 Finish 就配置全部完成了 。
在本程序中,采用图形化界面,根据用户的相关配置进行抓包,具体过程参考下面实现过程。
第三章 系统实现
3.1:实现过程
当环境搭建好后,一起都会显得很简单了,这里说一下原理,在安装winpcap 时,其实就是利用第三方编写好的程序,他们已经实现了底层和网卡的交互,数据捕获,并把数据封装好,然后对上层用户提供 API ,现在我们就利用他们提供的 API ,即 JPca p 来处理他们封装好的数据。
所以在环境搭建中,必须安装winpcap 和导入 JPca p 库函数。
下面是获取包的几个关键步骤:
①:获得网卡接口
通过调用JPca p 库中 JpcapCaptor 的静态方法 getDeviceList() 得到网卡接口数组。
②:获得某个网卡接口的连接
通过调用JPca p 库中 JpcapCaptor 的静态方法 openDevice() 得到某个网卡接口的连接实例。
③:调用实例的processPacket() 开始抓包。
④:将抓获的包交给实例的receivePacket() 方法进行分析处理。
以上就是整个抓包过程。
当然,在上面的那些方法中,都有一些特定的参数,上面没有给出,这些参数都是用于配置抓包的,程序采用图形化界面,所以这些参数可以在界面上根据用户的选择,然后传入相应方法中,最终获得用户所需的信息。
采用图形化界面,要解决的一个问题就是界面的刷新,通常是后台程序运行,产生结果,界面中要及时显现变化,即界面内容因后台结果而变。
在这个前台( 界面 ) 和后台都要兼顾的前提下,必须使用线程来解决这个问题,界面是根据后台而变的,所以可以为界面分配较高优先级,当界面显示内容不再变化,程序才会去执行较低优先级的后台抓包程序,而当抓包结果产生时,程序马上又能调用较高优先级的前台程序显示出来。
至此,前台和后台都能兼顾运行。
这里要说明的一点是,由于采用线程抓包,所以所抓获的包不是连续通过网卡的包,我们获得的,只是某些时刻的包。
3.2:采用技术
①:JPca p 库函数运用
②:Swing 组件运用
③:线程技术运用
④:托盘技术运用( 托盘图标,用于图形化界面,没有抓包方面的知识 )
⑤:文件操作技术运用( 分析结果保存于文件和文件打开 )
3.3:结果界面
①:开始界面( 欢迎界面 )
②:菜单选项
File菜单: Capture菜单:
Tool菜单: Help菜单:
③:网卡信息
④:配置抓包
⑤:开始抓包
⑥:保存文件 (自定义后缀为 .sto)
⑦:打开以前保存的文件
点击打开后,会在界面上显示保存的结果
⑧:相关链接
Wireshake 链接(本程序就是参考此程序的)
注:要链接此程序,必须安装wireshake 于本地机器上,目录为安装默认目录。
Check network card factory(网卡厂商查询 ) 链接
注:通过此链接,可跳转到国外的一个查询网站,输入前3 位 16 进制(即前 24 位二进制)网卡地址查询。
⑨