中南大学课程设计报告
课程:计算机网络课程设计
题目:基于Winpcap的网络流量统计分析
指导教师:张伟
目录
总体设计
实体类设计 --------P3
功能类设计 --------P3
界面设计 --------P3
详细设计
实体类实现 --------P4
功能类实现 --------P4
界面实现 --------P5
源代码清单及说明
一、CaptureUtil.java --------P7
二、MyPcapPacketHandler.java --------P9
三、PacketMatch.java --------P9
四、Windows.java --------P13
运行结果 --------P19
第五章 心得体会 --------P21
总体设计
实体类设计
TCP、UPD、ICMP、ARP、广播数据包五个包的数据结构设计
功能类设计
网卡获取
包的抓捕
包的处理
界面设计
布局
按钮功能连接
第二章 详细设计
一、实体类实现
TCP、UPD、ICMP、ARP、广播数据包五个包的数据结构设计。
本程序采用Java编写,基于win10pcap。Win10pcap是winpcap在win10系统上的适用版本。Java对于winpcap使用jnetpcap进行支持。对于TCP、UPD、ICMP、ARP、广播数据包五种类型的包,在jnetpcap的jar包中大部分已经封装好了相关的实体类型。对应如下:
ARP 实体类:org.jnetpcap.protocol.network.Arp;
UPD 实体类:org.jnetpcap.protocol.network.Icmp;
IP 实体类:org.jnetpcap.protocol.network.Ip4;
TCP 实体类:org.jnetpcap.protocol.tcpip.Tcp;
UDP 实体类:org.jnetpcap.protocol.tcpip.Udp;
而对于其中的广播数据包,其判断我利用捕获到的IP包的目的地址进行判断,若其目的地址为255.255.255.255,则认为其为广播数据包。
功能类实现
(1)网卡获取
电脑上的包的发送与接受都得通过网卡来进行,所以为了完成局域网数据包的捕获和统计,我首先要做的是获取到电脑上的网卡列表,然后选择一个网卡进行包的捕获。而相关代码在jnetpcap的官网的示例代码1中可以找到,从中可以学习到的是jnetpcap的各种使用方法。
在我电脑上可以捕获到三个网卡,一个是本机自身的物理网卡,另外两个是虚拟机模拟出的虚拟网卡。
包的抓捕
Jnetpcap中包的抓捕也是有着固定的格式的,这在官网的示例代码中也是可以找到的,只要设置好相关的参数,就可以进行抓捕
具体方法如下,利用Pcap对象的loop方法。就是实例化一个Pcap对象,然后调用其loop方法。第一个参数arg0 代表循环次数,第二个参数就是传入一个PcapPaketHandler或其子类的对象,这个对象类型是要由我们自己编写的对包处理的方法。
包的处理
在这里对捕获的包的处理我是编写了一个PcapPacketHandler的子类,然后重写了nextPacket()方法。在这个方法里我把捕获到的包当作参数传递个具体的处理方法packetMatch.handlePacket(packet)。
packetMatch.handlePacket(packet)方法是由我自己编写的。handlePacket是packetMatch的一个静态方法,可以直接调用。在这个方法里面,它会把捕获到的包的包头和TCP、UPD、ICMP、ARP、广播数据包五种类型的包的包头进行一一比较,以确认是否抓到了了相对应的包。
这儿还用到的就是jnetpcap的内部的一个方法,就是packet.hasHeader(arg0),通过在arg0传入已在jnetpcap里封装好的包的类型的实例,可以很好的判断该包是属于什么包类型的,是TCP、UPD、ICMP、ARP还是广播数据包。
然后内部对于各种包的信息的输出也有很好的支持,可以直接使用相应的toString方法