计网实验报告抓取本地网卡的IP数据包.docx
《计网实验报告抓取本地网卡的IP数据包.docx》由会员分享,可在线阅读,更多相关《计网实验报告抓取本地网卡的IP数据包.docx(24页珍藏版)》请在冰点文库上搜索。
计网实验报告抓取本地网卡的IP数据包
计网大型实验报告
课程计算机网络原理大型实验姓名汪敏倩
班级计科1201学号************
一、实验目的
1.1任务一:
了解常用网络命令Ping、Tracert/traceroute、Arp、Route的工作原理及使用。
1.2任务二:
了解交换机的工作原理,掌握常用交换机的配置和应用以及静态路由的配置。
1.3任务三:
抓取本地网卡的IP数据包,并且分析IP数据包的各个部分字段。
二、实验软件
2.1任务一:
cmd.exe命令解释程序
2.2任务二:
Packet.Tracer模拟器
2.3任务三:
Wincap网络抓包器,jnetpcap开源包,eclipes编程器,java语言
三、实验步骤或实验原理
3.1任务一:
3.1.1◆实验原理:
1、Ping是Windows下的一个命令在Unix和Linux下也有这个命令。
ping也属于一个通信协议,是TCP/IP协议的一部分。
利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。
它所利用的原理是这样的:
利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。
使用格式:
Ping空格IP地址。
该命令还可以加许多参数使用,具体是键入Ping按回车即可看到详细说明。
2、Tracert/traceroute的用处和PING是差不多的。
但是也有本质的区别。
用ping的时候是不会显示经过的路径的。
但是用tracerert的时候就可以显示经过的路由,并且显示它经过那个路由,花了多少时间,并且每个路由都会测试3次。
它可以让你知道,你的计算机离目的计算机在网络上的距离有多远,经过多久才能到达。
使用格式:
Tracert/traceroute空格IP地址。
3、ARP即地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。
主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存一节约资源。
地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机接收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;
使用格式:
arp-a或arp–g:
用于查看缓存中的所有项目。
arp-aIp:
用于显示与该IP地址指向的接口相关的ARP缓存项目。
arp–sIp物理地址:
向ARP缓存中人工输入一个静态项目。
arp-dIp:
人工删除一个静态项目。
4、route:
主要用于手动配置静态路由。
routeprint--本命令用于显示路由表中的当前项目,由于用IP地址配置了网卡,因此所有的这些项目都是自动添加的。
routeadd--使用本命令,可以将新路由项目添加给路由表。
例如,如果要设定一个到目的网络209.98.32.33的路由,其间要经过5个路由器网段,首先要经过本地网络上的一个路由器,其IP为202.96.123.5,子网掩码为255.255.255.224,那么你应该输入以下命令:
routeadd209.98.32.33mask255.255.255.224202.96.123.5metric5
routechange--你可以使用本命令来修改数据的传输路由,不过,你不能使用本命令来改变数据的目的地。
下面这个例子可以将数据的路由改到另一个路由器,它采用一条包含3个网段的更直的路径:
routechange209.98.32.33mask255.255.255.224202.96.123.250metric3
routedelete--使用本命令可以从路由表中删除路由。
例如:
routedelete209.98.32.33
3.2任务二:
3.2.1◆实验原理:
1、交换机的原理:
局域网交换机拥有许多端口,每个端口有自己的专用带宽,并且可以连接不同的网段。
交换机各个端口之间的通信是同时的、并行的,这就大大提高了信息吞吐量。
为了进一步提高性能,每个端口还可以只连接一个设备。
传统的交换机本质上是具有流量控制能力的多端口网桥,即传统的(二层)交换机。
把路由技术引入交换机,可以完成网络层路由选择,故称为三层交换,这是交换机的新进展。
交换机(二层交换)的工作原理交换机和网桥一样,是工作在链路层的联网设备,它的各个端口都具有桥接功能,每个端口可以连接一个LAN或一台高性能网站或服务器,能够通过自学习来了解每个端口的设备连接情况。
所有端口由专用处理器进行控制,并经过控制管理总线转发信息。
2、路由器的原理:
路由器是一种计算机网路设备,它能将数据包通过一个个网路传送至目的地,这个过程称为路由。
路由工作在OSI模型的第三层(即网路层,例如InternetProtocol(IP)层)。
路由器就是连接两个以上网路线路的设备。
由于位于两个或更多个网路的交汇处,从而可在它们之间传递分组(一种数据的组织形式)。
路由器与交换机(Switch)在概念上有一定重叠但也有不同:
交换机泛指工作于任何网路层次的数据中继设备(尽管多指网桥),而路由器则更专注于网路层。
3、虚拟局域网:
虚拟局域网(VLAN)是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能、部门及应用等因素将它们组织起来,相互之间的通信就好像它们在同一个网段中一样,由此得名虚拟局域网。
4、静态路由:
静态路由是指由用户或网络管理员手工配置的路由信息。
当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表中相关的静态路由信息。
静态路由信息在缺省情况下是私有的,不会传递给其他的路由器。
当然,网管员也可以通过对路由器进行设置使之成为共享的。
静态路由一般适用于比较简单的网络环境,在这样的环境中,网络管理员易于清楚地了解网络的拓扑结构,便于设置正确的路由信息。
3.2.2◆实验步骤:
1、安装Packet.Tracer软件。
2、放一个交换机,然后后面放4个主机。
3、分别给主机配置IP地址。
分别为:
172.16.17.1172.16.17.2172.16.17.3172.16.17.4
4、按顺序接上交换机的E0/1E0/2E0/3E0/4端口
5、这个时候你用PC0去pingPC1,PC2,PC3都是通的。
然后接下来我们把PC0和PC2放一个VLANPC1和PC3放一个VLAN
6、在这个时候用PC0去PING它们3个主机。
只有PC2是通的,因为他们在一个VLAN当中。
VLAN就是相当于在一个局域网中一样的。
7、放好两个路由器,两个主机,之间用交叉线连接,如图设置,172.16.17.0和172.16.17.64和172.16.17.128是3个网段
8、172.16.17.1和172.16.17.129是主机IP,这里默认网关是指你连接到路由器端口的端口IP。
9、172.16.17.2和172.16.17.130是2个路由器端口IP。
连接2个主机。
配置图如下:
10、172.16.17.65和172.16.17.66是两个路由器连接端口的IP,配置如下:
11、全部配置好后,我们可以用PC0去pingPC1是不通的。
(你要先在路由器中把左右2个端口打开哦。
!
)
12、因为没有路由转发条件。
所以接下来就要配置2个路由器的静态路由。
左边路由器:
右边路由器:
其中在上面的配置其实就一句话,IProute+IP地址+子网掩码+下一跳的端口IP。
不过要先进入配置模式,需要输入configterminal。
3.3任务三:
3.3.1◆实验原理:
Wincap:
Winpcap是一个Win32平台下用于抓包和分析的系统。
包括一个内核级别的packetfilter,一个底层的DLL(packet.dll)和一个高级的独立于系统的DLL(Wpcap.dll)。
Jnetpcap:
一个基于java的开源包,通过wincap来抓取网卡数据包。
XX上暂无简介,也没有中文教程,只有一个英文版的操作文档。
Java:
本人最熟悉的编程语言,简介,易懂强大。
但是java不支持网络抓包,所以需要加载一个jpcap,在网上也有好多关于jpcap的教程,但是它是32位的,电脑是64位,所以用不了;只能用jnetpcap,通过调用wincap来抓取网卡的数据包。
抓取到的一个数据包是囊括好多字段(ip,udp,date等等下面会进行展示),然后截取数据包中的IP字段。
3.3.2◆实验步骤:
1、先安装wincap;
2、把下载好的jnetpcap中的jnetpcap.jar包拷贝到%JAVA_HOME%\jre\\lib\ext\目录下,然后把jnetpcap.dll拷贝到%JAVA_HOME%\jre\bin\目录下。
3、然后再eclipes中加载这个jar包。
右键项目工程-->propertities-->javabuildpath-->addexternalsJARS然后导入jnetpcap.jar包就可以了。
4、代码编写。
首先查找电脑中的网络设备,通过pcap.findAllDevs()来实现本机网络设备的筛选。
5、在筛选出的网络设备中选择一个网络设备进行抓包,通过alldevs.get(int)来实现。
6、打开选中的设备,开始抓包。
Snaplen:
数据包长度,64*1024表示整个包的长度。
Flags:
模式,把选中的网卡设置成混乱状态。
Timeout:
表示最大等待时间10S;通过pcap.openlive(name,snaplen,flags,timeout,errbuf)打开选中的设备开始抓包。
7、把抓取到的数据包进行处理,因为我们要抓取的是IP数据包,所以这里定义了IP4的协议。
通过nextPacket(packet,obj)对每个抓取到的包进行处理。
If(packet.hasHeader(ip))来判断抓取到的一个数据包中是否包含IP数据段,如果包括IP数据段,就把IP数据段截取出来存放到JBufferbuf中,然后输出。
如果数据包中没有IP数据段就直接放弃该包,检查下一个包。
8、那有的小伙伴要问了,不是要规定抓包数的吗。
在哪里呢?
是的,在jnetpcap中规定数据包抓取数目的在这里。
通过pcap.loop(int,print,name)来规定抓取包的数量。
其中int型的就是抓包数。
完整代码:
packagecom.demo;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Scanner;
importorg.jnetpcap.Pcap;
importorg.jnetpcap.PcapIf;
importorg.jnetpcap.nio.JBuffer;
importorg.jnetpcap.packet.PcapPacket;
importorg.jnetpcap.packet.PcapPacketHandler;
importwork.Ip4;
@SuppressWarnings("deprecation")
publicclassfindIp1{
staticintsb=0;//设备号
staticintnum=0;//抓包数
publicstaticvoidmain(String[]args){
Listalldevs=newArrayList();//设备存放
StringBuildererrbuf=newStringBuilder();//错误存放
/********************************************
*取得设备列表
********************************************/
intr=Pcap.findAllDevs(alldevs,errbuf);
if(r==Pcap.NOT_OK||alldevs.isEmpty()){
System.err.printf("找不到设备,请重试%s",errbuf
.toString());
return;
}
System.out.println("找到的网络设备如下:
");
inti=0;
for(PcapIfdevice:
alldevs){
System.out.printf("#%d:
%s[%s]\n",i++,device.getName(),device
.getDescription());
}
System.out.println("请输入2个数字,第一个是设备选择,第二个是抓包数:
");
Scannerscan=newScanner(System.in);
sb=scan.nextInt();
num=scan.nextInt();
scan.close();
PcapIfdevice=alldevs.get(sb);//选择一个设备
Sytem.err.printf("\n从改设备上'%s'抓取到:
\n",device
.getDescription());
*********************************
打开选中的设备
***************************************/
intsnaplen=64*1024;//捕获整个包
intflags=Pcap.MODE_PROMISCUOUS;//设置为混乱状态
inttimeout=10*1000;//最大超时数
Pcappcap=Pcap
.openLive(device.getName(),snaplen,flags,timeout,errbuf);
if(pcap==null){
System.err.printf("打开设备是产生错误:
"
+errbuf.toString());
return;
}
PcapPacketHandler
Ip4ip=newIp4();
inti=0;
publicvoidnextPacket(PcapPacketpacket,Objectobj){
i++;
//System.out.println(packet);
//if(packet.hasHeader(TC[].ID))
if(packet.hasHeader(ip)){
//System.out.print(packet);
JBufferbuf=ip;
System.out.println("第"+i+"个:
");
System.out.println(buf);
System.out.println();
}
else{
System.out.println("第"+i+"个"+"抓取的数据包中不包含IP段,舍弃。
。
。
。
");
System.out.println();
}
/*Stringstr=packet.toString();
intindex=str.indexOf("timetolive");
intindex1=str.indexOf("Udp");
if(index!
=-1&&index1!
=-1){
Stringstr1=str.substring(str.indexOf("Ip"),str.indexOf("Udp"));
System.out.print(str1);
}
else
{
System.out.println("在抓获的改包中没有IP数据");
System.out.println("正在重新抓取。
。
。
。
。
。
");
}*/
//System.out.println(packet);
}
//System.out.print(packet);
//}
};
pcap.loop(num,print,"wmq");
pcap.close();
}
}
四、实验结果及分析
4.1任务一:
Ping命令使用结果截图:
Tracert命令使用结果截图:
ARP地址解析协议使用结果截图:
Route命令使用结果截图:
4.2任务二:
首先交换机连接了4台主机,设置好IP以后,我们不管用哪一台主机去ping另一台主机都是通的:
在通过交换机配置了vlan以后,把PC0和PC2放在一个局域网,PC1和PC3放在一个局域网,现在只有同在一个局域网内的主机之间是可以互相连通的,比如用PC0去ping其他三台主机,只有PC2是可以ping通的:
对于路由器的设置,在配置好各个端口和主机的IP地址以后,用一个网段的主机去ping另一个网段的主机是ping不通的:
通过route命令配置了路由表以后,连接这个网段的路由器就知道它要到达的目的网段的下一跳端口的IP地址,通过查找静态路由表就可以找到:
4.3任务三:
输入2个数字,一个是设备选择,另外一个是抓包数。
第一个包:
第二个包:
第三个包:
第四个包:
第五个包:
可以看到每个包都是不一样的IP数据包,但是其中的数据可以看得很清楚。
在这里我要展示一下抓取到的完整的包时怎么样的,只需要在代码中解封掉一句代码的注释就可以了。
其中还包含其他的数据,还有Data数据段的数据。
五、实验总结及体会
在实验编写的过程中遇到了很多问题,只有慢慢的把这些问题都解决之后才能完成这个实验,比如说在做任务二的时候,静态路由的配置中,由于我有两个路由器,两个主机,需要三个网段,老师要求的网段和IP地址的格式是172.16.学号后2位.X,所以三个网段只有最后一个X是可以自由变换的,刚开始真的搞不清楚状况,计网已经好久没接触了,再碰到真的是一头雾水,我又去翻看了以前的教材书,上网查资料,对子网掩码、网段这些概念都有一定的了解之后,才想起来可以把一个C类地址子网划分,原先的子网掩码变为255.255.255.192,三个网段分别为:
172.16.17.0,172.16.17.64,172.16.17.128。
再比如说在做任务三的时候,当时知道java不支持网卡抓包的时候就想加载一个jpcap的开源包,但是只有32位,计算机用不了。
后来又找了一个支持64位的jnetpcap开源包,但是这个开源包在XX上都没有教程,只有官方一个纯英文版的教程。
自己慢慢翻译慢慢学,从设备筛选到设备选择,从数据包抓取到数据包处理都是自己一步步学来的。
当时抓取到的数据包是一个包含很多数据的数据包,但是题目要求IP数据包。
但是不知道怎么样才能从数据包中把IP数据段给读出来,后来又看了好多资料,和操作文档,才找到了处理方法。
通过数据包,packet中的hasHeader来判断数据包中是否含有IP数据报的报头,如果有的话就把他存如一个JBuff中,然后输出。
从编程来说,这次的代码编写又提高了我的代码编程能力,也提高了我发现问题和解决问题的能力。
从技能上来说,我体会到英语的重要性,有大量的词汇,对自己是获益匪浅的。
从网络方面来说,我觉得网络数据保密性还是有威胁的,因为在本机网卡可以抓取到不是发给自己的数据包,这样就等于截获了别人的数据包,如果能过解析数据包中的加密Date段数据的话,就能查到别人的隐私等东西了,所以网络安全也是将来一个重大的问题。