计网大型实验报告课程计算机网络原理大型实验姓名汪敏倩班级计科1201 学号201226100117一、实验目的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 -a Ip:用于显示与该IP地址指向的接口相关的ARP缓存项目。
arp –s Ip 物理地址:向ARP缓存中人工输入一个静态项目。
arp-d Ip:人工删除一个静态项目。
4、route:主要用于手动配置静态路由。
route print--本命令用于显示路由表中的当前项目,由于用IP地址配置了网卡,因此所有的这些项目都是自动添加的。
route add--使用本命令,可以将新路由项目添加给路由表。
例如,如果要设定一个到目的网络209.98.32.33的路由,其间要经过5个路由器网段,首先要经过本地网络上的一个路由器,其IP为202.96.123.5,子网掩码为255.255.255.224,那么你应该输入以下命令:route add 209.98.32.33 mask 255.255.255.224 202.96.123.5 metric 5route change--你可以使用本命令来修改数据的传输路由,不过,你不能使用本命令来改变数据的目的地。
下面这个例子可以将数据的路由改到另一个路由器,它采用一条包含3个网段的更直的路径:route change 209.98.32.33 mask 255.255.255.224 202.96.123.250 metric 3route delete--使用本命令可以从路由表中删除路由。
例如:route delete209.98.32.333.2任务二:3.2.1◆实验原理:1、交换机的原理:局域网交换机拥有许多端口,每个端口有自己的专用带宽,并且可以连接不同的网段。
交换机各个端口之间的通信是同时的、并行的,这就大大提高了信息吞吐量。
为了进一步提高性能,每个端口还可以只连接一个设备。
传统的交换机本质上是具有流量控制能力的多端口网桥,即传统的(二层)交换机。
把路由技术引入交换机,可以完成网络层路由选择,故称为三层交换,这是交换机的新进展。
交换机(二层交换)的工作原理交换机和网桥一样,是工作在链路层的联网设备,它的各个端口都具有桥接功能,每个端口可以连接一个LAN或一台高性能网站或服务器,能够通过自学习来了解每个端口的设备连接情况。
所有端口由专用处理器进行控制,并经过控制管理总线转发信息。
2、路由器的原理:路由器是一种计算机网路设备,它能将数据包通过一个个网路传送至目的地,这个过程称为路由。
路由工作在OSI模型的第三层(即网路层,例如Internet Protocol(IP)层)。
路由器就是连接两个以上网路线路的设备。
由于位于两个或更多个网路的交汇处,从而可在它们之间传递分组(一种数据的组织形式)。
路由器与交换机(Switch)在概念上有一定重叠但也有不同:交换机泛指工作于任何网路层次的数据中继设备(尽管多指网桥),而路由器则更专注于网路层。
3、虚拟局域网:虚拟局域网(VLAN)是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能、部门及应用等因素将它们组织起来,相互之间的通信就好像它们在同一个网段中一样,由此得名虚拟局域网。
4、静态路由:静态路由是指由用户或网络管理员手工配置的路由信息。
当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表中相关的静态路由信息。
静态路由信息在缺省情况下是私有的,不会传递给其他的路由器。
当然,网管员也可以通过对路由器进行设置使之成为共享的。
静态路由一般适用于比较简单的网络环境,在这样的环境中,网络管理员易于清楚地了解网络的拓扑结构,便于设置正确的路由信息。
3.2.2◆实验步骤:1、安装Packet.Tracer软件。
2、放一个交换机,然后后面放4个主机。
3、分别给主机配置IP地址。
分别为:172.16.17.1 172.16.17.2 172.16.17.3 172.16.17.44、按顺序接上交换机的E0/1 E0/2 E0/3 E0/4端口5、这个时候你用PC0去pingPC1,PC2,PC3都是通的。
然后接下来我们把PC0和PC2放一个VLAN PC1和PC3放一个VLAN6、在这个时候用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个路由器的静态路由。
左边路由器:右边路由器:其中在上面的配置其实就一句话,IP route +IP地址+子网掩码+下一跳的端口IP。
不过要先进入配置模式,需要输入config terminal。
3.3任务三:3.3.1◆实验原理:Wincap:Winpcap是一个Win32平台下用于抓包和分析的系统。
包括一个内核级别的packet filter,一个底层的DLL(packet.dll)和一个高级的独立于系统的DLL(Wpcap.dll)。
Jnetpcap:一个基于java的开源包,通过wincap来抓取网卡数据包。
百度上暂无简介,也没有中文教程,只有一个英文版的操作文档。
Java:本人最熟悉的编程语言,简介,易懂强大。
但是java不支持网络抓包,所以需要加载一个jpcap,在网上也有好多关于jpcap的教程,但是它是32位的,电脑是64位,所以用不了;只能用jnetpcap,通过调用wincap来抓取网卡的数据包。
抓取到的一个数据包是囊括好多字段(ip,udp,date等等下面会进行展示),然后截取数据包中的IP字段。
3.3.2◆实验步骤:1、先安装wincap;2、把下载好的jnetpcap中的jnetpcap.jar包拷贝到%JA V A_HOME%\jre\\lib\ext\目录下,然后把jnetpcap.dll拷贝到%JA V A_HOME%\jre\bin\目录下。
3、然后再eclipes中加载这个jar包。
右键项目工程-->propertities-->java build path-->add externals JARS然后导入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数据段截取出来存放到JBuffer buf中,然后输出。
如果数据包中没有IP数据段就直接放弃该包,检查下一个包。
8、那有的小伙伴要问了,不是要规定抓包数的吗。
在哪里呢?是的,在jnetpcap中规定数据包抓取数目的在这里。
通过pcap.loop(int,print,name)来规定抓取包的数量。
其中int型的就是抓包数。
完整代码:package com.demo;import java.util.ArrayList;import java.util.List;import java.util.Scanner;import org.jnetpcap.Pcap;import org.jnetpcap.PcapIf;import org.jnetpcap.nio.JBuffer;import org.jnetpcap.packet.PcapPacket;import org.jnetpcap.packet.PcapPacketHandler;import work.Ip4;@SuppressWarnings("deprecation")public class findIp1 {static int sb=0;//设备号static int num=0;//抓包数public static void main(String[] args) {List<PcapIf> alldevs = new ArrayList<PcapIf>();//设备存放StringBuilder errbuf = new StringBuilder(); //错误存放/********************************************* 取得设备列表********************************************/int r = Pcap.findAllDevs(alldevs, errbuf);if (r == Pcap.NOT_OK || alldevs.isEmpty()) {System.err.printf("找不到设备,请重试 %s", errbuf.toString());return;}System.out.println("找到的网络设备如下:");int i = 0;for (PcapIf device : alldevs) {System.out.printf("#%d: %s [%s]\n", i++, device.getName(), device .getDescription());}System.out.println("请输入2个数字,第一个是设备选择,第二个是抓包数:"); Scanner scan=new Scanner(System.in);sb=scan.nextInt();num=scan.nextInt();scan.close();PcapIf device = alldevs.get(sb); // 选择一个设备Sytem.err.printf("\n从改设备上 '%s' 抓取到:\n", device.getDescription());*********************************打开选中的设备***************************************/int snaplen = 64 * 1024; // 捕获整个包int flags = Pcap.MODE_PROMISCUOUS; //设置为混乱状态int timeout = 10 * 1000; //最大超时数Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);if (pcap == null) {System.err.printf("打开设备是产生错误: "+ errbuf.toString());return;}PcapPacketHandler<Object> print = new PcapPacketHandler<Object>() {Ip4 ip=new Ip4();int i=0;public void nextPacket(PcapPacket packet, Object obj) {i++;//System.out.println(packet);//if( packet.hasHeader(TC[].ID))if(packet.hasHeader(ip)){// System.out.print(packet);JBuffer buf=ip;System.out.println("第"+i+"个:");System.out.println(buf);System.out.println();}else{System.out.println("第"+i+"个"+"抓取的数据包中不包含IP段,舍弃。