计算机网络课程设计报告.docx
《计算机网络课程设计报告.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告.docx(37页珍藏版)》请在冰豆网上搜索。
计算机网络课程设计报告
一.课程的目的和任务
本课程要求学生在“计算机网络原理”理论学习基础上,验证和加深对计算机网络概念的理解。
通过本课程的实践,培养学生独立思考、综合分析和动手实践的能力。
通过本课程的学习,达到如下目标:
(1).理解计算机网络体系结构和工作原理,掌握常用的网络命令,能够对命令的功能进行解释,分析命令执行结果,得到合理有效结论。
(2).掌握PacketTracer软件的操作方法,能够使用该软件模拟组网、配置交换机、路由器,能够按照实验方案实施仿真实验,采集和整理数据。
(3).具备网络编程能力,能够设计抓包程序获取数据包,结合相关协议对数据包各个字段的含义进行分析、处理和解释,获取有效结论。
二.课程的基本内容和要求
2.1实验理论
1.常用网络命令的工作原理及协议
2.ARP的原理
3.ICMP协议及原理
4.telnet远程登录的原理
5.IP报文格式及路由转发
6.以太网CSMA/CD协议原理
7.透明网桥、以太网交换机
8.虚拟局域网VLAN
9.路由器的作用、静态路由、动态路由
10.IP报文格式及IP协议
11.Socket网络编程
2.2实验内容
1.常用网络命令
要求在Windows环境下掌握ipconfig,ping,netstat,tracert,arp,telnet进行网络状态监测、跟踪的方法。
(a).ipconfig
ipconfig的功能:
可用于显示本机所有当前的TCP/IP配置的设置值,刷新动态主机配置协议(DHCP),以及域名系统设置(DNS)。
1.不带参数的ipconfig
该命令用于查看适配器的IP地址子网掩码等属性
图中可以看到以太网适配器IP地址10.136.6.220,其子网掩码255.255.240.0
2.带参数的ipconfig
(1).ipconfig/all
该命令用于查看适配器的IP地址,子网掩码等属性,较不带参数的ipconfig多了显示MAC地址,下图可以看到各个组件的物理地址,与ipconfig相比较更为详细
(2).ipconfig/renew
即重新获取IP地址
(3).ipconfig/release
该命令用于释放即归还所有适配器的IP地址,与不带参数的ipconfig相比较,以太网适配器,即网卡的的IP地址没有显示,说明已被释放
(b)ping
ping命令的作用
用于检查网络是否连通,到某个目的地址是否可达,可以帮助分析网络故障
ping命令的原理
基于ICMP协议,PING使用了回送请求与回送回答报文。
根据是否收到报文来判断目的端口是否可达,根据发送的报文的个数与接收到的回答报文的个数来判断链路的质量,根据RTT来判断源端与目的端之间的距离。
1.不带参数的ping
图1是ping环回地址,图2则是一个本网内不存在的IP,可以看到图1ping通,而图二请求超时
2.带参数的ping
(1).ping–t
该命令即一直ping某个地址,直到结束为止,在ctrl+c输入前一直不会停止
(2).ping–a
该命令是将地址解析为用户名,图中的Advertisement就是解析出的用户名
(3).ping–n
该命令用于设置发送的个数,设置1即发送1个,8即8个
(c).netstat
netstat命令的作用
显示网络连接、路由表和网络接口信息,显示目前有哪些网络连接正在工作。
可用于检验本机各端口的网络连接情况。
1.不带参数的netstat
该命令用于监控TCP/IP网络,显示活动的TCP连接,
图中显示了活动中的TCP连接,不包括LISTENING状态的连接
2.带参数的netstat
(1).netstat–a
显示所有连接和侦听端口,所有有效连接信息的列表(由于数据过多,只截取了一些)。
(2).netstat–s
显示每个协议的各项的统计(数据很多,只截取了一部分)
(3).netstat–e
该命令即显示总量的统计,数值上为-s各个协议的总和
(4).netstat–r
该命令显示核心路由表
(d).Tracert
Tracert命令的作用
用于查看IP数据包在访问目标时采取的路径
Tracert命令的原理
从源主机向的主机发送一连串的IP数据报,其中分装的是的是无法交付的UDP用户数据报,通过设置数据包的生存时间TTL,到路由器时的TTL恰好为1,接着路由器将TTL变为0,丢弃数据报并向源主机发送ICMP时间超过差错报告报文。
当达到目的主机时,由于无法交付UDP用户数据报,目的主机向源主机发送ICMP终点不可达差错报告报文。
源主机可以从这些差错报文中知道路径上的路由信息。
1.不带参数的Tracert
该命令用于查看数据包在访问目标时采取的路径,不带参数则默认30个跃点跟踪
2.带参数的Tracert
(1).Tracert–h
控制跃点跟踪的个数,设置5个就只显示5个
(2).Tracert–d
设置不把地址解析为计算机名,与不带参数的Tracert对比可见计算机名没有显示
(e).arp
arp命令的作用
arp命令用于显示和修改ARP使用的“IP到物理”地址转换表。
arp命令的原理
每台装有网卡的主机中都有一个ARP表,保存着同一网络中IP到MAC之间的映射记录。
ARP表并不是一成不变的,大约每2分钟更新一次,这种纪录称为动态式(Dynamic)记录。
还有一种称为静态记录,也就是表中的记录不变,直到TCP/IP协议重启后才会消失。
1.arp命令
(1).arp–s与arp-d
arp–s用于增加ARP项,arp-d用于删除ARP项目,先增加了138.125.12.14和其对应MAC地址3C-FD-A1-85-34-12,再查询可以查到,再通过-d删除,之后便查不到了
(2).arp–a与arp-a-v
arp–a用于显示所有的ARP项目,arp-a-v则是详细的显示(-v会显示无效的项目),arp-a后加IP地址则显示IP地址对应的ARP项目(如上图)
(f).telnet
telnet的作用
用户可以登录到远地的另一台主机上,可以使用目标主机上的软、硬件资源,是一个简单的远程终端协议。
telnet的原理
使用客户服务器方式。
在本地系统运行Telnet客户进程,远地运行服务器进程。
1.telnetIP
即连接这个IP地址,图中连接了127.0.0.1即环回地址,连接成功
2.建立连接后有这些操作
3.sen
即发送字符串,图中发送了123456789123456798
4.display
显示操作参数,
5.set与unset
图1和图2为帮助中的一些设置操作,图3图4测试了进行身份验证的设置,图三设置了进行身份验证,图四解除了这个设置
6.close
关闭连接,关闭了与127.0.0.1的连接,再次企图发送数据则显示未连接
2.交换机与路由器
安装packettracer,在packettracer仿真环境下,熟悉交换机命令、交换机初始化配置;
在交换机上实现VLAN配置,要求:
创建三个VLAN,给出拓扑,查看VLAN信息
基于Console控制台登录配置路由器,学习路由器配置相关命令;
基于packettracer构建网络环境,分别进行静态路由配置和基于RIP的动态路由配置。
要求:
静态路由配置拓扑中至少4个路由器;RIP动态路由配置中源站和目的站之间设置两条跳数不同的路径,通过RIP配置后查看选择的是哪条路径。
节点包括主机、路由器、交换机等都要根据个人名字首字母加学号的后两位进行命名。
要求给出网络设计的思路、拓扑结构、配置方法与过程及验证思路与过程。
提供截图
实验内容:
1.在交换机上实现VLAN配置
(1).建立VLAN思路
需要构建三个VLAN,首先需要用6台主机。
用两台交换机,则主机和交换机之间需要直通线缆6根,两个交换机之间需要交叉线缆一根。
在HKB11switch0上,创建三个VLAN,即VLAN10,VLAN20,VLAN30,把三个端口分别划给这三个VLAN。
HKB11switch1上也是如此,之后把两个交换机相连
(2).拓扑结构
(3).配置过程
主机
IP地址
连接交换机/端口
所属VLAN
HKB11PC0
192.168.1.1
HKB11Switch0Fa0/1
VLAN1
HKB11PC1
192.168.1.2
HKB11Switch0Fa0/2
VLAN2
HKB11PC2
192.168.1.3
HKB11Switch0Fa0/3
VLAN3
HKB11PC3
192.168.1.4
HKB11Switch1Fa0/1
VLAN1
HKB11PC4
192.168.1.5
HKB11Switch1Fa0/2
VLAN2
HKB11PC5
192.168.1.6
HKB11Switch1Fa0/3
VLAN3
(a).配置主机IP地址,子网掩码以及修改名称(以PC0为例)
将PC0的IP地址设为192.168.1.1,子网掩码为255.255.255.0,名称为HKB11PC0
(b).修改交换机的名称(以Switch0为例)
将Switch0的名称设为HKB11Switch0
(c).设置VLAN
在交换机Switch0中增加了VLAN10,VLAN20,VLAN30,Switch1中同理
(d).把端口划分给这三个VLAN
端口1划分给VLAN1,端口2划分给VLAN2,端口3划分给VLAN3,Switch1中相同操作
(e).设置交换机互连接口
我的交换机的互连接口均为10号,图中为Switch0的设置,1同理,
(4).验证结构正确
(a).查看VLAN表
图中为Switch0的VLAN表,可以看到三个VLAN中个有一个端口
(b).ping命令
PC0分别pingPC2,PC3,PC4
PC0和PC2在同一个交换机下,ping不通
PC0和PC3属于同一个VLAN,ping通
PC0和PC4既不属于同一个VLAN,也不在同一个交换机下,ping不通
说明VLAN建立正确
pc2
pc3
pc4
2.静态路由设置
(1).建立静态路由思路
首先根据题目要求需要4个路由器,则需要至少8台主机,4台交换机,8台主机两两一组,分为4组,4组分别处在不同的网段下,各自连接一个交换机,之后交换机再连接一个路由器,路由器之间相互连接
(2).拓扑结构
(3).配置过程
路由器
网段
主机1
主机2
Router0
192.168.4.0
Pc0192.168.4.2
Pc1192.168.4.3
Router1
192.168.5.0
Pc2192.168.5.2
Pc3192.168.5.3
Router2
192.168.6.0
Pc4192.168.6.2
Pc5192.168.6.3
Router3
192.168.7.0
Pc6192.168.7.2
Pc7192.168.7.3
(a).配置主机
以PC0为例,IP地址设为192.168.4.2,子网掩码255.255.255.0,默认网关设为192.168.4.1,即其路由器的IP地址
(b)配置路由器
首先关闭路由器电源,然后把WIC-2T拖到图中花圈除再打开电源
然后设置FastEthernet0/0端口,填入IP地址和子网掩码,之后再PortStatus处点击On打开连接
然后,设置Serial0/3/0(0/3/1)同理,同样设置IP地址和子网掩码,然后ClockRate处进行设置,最后PostStatus处设置
ps.Router0与Router1之间为192.168.1.0网段,Router1与Router2之间为192.168.2.0网段,Router2与Router3之间为192.168.3.0网段
最后设置下一跳
Router0
Router1
Router2
Router3
(4).验证结构正确
(a).ping命令此处由PC0依次pingPC1(192.168.4.3)PC2(192.168.5.2),PC4(192.168.6.2),
PC6(192.168.7.2)
pc1
pc2
pc4
pc6
可见被ping的四个主机位于4个不同的子网中,均能ping通,可见静态路由建立成功
(b).tracert命令来验证正确
此处由PC0查看其到PC4,PC6的路径
pc4
pc6
由路径也可以看到与设置的下一跳完全吻合
3.RIP动态路由配置
(1).动态路由思路
一个端口到另一个端口有两条跳数不同的路径,则最简单的结构为三角结构,即需要三个路由器两两互连,再各自连上一台主机
(2).拓扑结构
(3).配置过程
路由器
网段
主机
Router0
192.168.4.0
PC0192.168.4.2
Router1
192.168.5.0
PC1192.168.5.2
Router2
192.168.6.0
PC2192.168.6.2
(a).配置主机(以主机PC0为例)
设置IP地址为192.168.4.2,子网掩码255.255.255.0,默认网关192.168.4.1
(b).配置路由器
首先同样关闭电源将WIC-2T拖入黑圈处,再打开电源
然后配置FastEthernet0/0端口,IP为192.168.4.1,子网掩码255.255.255.0,然后点击On打开
然后配置Serial0/3/0端口,3/1同样
此处Router0和Router之间为192.168.1.0网段,Router1与Router2之间为192.168.2.0网段,Router2与Router0之间为192.168.3.0网段
最后配置路由表
Router0
Router1
Router2
(4).验证结构正确
(a).ping命令
由PC0分别pingPC1和PC2
pc1
pc2
均能ping通
(b).Tracert命令
查看PC0到PC1的路径
显示路径符合RIP动态路由
3.网络编程
编程需求:
捕获本机网卡的IP包,对捕获的IP包进行解析。
要求必须输出以下字段:
版本号、总长度、标志位、片偏移、协议、源地址和目的地址。
实验总结与心得体会(5分)
(1).操作系统和实验软件
操作系统为Windows10,软件为VisualStudio2017
(2).IP数据报首部各个字段
版本号:
占4位,IP协议版本号,IPv4此字段值为4,IPv6此字段值为6
首部长度:
占4位,包括固定部分和可选部分,因此首部最长为60字节,最短为20字节(不包括选项和填充部分);
服务类型:
占8位,(由于该字段一直弃而不用,因此不用考虑)
总长度:
占16位,以字节为单位,总长度包含IP的头部和数据部分,IP数据报最大长度为65535字节,但是注意最大不要超过MTU的长度
标识:
占16位,唯一标识一个数据报,可以将之当成一个计数器,每发送一个数据包,则该值加1,如果数据报分片,则每个分片的标识都一样,各个分片共享一个标识号
标志位:
占3位,最高位为0;最低位MF=1(0),后面还有分片(最后一个报片);DF=1(0),不能分片(可以分片)
片偏移:
占13位,用以指出该分段的第一个数据字节在原始数据报中的偏移位置(以8字节为单位),IP分片后每一个分组都具有自己的首部,而且标志位相同,但是片偏移值不同,通过片偏移值接收端可以重新组装IP包
生存时间:
占8位,表示数据报最多可经过的路由器的数量.取值0~255,每经过一个路由器,TTL值减1,为0时被丢弃,并发送ICMP报文通知源主机,TTL可以避免数据报在路由器之间不断循环
协议类型:
占8位,指明IP层上承载的是哪个高级协议,在分用的过程中,协议栈知道该交给上层的哪个协议处理,如1为ICMP,2为IGMP,6为TCP,17为UDP等.。
首部检验和:
占16位,保证数据报头部的数据完整性,但校验不包括数据部分。
源地址:
32位,发送方IP地址
目的地址:
32位,接受方IP地址
(3).设计思路
socket编程,在了解IP数据报首部的前提下去进行,先定义IP数据包头类,然后初始化套接字,将网卡设置为混杂模式,监听数据包,最后接收经过的IP包并输出
(4).实验结果与分析
第一个数据包UDP包,源地址为10.136.6.220即本机,目的地址为192.168.113.1,第二个包为UDP包,源地址为192.168.113.1,目的地址为10.136.6.220即本机
(5).程序流程图
(6).实验总结
这算是一个全新的领域吧,起码对我而言是这样,之前没有接触过任何关于这方面的东西,完全不知道如何下手,没办法只能去搜查资料,通过这次实验也对这方面有了点了解了,不会像开始那样不知道怎么写了
源代码:
IP_HEAD.h
#include
classIP_HEAD//IP首部
{
public:
BYTEver_hlen;//IP协议版本和IP首部长度。
高4位为版本,低4位为首部的长度(单位为4bytes)
BYTEbyTOS;//服务类型
WORDwPacketLen;//IP包总长度。
包括首部,单位为byte。
WORDwSequence;//标识,一般每个IP包的序号递增。
union
{
WORDFlags;//标志
WORDFragOf;//分段偏移
};
BYTEbyTTL;//生存时间
BYTEbyProtocolType;//协议类型,见PROTOCOL_TYPE定义
WORDwHeadCheckSum;//IP首部校验
DWORDdwIPSrc;//源地址
DWORDdwIPDes;//目的地址
BYTEOptions;//选项
};
main.cpp
#define_CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include"IP_HEAD.h"
#pragmacomment(lib,"Ws2_32.lib")
usingnamespacestd;
intnumber;
intDecodeIP(char*buf,intlen)
{
intn=len;
if(n>=sizeof(IP_HEAD))
{
IP_HEADiphead;
iphead=*(IP_HEAD*)buf;
cout<<"第"<"<cout<<"协议版本:
"<<(iphead.ver_hlen>>4)<cout<<"首部长度:
"<<((iphead.ver_hlen&0x0F)<<2)<cout<<"服务类型:
Priority:
"<<(iphead.byTOS>>5)<<",Service:
"<<((iphead.byTOS>>1)&0x0f)<cout<<"IP包总长度:
"<cout<<"标识:
"<cout<<"标志位:
"<<"DF="<<((iphead.Flags>>14)&0x01)<<",MF="<<((iphead.Flags>>13)&0x01)<cout<<"片偏移:
"<<(iphead.FragOf&0x1fff)<cout<<"生存周期:
"<<(int)iphead.byTTL<cout<<"协议类型:
"<cout<<"首部校验和:
"<cout<<"源地址:
"<cout<<"目的地址:
"<cout<<"---------------------------------------------------"<}
return0;
}
voidAutoWSACleanup()
{
:
:
WSACleanup();//终止Winsock的使用
}
intmain()
{
intn;
WSADATAwd;//一种数据结构,这个结构被用来存储被WSAStartup函数调用后返回的WindowsSockets数据,它包含Winsock.dll执行的数据。
n=WSAStartup(MAKEWORD(2,2),&wd);//返回winsock服务初始化是否成功,若返回1则输出错误
if(n)
{
cerr<<"WSAStartup函数错误!
"<return-1;
}
atexit(AutoWSACleanup);
SOCKETsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);//创建SOCKET
if(sock==INVALID_SOCKET)
{
cerr<return0;
}
//获取本机地址
charname[128];
if(-1==gethostname(name,sizeof(na