《计算机网络课程设计实验报告.pdf》由会员分享,可在线阅读,更多相关《计算机网络课程设计实验报告.pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、计算机网络课程设计实验报告 Prepared on 22 November 2020中南大学课程设计报告课程:计算机网络课程设计题目:基于基于 WinpcapWinpcap 的网络流量统计分析的网络流量统计分析指导教师:张伟目录第一章 总体设计一、实体类设计二、功能类设计三、界面设计-P3-P3-P3第二章 详细设计一、实体类实现二、功能类实现三、界面实现-P4-P4-P5第三章 源代码清单及说明一、-P7二、-P9三、-P9四、-P13第四章 运行结果 -P19第五章 心得体会 -P21第一章 总体设计一、实体类设计TCP、UPD、ICMP、ARP、广播数据包五个包的数据结构设计二、功能类设
2、计(1)网卡获取(2)包的抓捕(3)包的处理三、界面设计(1)布局(2)按钮功能连接第二章 第二章 详细设计一、实体类实现TCP、UPD、ICMP、ARP、广播数据包五个包的数据结构设计。本程序采用 Java 编写,基于 win10pcap。Win10pcap是 winpcap在 win10系统上的适用版本。Java 对于 winpcap使用 jnetpcap进行支持。对于 TCP、UPD、ICMP、ARP、广播数据包五种类型的包,在 jnetpcap的 jar包中大部分已经封装好了相关的实体类型。对应如下:ARP 实体类:UPD 实体类:IP 实体类:TCP 实体类:UDP 实体类:而对于其
3、中的广播数据包,其判断我利用捕获到的 IP 包的目的地址进行判断,若其目的地址为,则认为其为广播数据包。二、功能类实现(1)网卡获取电脑上的包的发送与接受都得通过网卡来进行,所以为了完成局域网数据包的捕获和统计,我首先要做的是获取到电脑上的网卡列表,然后选择一个网卡进行包的捕获。而相关代码在jnetpcap的官网的示例代码 1 中可以找到,从中可以学习到的是jnetpcap 的各种使用方法。在我电脑上可以捕获到三个网卡,一个是本机自身的物理网卡,另外两个是虚拟机模拟出的虚拟网卡。(2)包的抓捕Jnetpcap 中包的抓捕也是有着固定的格式的,这在官网的示例代码中也是可以找到的,只要设置好相关的
4、参数,就可以进行抓捕具体方法如下,利用 Pcap 对象的 loop 方法。就是实例化一个Pcap 对象,然后调用其 loop 方法。第一个参数 arg0 代表循环次数,第二个参数就是传入一个PcapPaketHandler或其子类的对象,这个对象类型是要由我们自己编写的对包处理的方法。(3)包的处理在 这 里 对 捕 获 的 包 的 处 理 我 是 编 写 了 一 个 PcapPacketHandler的 子 类,然 后 重 写 了nextPacket()方法。在这个方法里我把捕获到的包当作参数传递个具体的处理方法(packet)。(packet)方法是由我自己编写的。handlePacket
5、 是 packetMatch 的一个静态方法,可以直接调用。在这个方法里面,它会把捕获到的包的包头和 TCP、UPD、ICMP、ARP、广播数据包五种类型的包的包头进行一一比较,以确认是否抓到了了相对应的包。这儿还用到的就是 jnetpcap 的内部的一个方法,就是(arg0),通过在 arg0 传入已在 jnetpcap 里封装好的包的类型的实例,可以很好的判断该包是属于什么包类型的,是TCP、UPD、ICMP、ARP 还是广播数据包。然后内部对于各种包的信息的输出也有很好的支持,可以直接使用相应的toString方法,就可以输出各种相关信息。(4)网络流量统计对于各个捕获到的包,分别针对各
6、种类型的包设计了一个 Double 变量用于统计其传送过来相应包头的大小,并在停止抓包后将统计的数据输出在最下方的TextArea里面。三、界面实现本程序在设计 GUI 时使用了 Java 的一个很好的插件 WindowBuilder。(1)布局一开始使用 Border Layout 布局,安排好各个按钮位置,文本框位置。后来采用Absolutelayout,并将窗口大小固定化。在布局的最上方是一个 JToolBar 的实例对象,其中放置有选择网卡、开始抓包、停止抓包、清空记录等四个选项,中间是两个带滚动条的多行文本框,左边的用于显示捕获的包的列表,右边用于显示左边的我们选中的包的具体信息。最
7、下方会在停止抓包按钮生效后输出总的抓包情况。(2)按钮功能连接在布局的最上方是一个 JToolBar 的实例对象,其中放置有选择网卡、开始抓包、停止抓包、清空记录等四个选项,其中选择网卡的功能具体由JComboBox(多文本选择框)上的选项决定,这个多文本选择框监听着 网卡获取的方法,它会从该方法获得一个网卡列表,然后将其文本输出。开始抓包的方法所对应的事件是抓包的事件,并且该抓包事件是个并发的进程。因为如果不将其设置为并发进程,其会使其它事件一直阻塞,甚至连停止抓包都做不到。停止抓包的事件其实是改变了开始抓包中的一个标志位,让其为假。该标志为为真,抓包程序会一直进行,该标志为为假,抓包停止。
8、下方两个文本框,左边的文本框监听的是开始抓包这个事件,当这个事件开始,这个事件会向文本框传输捕获到的包的列表,然后让其显示。而右边的文本框监听的是左边文本框我们选中的内容的相应事件。因为对于我们捕获到的包我进行了编号,当我们在左边的文本框选中了一个包之后,左边的文本框对应的包的序号会被右边的文本框获取,用于在一个列表中根据序号查找到相对应的包的详细内容,然后将其输出。统计功能的实现是在每个包的具体处理时,在处理包的方法类中已经有定义好几个静态变量用于计数,每个包具体处理时,将相对应的包类型数量加一即可。还定义了其它的变量用于统计流量大小,也是在每个包具体处理时,将相对应的包的大小加到相对应的静
9、态变量上即可。第三章 源代码清单及说明etDescription();*/ppend(ipInt24)&0 xff).append(.).appendppend(ipInt24)&0 xff).append(.).append (ipInt16)&0 xff).append(.).append(ipInt16)&0 xff).append(.).append(ipInt8)&0 xff).append(.).append(ipInt8)&0 xff).append(.).append(ipInt&0 xff).toString();(ipInt&0 xff).toString();*/*/pu
10、blic static void main(String args)public static void main(String args)/*/*Create the frame.*Create the frame.*/*/public Windows()public Windows()setTitle(u6293u5305);setTitle(u6293u5305);setDefaultCloseOperation;setDefaultCloseOperation;setBounds(100,100,692,477);setBounds(100,100,692,477);contentPa
11、ne=new JPanel();contentPane=new JPanel();(new EmptyBorder(5,5,5,5);(new EmptyBorder(5,5,5,5);setContentPane(contentPane);setContentPane(contentPane);(null);(null);(false);(false);JToolBar toolBar=new JToolBar();JToolBar toolBar=new JToolBar();(5,5,666,23);(5,5,666,23);(toolBar);(toolBar);JButton but
12、ton=new JButton(u9009u62E9u7F51u5361);JButton button=new JButton(u9009u62E9u7F51u5361);(button);(button);final JComboBox comboBox=new JComboBox();final JComboBox comboBox=new JComboBox();(new ActionListener()(new ActionListener()public void actionPerformed(ActionEvent e)public void actionPerformed(A
13、ctionEvent e)String net=(String)();String net=(String)();ArrayList alldevs=();ArrayList alldevs=();int i=0;int i=0;for(PcapIf device:alldevs)for(PcapIf device:alldevs)if()if()i+;i+;=i;=i;();();(new Runnable()(new Runnable(););public void run()public void run()try try Windows frame=new Windows();Wind
14、ows frame=new Windows();(true);(true);();();catch(Exception e)catch(Exception e););(new ItemListener()(new ItemListener(););(comboBox);(comboBox);JButton button_1=new JButton(u5F00u59CBu6293u5305);JButton button_1=new JButton(u5F00u59CBu6293u5305);(action_1);(action_1);(button_1);(button_1);JButton
15、button_2=new JButton(JButton button_2=new JButton(停止抓包停止抓包););(action_2);(action_2);(new ActionListener()(new ActionListener(););(button_2);(button_2);JButton button_3=new JButton(u6E05u7A7Au8BB0u5F55);JButton button_3=new JButton(u6E05u7A7Au8BB0u5F55);(new ActionListener()(new ActionListener(););(a
16、ction_3);(action_3);(button_3);(button_3);Border brd=(1,1,2,2,;Border brd=(1,1,2,2,;(brd);(brd);(new ListSelectionListener()(new ListSelectionListener()public void valueChanged(ListSelectionEvent arg0)public void valueChanged(ListSelectionEvent arg0)etDescription();etDescription();public void action
17、Performed(ActionEvent e)public void actionPerformed(ActionEvent e)public void actionPerformed(ActionEvent arg0)public void actionPerformed(ActionEvent arg0)public void itemStateChanged(ItemEvent arg0)public void itemStateChanged(ItemEvent arg0)private class SwingAction_1 extends AbstractAction priva
18、te class SwingAction_1 extends AbstractAction private class SwingAction_2 extends AbstractAction private class SwingAction_2 extends AbstractAction public SwingAction_2()public SwingAction_2()putValue(NAME,putValue(NAME,停止抓包停止抓包););public SwingAction_1()public SwingAction_1()public void actionPerfor
19、med(ActionEvent e)public void actionPerformed(ActionEvent e)tart();tart();putValue(NAME,putValue(NAME,开始抓包开始抓包););putValue(SHORT_DESCRIPTION,Some short description);putValue(SHORT_DESCRIPTION,Some short description);putValue(SHORT_DESCRIPTION,Some short description);putValue(SHORT_DESCRIPTION,Some s
20、hort description);public void actionPerformed(ActionEvent e)public void actionPerformed(ActionEvent e)();();();();String message=Tcp:+String message=Tcp:+包包+KB+KB+Udp:+Udp:+包包+KB+n+KB+n+Icmp:+Icmp:+包包+KB+KB+Arp:+Arp:+包包+KB+n+KB+n+广播数据包广播数据包+包包+KB+KB+总流量:总流量:+MB;+MB;(message);(message);private class
21、SwingAction_3 extends AbstractAction private class SwingAction_3 extends AbstractAction public SwingAction_3()public SwingAction_3()public void actionPerformed(ActionEvent e)public void actionPerformed(ActionEvent e)();();putValue(NAME,putValue(NAME,清空记录清空记录););putValue(SHORT_DESCRIPTION,Some short
22、description);putValue(SHORT_DESCRIPTION,Some short description);第四章 运行结果第五章 心得体会通过这次实验我对于 TCP、UPD、ICMP、ARP、广播数据包等包的结构有了更好的认识。对于电脑上底层的发包与抓包也有了一定的认识。然后就是对用Eclipse 进行编写 Java 程序有了更深的体会。Java 是一个成熟的语言,Eclipse 是一个比较完善的工具,对于各个方面知识的应用编写都有一定的基础支持。例如这次编写,Eclips 就通过 jnetpcap 很好的衔接了 winpcap 的借口功能。另外,在界面编写上,windo
23、wbuilder 也非常好用。这是一种可视化的编程,可以直接拖拉各种部件,在容器内进行布局。然后对于各个部件事件的添加也是很方便,这加快了程序的开发过程。嗯,这次的实验对于我来说不是很难,感觉这主要是前人种树,后人乘凉。很多东西都已经有了很完善的工具和结构。而现阶段我所能学习的感觉无非是对于各种语言工具、各种插件、框架的使用,对于这些前人们编写的东西掌握到一定的程度,以方便以后自行开发自己的一些工具。觉得课设就是一个学习过程。我在前人走过的路上学习着,避免走太多的弯路。在另一方面,也在路上不断积累,好在以后可以厚积薄发,有点自己的东西。另外还体会到了一点,就是用户需求和程序员实现功能的矛盾。由于用户需求不明确,或者说语意上描述的模糊,一名程序员很难写出百分百符合用户需要的程序。我感觉这方面我能做的就是提高自己程序的可扩展性,在用户需要一些其它的功能时,能对于程序进行功能的扩展。例如,最后的那流量大小的统计数目就是后来根据老师的要求添加上去的。总之这次课设让我对于之前我学过的一些知识计算机网络、Java 等再一次复习,然后进行了一次综合的运用,加深了我对它们的认知,也接触到了一些以前没用过的工具,感觉受益匪浅吧!