35收集并统计网络TCP流量winpcap.docx
- 文档编号:30458380
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:12
- 大小:98.53KB
35收集并统计网络TCP流量winpcap.docx
《35收集并统计网络TCP流量winpcap.docx》由会员分享,可在线阅读,更多相关《35收集并统计网络TCP流量winpcap.docx(12页珍藏版)》请在冰豆网上搜索。
35收集并统计网络TCP流量winpcap
山东建筑大学计算机科学与技术学院
课程设计说明书
题目:
收集并统计网络TCP流量
课程:
计算机网络
院(部):
计算机科学与技术
专业:
网络工程
班级:
学生姓名:
学号:
指导教师:
完成日期:
山东建筑大学计算机科学与技术学院
课程设计任务书
设计题目
收集并统计网络TCP流量
已知技术参数和设计要求
1.利用WinPCap进行网络监控。
2.系统完成以下功能:
(1)利用WinPCap收集流经网卡的数据。
(2)对其中的TCP流量进行统计并显示统计结果。
(3)向用户提供友好的交互界面。
(4)用户可以方便地中止或继续TCP流量的统计。
(5)系统必须对出现的问题或错误做出响应。
3.建议该系统利用VC++实现。
设计内容与步骤
1.回顾开发工具的基本使用方法;
2.学习WinPCap编程的基本方法;
3.TCP流量统计系统框架结构设计;
4.TCP流量统计系统的设计与实现
6.课程设计任务说明书
设计工作计划与进度安排
1.学习WinPcap流量统计编程的基本方法4小时
2.程序设计以及调试方法2小时
3.TCP流量统计系统框架结构设计4小时
4.TCP流量统计系统设计16小时
5.课程设计说明书14小时
设计考核要求
1.出勤20%
2.答辩或演示30%
3.课程设计说明书50%
收集并统计网络TCP流量
一、问题描述
编程实现简单的TCP流量统计器,TCP流量统计器通过各种科学的方式,准确的纪录来访某一页面的访问者的流量信息,它从局域网中抓取IP数据包,并对它进行分析得到相应的头部信息,过滤TCP包进行分析,得到TCP流量信息。
二、基本要求
1.利用WinPCap进行网络监控。
2.系统完成以下功能:
(1)利用WinPCap收集流经网卡的数据。
(2)对其中的TCP流量进行统计并显示统计结果。
(3)向用户提供友好的交互界面。
(4)用户可以方便地中止或继续TCP流量的统计。
(5)系统必须对出现的问题或错误做出响应。
3.建议该系统利用VC++实现。
三、设计思想
TCP流量统计器通过Jpacp与winpcap来进行抓包,JPCAP调用wincap,而给JAVA语言提供一个公共的接口,WinPcap是用于网络封包抓取的一套工具,调用loopPackage获取数据包。
四、系统结构
首先用getDeviceList()方法获取网卡设备号,在用openDevice()方法打开指定设备,然后开始用loopPacket()方法获取数据包,最后进行输出。
五、程序流程
首先获取设备然后打开设备之后获取数据包最后进行输出,具体的流程图如下:
获取设备列表:
finalNetworkInterface[]devices=JpcapCaptor.getDeviceList();
打开指定设备:
JpcapCaptorjpcap=JpcapCaptor.openDevice(ni,2000,true,20);
获取数据包:
this.jpcap.loopPacket(-1,newReceivePacket(this.ipAddr));
输出信息:
Tcpflowstatistics.jta.append("TCPPacket"+"\n");
Tcpflowstatistics.jta.append("|——*此数据包的源IP地址:
"+tcp.src_ip+"\n");
Tcpflowstatistics.jta.append("|——*此数据包的目的IP地址:
"+tcp.dst_ip+"\n");
Tcpflowstatistics.jta.append("|——*此数据包的发送端口号:
"+tcp.src_port+"\n");
Tcpflowstatistics.jta.append("|——*此数据包的接收端口号:
"+tcp.dst_port+"\n");
Tcpflowstatistics.jta.append("|——*此数据包的源MAC地址:
"+ethernetPacket.getSourceAddress()+"\n");
Tcpflowstatistics.jta.append("|——*此数据包的目的MAC地址:
"+ethernetPacket.getDestinationAddress()+"\n");
Tcpflowstatistics.jta.append("|——*此数据包的传输层协议类型:
"+tcp.protocol+"(TCP)"+"\n");
Tcpflowstatistics.jta.append("|——*此数据包的长度:
"+tcp.len+"\n");
六、源程序
publicclassTcpflowstatistics{
privatestaticTcpflowstatisticsts;
privatebooleanflag=true;
JFramejf;
JButtonbt1,bt2,bt3,bt4;
staticJTextAreajta;
JScrollPanejsp;
JPaneljp1;
Tcpflowstatistics(){
jf=newJFrame("TGP流量统计器");
jf.setLayout(newBorderLayout());
jf.setVisible(true);
jf.setSize(800,600);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jta=newJTextArea();
jp1=newJPanel();
bt1=newJButton("开始");
bt2=newJButton("终止");
jsp=newJScrollPane();
jsp.setViewportView(jta);
jp1.add(bt1);
jp1.add(bt2);
bt1.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
bt1Action(e);
}
});
bt2.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
bt2Action(e);
}
});
jf.add(jp1,BorderLayout.NORTH);
jf.add(jsp,BorderLayout.CENTER);
}
publicstaticvoidmain(String[]args){
//启动统计线程
newTcpflowstatistics();
}
publicvoidinit(){
//获取本机上的网络接口对象
finalNetworkInterface[]devices=JpcapCaptor.getDeviceList();//获取设备列表
for(inti=0;i NetworkInterfaceni=devices[i]; //大于零时为有效地址;不抓本机地址 if(ni.addresses.length>0){ //一个网卡可能有多个地址,只获取第一个 Stringaddr=ni.addresses[0].address.toString(); try{//创建卡口上的抓取对象 JpcapCaptorjpcap=JpcapCaptor.openDevice(ni,2000,true, 20); LoopPacketThreadlpt=newLoopPacketThread(jpcap,addr); lpt.start(); jta.append(addr+"上的采集线程已启动"+"\n"); }catch(IOExceptione){ e.printStackTrace(); System.out.println("抓取数据包时出现异常"); } } } } publicvoidbt1Action(ActionEvente){ init(); } publicvoidbt2Action(ActionEvente){ System.exit(0); } } publicclassLoopPacketThreadextendsThread{ privateJpcapCaptorjpcap=null; privateStringipAddr=""; publicLoopPacketThread(JpcapCaptorjpcap,StringipAddr){ this.jpcap=jpcap; this.ipAddr=ipAddr; } //-1表示永久抓包 publicvoidrun(){ this.jpcap.loopPacket(-1,newReceivePacket(this.ipAddr));//监听捕获包 } } publicclassReceivePacketimplementsPacketReceiver{ privateStringipAddr=""; publicReceivePacket(StringipAddr){ this.ipAddr=ipAddr; } publicvoidreceivePacket(Packetpacket){ //如果截获的包为TCP包 if(packetinstanceofjpcap.packet.TCPPacket){//判断其左边对象是否为其右边类的实例,返回boolean类型的数据 TCPPackettcp=(TCPPacket)packet;//转化为响应实例 EthernetPacketethernetPacket=(EthernetPacket)packet.datalink; Tcpflowstatistics.jta.append("========================================================================"+"\n"); Tcpflowstatistics.jta.append("TCPPacket"+"\n"); Tcpflowstatistics.jta.append("|——*此数据包的源IP地址: "+tcp.src_ip+"\n"); Tcpflowstatistics.jta.append("|——*此数据包的目的IP地址: "+tcp.dst_ip+"\n"); Tcpflowstatistics.jta.append("|——*此数据包的发送端口号: "+tcp.src_port+"\n"); Tcpflowstatistics.jta.append("|——*此数据包的接收端口号: "+tcp.dst_port+"\n"); Tcpflowstatistics.jta.append("|——*此数据包的源MAC地址: "+ethernetPacket.getSourceAddress()+"\n"); Tcpflowstatistics.jta.append("|——*此数据包的目的MAC地址: "+ethernetPacket.getDestinationAddress()+"\n"); Tcpflowstatistics.jta.append("|——*此数据包的传输层协议类型: "+tcp.protocol+"(TCP)"+"\n"); Tcpflowstatistics.jta.append("|——*此数据包的长度: "+tcp.len+"\n"); } } } 七、测试数据 TCPPacket |——*此数据包的源IP地址: 10.8.110.15 |——*此数据包的目的IP地址: 202.194.86.134 |——*此数据包的发送端口号: 64060 |——*此数据包的接收端口号: 80 |——*此数据包的源MAC地址: f4: 6d: 04: 23: a9: da |——*此数据包的目的MAC地址: 14: 14: 4b: 19: ec: 3b |——*此数据包的传输层协议类型: 6(TCP) |——*此数据包的长度: 66 ======================================================================== TCPPacket |——*此数据包的源IP地址: 10.8.110.15 |——*此数据包的目的IP地址: 202.194.86.134 |——*此数据包的发送端口号: 64061 |——*此数据包的接收端口号: 80 |——*此数据包的源MAC地址: f4: 6d: 04: 23: a9: da |——*此数据包的目的MAC地址: 14: 14: 4b: 19: ec: 3b |——*此数据包的传输层协议类型: 6(TCP) |——*此数据包的长度: 66 ======================================================================== 八、测试情况 程序运行结果图: 结论 为期两周的课程设计在老师和自己的努力下很快地结束了,在此期间老师给了我们很大的帮助,在老师的指导之余我还认真学习了其它课本上未曾提到过的知识,比如说网络编程方面的知识,这是我们以前所没有接触过的,虽然说这给了我们很大的一个问题但是也同时给了我们一个很好的挑战自己的机会,以前从未听过Winpcap,现在道了它对于捕我知获网络上的一些数据信息很有帮助,从而丰富了我的知识,同时也知道了如何去利用它来为自己服务,这是一个很大的进步。 在自己查找资料的同时也锻炼了我及时捕获有用知识的能力,我想这是我现在乃至以后最大的一个财富,一个人最重要的就是要懂得如何去学,学习不是被动的,而是主动的,只有这样我们才能学得到对于我们自己有帮助的东西,用JAVA编程实现TCP数据报流量统计,开始这对于我来说是是一个很模糊的概念,但是当我在查找了很多资料之后我不再迷茫,而是慢慢跟着我所要找的资料来靠近我所要达到的目标。 这是我们每个人所要学会的。 这次的课程设计也使我意识到了理论与实践相结合的重要作用,学习到知识应该应用到实践中。 在此次的课程设计过程中,告诉我们要不断地学习计算机方面的知识,精益求精,如今是信息化的时代,在Internet相当发达的今天,网络编程技术也变的越来越重要,我们更应不断地提高自己的水平,在每次的程序中能够有更多的领悟。 也让自己在程序的编译和应用上可以有更大一步的提高。 在这两周的课程设计中我学到了很多知识,首先,要有理论做实践的指导才会很快很好地达到自己的目的,而且勤于学习和思考是一个很好的习惯,要将知识学得很扎实才会灵活运用,这同时也是我们所必须的,一切新科技的发现都是这样的;再次,一切事情都要勤于向有经验的人取经,这样才能少走弯路;最后,要珍惜和同学一起讨论和思考的机会,自己的同学是自己最好的帮手,在讨论和争辩中往往会使自己有了很好的想法。 虽然课程设计结束了,但是我们的学习还没结束,对知识的进一步学习还需要继续。 参考文献 [1]谢希仁计算机网络(第五版)电子工业出版社 [2]佟震亚现代计算机网络教程(第二版)电子工业出版社 [3]王保罗Java面向对象程序设计清华大学出版社 [4]毕广吉Java程序设计实例教程冶金工业出版社 [5]BruceEckel《Java编程思想》机械工业出版社 [6]FLANAGAN《Java技术手册》中国电力出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 35 收集 统计 网络 TCP 流量 winpcap