admin管理员组文章数量:1601547
计算机网络课程设计报告
提交日期 2021/1/8
目 录
一. 课程的目的和任务
二. 课程的基本内容和要求
2.1 实验理论 3
2.2 实验内容 3
1. 常用网络命令 4
2. 交换机与路由器 19
3. 网络编程 28
三. 课程设计总结体会 36
- 课程的目的和任务
本课程要求学生在“计算机网络原理”理论学习基础上,验证和加深对计算机网络概念的理解。通过本课程的实践,培养学生独立思考、综合分析和动手实践的能力。
通过本课程的学习,达到如下目标:
(1). 理解计算机网络体系结构和工作原理,掌握常用的网络命令,能够对命令的功能进行解释,分析命令执行结果,得到合理有效结论。
(2). 掌握Packet Tracer软件的操作方法,能够使用该软件模拟组网、配置交换机、路由器,能够按照实验方案实施仿真实验,采集和整理数据。
(3). 具备网络编程能力,能够设计抓包程序获取数据包,结合相关协议对数据包各个字段的含义进行分析、处理和解释,获取有效结论。
- 课程的基本内容和要求
- 实验理论
- 实验内容
1.(1)常用网络命令ipconfig, ping, netstat, tracert, arp, telnet的功能:
下面是各个命令大概的说明:
ipconfig命令:帮助用户查看网络状态和一些相关网络配置信息,例如本机的IP地址、子网掩码、DNS配置、硬件地址等。
ping命令:是TCP/IP协议的一部分,用来确定本地主机和另一主机之间能否交换数据报。我们可以根据返回的信息来判定TCP/IP配置是否正确,用来检测网络的联通情况。
netstat命令:是DOS命令,用于监控TCP/IP网络,可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息、和主机用户采用的协议类型、当前主机与远端相连主机的IP地址及其连接状态。可以让用户得知有哪些网络连接正在运行,若使用时不带参数,显示本机全部活动的TCP连接。
arp命令:Address Resolution Protocol I(地址解析协议)的缩写(来源:百度百科),用于显示和修改“地址解析协议”缓存中的项目,显示主机当前的IP和物理地址。若输入不带参数,则显示arp带参数的使用方法。
tracert命令:在计算机经过多个网关传送数据报到目的地是,该命令可以用于跟踪数据报经过的路由器路径,用于确定IP数据报访问目标所经过的路径,输入不带参数的命令可以显示tracer带参数的使用方法。
telnet命令:可以用于登录进入远程主机系统,进行远程桌面控制。
- 在windows环境下使用上述网络命令进行网络状态监测和跟踪,给出相应的截图和对结果的解释。
①
(1)分别在联网和未联网状态下输入ipconfig命令
图1-1联网状态下在本机输入ipconfig后界面
图1-2断开网络连接状态下输入ipconfig后界面
连接网络时,由图(1-1)可知,有可用的网络连接,可以看出本机IP地址为192.168.43.146,子网掩码为255.255.255.0。断开网络后,由图(1-2)可知没有可用的网络连接。
(2)ipconfig-all 命令
图1-3在联网状态下输入ipconfig-all 命令后的界面
ipconfig-all命令 :用来显示当前IP配置相关的所有信息,由图(1-3)可知,包括IP(192.168.43.146),服务器IP,MAC地址(3E-91-80-71-34-09)(比ipconfig命令多显示的参数),主机名(本机名为LAPOT-1JOM5AIJ)。
(3)ipconfig-release 命令
图1-4在联网状态下输入ipconfig-release 命令后的界面
图1-5紧接着再输入ipconfig
输入ipconfig-release 命令回车后,释放了电脑IP地址,这时会电脑断网(如图1-4 QQ属于离线状态)。这时输入ipconfig命令,显示媒体已断开,如图(1-5)所示。可见该命令是用于释放IP地址的。
(4)ipconfig-renew命令
图1-6在上一步后输入ipconfig-renew命令后的界面
输入ipconfig-renew回车后,可以重新获取本机IP地址(192.168.43.146),电脑重新连上网络(如图1-6 QQ属于在线状态)。该命令用于重新给主机分配IP地址。
(5)ipconfig-flushdns命令
图1-6在命令行输入ipconfig-flushdns命令后的界面
输入ipconfig-flushdns命令回车后,刷新了本机的DNS缓存。该命令用于清除本地的DNS缓存内容。
②
(1)ping +IP地址
图2-1在联网状态下ping 室友的IP地址(失败)
由图(2-1)可知,ping失败了,是因为我们不在同一个网域,所以ping不通。
图2-2在联网状态下 ping 百度、搜狐成功
由图(2-2)可知,ping 百度、搜狐成功,是因为它们的域名和IP都是可以访问的。
(2)ping IP -a命令
图2-3 ping baidu -a得到回复
由图(2-3)ping IP -a可知,该命令可以返回主机名,我们可以通过这个命令查看主机名,然后很快地找到机主。
(3)ping IP -i TTL命令
图2-4ping baidu -i TTL命令
如图(2-4),将生存时间设置为53,这个命令用于将生存时间设置为定的指定值。
(4)ping IP -n count命令
图2-5 ping baidu -n count命令
如图(2-5),向baidu(目标地址)发送数据5次,即发送了5次数据。该命令用于执行指定次数的ping命令。
③
(1)直接输netstat命令
图3-1 输入不带参数的netstat命令
如图(3-1),显示了本机的所有活动的TCP连接(地址,状态等)。
(2)netstat -a命令
图3-2输入netstat -a命令
如图(3-2),该命令显示了本机所有选项,所有网络连接和侦听端口和所有有效连接信息的列表。
(3)netstat -e命令
图3-3输入netstat -e命令
如图(3-3),该命令显示了一些扩展信息,显示了关于以太网的统计数据(如图字节数,单播数据,丢弃等等报)。
(4)netstat -s命令
图3-4输入netstat -s命令
如图(3-4),该命令显示了每个协议(IPv4,IPv6..)的统计数据,也可用于查看网络连接,数据的发送和接受情况。
(5)netstat -r命令
图3-5输入netstat -r
由图(3-5)可知,该命令用于显示核心路由表。
④
(1)arp命令
图4-1 输入arp命令
如图(4-1),显示了arp命令主要参数和使用方法。
(2)arp -a命令
图4-2 arp -a命令
如图(4-2),192.168.43.146为本机IP,它显示了本机的IP地址和物理地址和类型。
(3)arp -g命令
图4-3 arp -g命令
如图(4-2),(4-3),可知该命令与-a相同。
(4)arp -a IP
图(4-4)arp -a IP
由图(4-4)可知,arp -a IP命令可记录出现指定IP地址与物理地址的列表信息。
(5)arp -s命令
图4-5 arp -s命令
如图(4-5),添加了一个IP(192.168.22.22)及其物理地址(A0-BB-CC-11-22-33),通过arp -a命令可以查询到信息。可见该命令用于在arp缓存中添加静态项,需要指定IP地址和物理地址。使用arp -a后,可以显示出添加的信息。
(6)arp -d
图(4-6)arp -d命令
如图(4-6),在使用 arp-s添加一个静态项,可以查询的到,再使用arp -d删除后,就查不到了。可见该命令用于删除指定ARP项。
⑤
(1)输入tracert命令
图5-1 tracert命令
如图(1-15),显示出了所有操作方法。
(2)tracert IP
图5-2 tracert 本机IP
如图(5-2)所示,使用该命令追本机IP,显示了本机(192.168.43.146)到本机IP地址经过的路由信息和IP地址。
图 5-3tracert baidu
如图(5-3)所示,这里查询到了本机访问baidu要经过的路由器信息和IP地址,*表示超时了。
(3)tracert -d命令
图(5-4)tracert -d命令
比较图(5-4),(5-3)可知,该命令不将IP地址解析到主机名称。
(4)tracert -h maximum_hops命令
图(5-5)tracert -h 3 baidu
如图(5-5)可知参数maximum用于指定跟踪指定IP的最大条数,图中为3,表示跳转了三次。
(5)tracert -w timeout命令
图(5-6)输入tracert -w 6 baidu
由图(5-6)可知参数6指定了等待baidu每次回复的毫秒数,这是该命令的功能。
⑥telnet
图6-1 telnet
(2)telnet ip port 命令
用于查看端口是否可以访问
图6-2telnet 本机IP 139(端口号)
图6-3 进入该端口后的界面
如图(6-1),现在命令行输入netstat -a -n命令查看哪些端口打开,再在命令行输入 telnet IP port(处于打开状态的)输入“CTRL+]”就可以开启telnet会话进行操作,界面如图(6-3)所示。
(3)send +字符
图(6-4)send 233444
进入端口后,输入send+字符串,可以向服务器发送命令和数据,如图(6-4)。
(4)set ntlm和unset ntlm
图(6-5)set命令一些操作方法及运行界面
如图(6-5)所示,set utlm命令可以进行身份验证,unset utlm可以不进行身份验证。
(5)close和quit
图(6-6)输入close后send字符失败
如图(6-6)所示,输入close后,端口关闭,于是send命令不成功,因为未连接。
(6)
display
图(6-7)dispaly
该命令用于显示当前操作的参数。
2.
- 安装packet tracer,在packet tracer仿真环境下,熟悉交换机命令、交换机初始化配置;
交换机一些基本命令:
输入 en 进入特权模式
Switch# 输入conf t
输入vlan n 创建子网
输入exit 退出
输入int fa n1/n2 进入该交换机的n1/n2端口
输入 switchport access vlan n 将该端口划分了n子网内
输入 show vlan 查看端口划分的子网信息
(2) 在交换机上实现VLAN配置;
要求:创建三个VLAN,给出拓扑,查看VLAN信息
拓扑图如下:
图(A-1)网络结构拓扑图
如图(A-1)所示,已使用标签功能标注了该网络结构各PC端IP地址,及各端所在子网。可知:PC3,PC4同在一个子网VLAN4,PC1,PC0同在一个子网VLAN2,PC2,PC5同在一个子网VLAN3。
下图(A-2-0)为命令行show vlan 后显示端口划分的子网信息
图(A-2-0)show vlan
下面测试连通性:
- 尝试在PC0命令行ping PC1,和PC2,如下图(A-2-1)所示,只能ping通PC1(192.168.0.1),而PC2(192.168.0.3)ping不同,因为不在同一个VLAN。PC2也只能ping通PC5图(A-2-2)
- 在Stimulation模式下,PC0发送一个PUD,只有PC1可以接收到。如图(A-3)(A-4)所示:
PDU路径显示只发往PC1.
图(A-2-1)PC0ping PC1,和PC2
图(A-2-2)192.168.0.3ping192.168.0.4(成功)/2(失败)
图(A-3)在PC0 create PDU
图(A-4)PC0发送广播信号
图(A-5)PDU路径
- 基于Console控制台登录配置路由器,学习路由器配置相关命令;基于packet tracer构建网络环境,分别进行静态路由配置和基于RIP的动态路由配置。要求:静态路由配置拓扑中至少4个路由器。
配置路由器的相关命令:
先输入en进入特权模式
输入conf -t
Router(config) 输入int fa n1/n2进入该端口
Router(config-if) 输入ip add xxx.xxx.xxx.xxx(IP地址)255.2555.255.0(子网掩码)给该端口配置IP
输入 no shut开启该端口
输入exit 退出
静态关键命令:
Router(config)# 输入ip route 192.168.3.0(目的IP) 255.255.255.0 192.168.2.2(下一跳IP端口)
动态关键命令:
Router(config)# 输入router rip 启动RIP协议
Router(config-router)# 输入network XXX.XXXX.XXX.XXX(IP地址) 添加动态路由
Router(config-router)# 输入network 192.168.0.0 如这个IP
如图(B-1),为静态路由网络结构拓扑图。每个接口对应网络皆已经标注,共4个路由器,4个交换机和8台主机。
图(B-1)静态路由网络结构拓扑图
图(B-2)各个路由器show ip rou后的信息
每个路由器都配置了每个接口的IP和三个下一条路径,分别到其他三个IP网络,如图(B-2)显示的路由信息。
下图(B-3)显示的是PC15(192.168.1.2) tracert IP192.168.4.2(PC13)所经过的路由信息,由(B-1)拓扑图可知,先经过192.168.1.1->192.168.5.2 ->192.168.6.3 ->192.168.5.6->192.168.4.2.路径已在图中标注出来。
图(B-3)PC15(192.168.1.2) tracert IP192.168.4.2(PC13)
图(B-4)Simulation下的路径
由图(B-4)可清楚显示路径。
图(B-5)PC13收到,PC15收到回复
由图(B-5)可知,PC13收到了PC15发送的,然后PC15也受到了PC13的回复。可证明联通。
- RIP动态路由配置中源站和目的站之间设置两条跳数不同的路径,通过RIP配置后查看选择的是哪条路径。
下图(C-1)为动态路由网络结构拓扑图。图中已标明各个接口的IP及PC端的IP,共三个路由器(1841类型,因为这个路由器只有两个接口,所以需要人为添加一个接口),两台主机。连接方式及线路如图所示。在PC21,PC22之间是有两条调数的不同路径。
图(C-1)网络结构拓扑图
下图(C-2)是每个路由器的路由表,可知每个路由器的端口IP和动态路由均已配置好。
图(C-2)路由表
现在每个端口都开启的状态下,让PC21在命令行 tracert 192.168.5.2(PC22IP),由图(C-3)可知,路由路径为192.168.1.2->192.168.3.2->192.168.5.2,我们可以看出路由路径选择的是下面那条,而非上面那条。
图(C-3)端口全部开启时的路由路径
在simulation模式下我们可以清楚看到路径,选择的是下面那条路径。如图(C-4)
图(C-4)simulation模式端口全部开启状态下路径
若断开Route8的E0/1/0端口(IP地址为192.168.3.2),即这个端口不通了。如下图(C-5),由拓扑图可知两个端口之间也不通。当同样在PC21命令行tracert 192.168.5.2(PC22的IP),路由路径为192.168.1.2->192.168.2.2->192.168.4.2->192.168.5.2,即选择的是上面的那一条路由路径,可以感觉到路由是动态选择的。
图(C-5)断开一个端口后tracert192.168.5.2的路由路径
下图(C-6),为PDU路径,在图中我们可以清楚看到路径的选择。
图(C-6)断开一个端口后PDU路径
任务三:网络编程
编程要求:捕获本机网卡的IP包,对捕获的IP包进行解析。要求必须输出以下字段:版本号、总长度、标志位、片偏移、协议、源地址和目的地址。
要求有详细的说明文档,包括程序的设计思想、工作流程、关键问题、程序注释和对捕获包的解析截图。
(需以管理员身份运行,调试软件Visual Studio2019)
IP数据包格式:
(1)数据报详细介绍及简要流程图
- 版本号:长度4位,表示所使用的IP协议的版本。IPv4版本号字段值为4;IPV6版本号字段号的值为6.
- 标头长:长度4位,定义了一个以4B为一个单位的IP包的报头长度
- 服务类型:共8位,高3位组成优先级子域,随后4位组成服务类型子域。
- 数据报总长度:总长度为2B(即6位)。定义了以字节为单位的数据报的总长度。
- 重装标识:长度16位,用于识别IP数据报的编号,让目的主机判断新来的数据属于哪个分组。
- 分片标识:共3位,最高位为0;DF禁止分片标识。DF=0,可以分片;DF=1,不能分片。MF:分片标识。MF=0,表示接的是最后一个分片;MF=1,不是最后一个分片。
- 片偏移值:共13位,说明分片在整个数据报中的相对位置。
- 生存周期:8位,用来设置数据数据报在整个网络传输过程中的寿命。常以一个数据报可以经过的最多的路由器跳步数来控制。
- 协议类型:共8位,表示该IP数据报的高层协议类型。
- 标头校验和:共16位,用于存放检查报头错误的校验码。
- 源、宿主机地址:共32位,分别表示发送和接受数据报的源主机和宿主机的IP地址。
- 选项数据域:0-40B,用于控制和测试。
流程图如下(W-1)
图(W-1)简要流程图
(2)一些重要部分的定义:
① IP数据报的结构
struct IPheader {
union {
unsigned char banben; //IP数据报的版本(占4位)
unsigned char headlength; //IP数据报首部长度(占4位)
};
unsigned char serviceType; //IP数据报的区分服务(占8位)
unsigned short totallen; //总长度(16位)
unsigned short identifier; //标识符
union {
unsigned short Flags; //标志位
unsigned short FragOffset; //片偏移
};
unsigned char TTL; //生存时间
unsigned char protocol; //协议
unsigned short checksum; //首部校验和
unsigned int sourceAddress; //源IP地址
unsigned int destinAddress; //目的IP地址 };
②
动态链接库的初始化
WSADATA wsaData; //存放windows socket初始化信息
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) /初始化win socket网络库,申请2.2的版本
//并判断是否初始化成功
{
int n= GetLastError(); //用GetLastError函数获得错误代码
cout << "WSAStartup() failed:n" << n<< endl; //初始化失败,报错并返回
return;
}
③
套接字的创建
SOCKET sock;
sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP); //调用socket函数来创建一个能够进行网络通信的套接字
if (sock == INVALID_SOCKET) //若套接字创建失败,则报错并返回。
{
int m = WSAGetLastError();
cout << "WSASocket() failed:m" << m << endl; //报错
return;
} //返回
bool flag = TRUE;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)); //设置套接字的选项
在socket()函数中,第一个参数指定通信发生的区字段,AF_INET是针对Internet的,允许在远程主机之间通信。第二个参数是套接字的类型,在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。在这里,设置为SOCK_RAW,表示声明的是一个原始套接字类型。第三个参数依赖于第二个参数,用于指定套接字所有的特定协议,这里使用IP协议。
创建原始套接字后,IP头就会包含在接收的数据中。然后,可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true,并设定IP_HDRINCL选项,表明用户可以亲自对IP头进行处理。
④
绑定本机地址:
gethostname(hostName, 100); //获取本地主机名
ComIP = gethostbyname(hostName); //获取本机IP地址
sockaddr_in host_addr; //存储ip信息,必须是网络字节的顺序
host_addr.sin_family = AF_INET; //协议族
host_addr.sin_port = htons(6000); //honts函数可以将主机数据转换为网络字节顺序的数据
host_addr.sin_addr = *(in_addr*)ComIP->h_addr_list[0];
bind(sock, (PSOCKADDR)&host_addr, sizeof(host_addr));//把原始Socket绑定到本地网卡
}
WinSock提供的bind()函数用于将一个套接字与一个地址绑定。绑定之后,原始套接字就能接收流经该IP地址所属网络接口的全部IP数据包。
⑤
将网卡设置为混杂模式:
DWORD dwValue = 1;
DWORD dwBufferLen[10];
DWORD dwBufferInLen = 1;
DWORD dwBytesReturned = 0;
WSAIoctl(sock, _WSAIOW(IOC_VENDOR, 1), &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL);
⑥
捕获、解析IP数据报
void Print_stroe(int packsum)//循环捕获packnum个数据包,并解析输出
{
int num = 0;
while (num < packsum)
{
int n_recv = recv(sock, buffer, sizeof(buffer), 0);
if (n_recv > 0)
{
cout << "--------------第" << ++num << "个数据包-------------- " << endl;
IPheader ip = *(IPheader*)buffer;
cout << "版本号: IPv" << (ip.banben >> 4) << endl;
cout << "总长度: " << ip.totallen << endl;
cout << "标志位: " << "DF=" << ((ip.Flags >> 14) & 0x01) << ", MF=" << ((ip.Flags >> 13) & 0x01) << endl;
cout << "片偏移: " << (ip.FragOffset & 0x1fff) << " bits" << endl;
cout << "协议: " << Getip(ip) << endl;
cout << "原地址:" << inet_ntoa(*(in_addr*)&ip.sourceAddress) << endl;
cout << "目的地址:" << inet_ntoa(*(in_addr*)&ip.destinAddress) << endl;
}
}
}
若接收的数据包中的协议类型和定义的原始套接字是匹配的,那么接收到的数据报就会就拷贝到套接字中。所以,网卡可以接收所有经过本机网卡的IP数据包。在本程序中,recv()这个函数就是用来接收经过的IP包,其参数分别是套接字描述符,缓冲区的地址,缓冲区的大小。在程序中可使用recv()函数接收经过的IP包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设置为0。因为IP数据包的最大长度是65535字节,因此,缓冲区的大小不能小于65535字节。设置缓冲区后,就可利用循环来反复监听接收IP包。
(3)调试及运行
如下图(W-2)(W-3)分别为捕获6,2个数据报的运行截图。
图(W-2)捕获6个IP数据报
图(W-3)捕获2个IP数据报
(4)源代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<stdio.h>
#include<Winsock2.h>
#include<ws2tcpip.h>
#include<sys/types.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
SOCKET sock;
char hostName[128]; //主机名
char buffer[65535]; //缓冲区
hostent* ComIP; //用于保存本机IP地址
struct IPheader { //IP数据报的结构
union {
unsigned char banben; //IP数据报的版本(占4位)
unsigned char headlength;
}; //IP数据报首部长度(占4位)
unsigned char serviceType; //IP数据报的区分服务(占8位)
unsigned short totallen; //总长度(16位)
unsigned short identifier; //标识符
union {
unsigned short Flags; //标志位
unsigned short FragOffset;
}; //片偏移
unsigned char TTL; //生存时间
unsigned char protocol; //协议
unsigned short checksum; //首部校验和
unsigned int sourceAddress; //源IP地址
unsigned int destinAddress;
}; //目的IP地址
void Start() //创建Socket
{
WSADATA wsaData; //存放windows socket初始化信息
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) //初始化win socket网络库,申请2.2的版本,
//并判断是否初始化成功
{
int n= GetLastError(); //用GetLastError函数获得错误代码
cout << "WSAStartup() failed:n" << n<< endl; //初始化失败,报错并返回
return;
}
sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP); //调用socket函数来创建一个能够进行网络通信的套接字
if (sock == INVALID_SOCKET) //若套接字创建失败,则报错并返回。
{
int m = WSAGetLastError();
cout << "WSASocket() failed:m" << m << endl; //报错
return;
} //返回
bool flag = TRUE;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)); //设置套接字的选项
}
void Fill()//填充sockaddr_in并绑定socket
{
gethostname(hostName, 100); //获取本地主机名
ComIP = gethostbyname(hostName); //获取本机IP地址
sockaddr_in host_addr; //存储ip信息,必须是网络字节的顺序
host_addr.sin_family = AF_INET; //协议族
host_addr.sin_port = htons(6000); //honts函数可以将主机数据转换为网络字节顺序的数据
host_addr.sin_addr = *(in_addr*)ComIP->h_addr_list[0]; bind(sock, (PSOCKADDR)&host_addr, sizeof(host_addr));//把原始Socket绑定到本地网卡
}
void Set()//设置为混杂模式,截获流经网卡的所有IP数据报
{
DWORD dwValue = 1;
DWORD dwBufferLen[10];
DWORD dwBufferInLen = 1;
DWORD dwBytesReturned = 0;
WSAIoctl(sock, _WSAIOW(IOC_VENDOR, 1), &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL);
}
string Getip(IPheader ip)//根据IP头部信息返回相应协议类型字符串
{
int m = ip.protocol;
switch (ip.protocol)
{
case 1: return "ICMP"; //Internet控制报文协议
case 2: return "IGMP"; //Internet组管理协议
case 4: return "IPinIP";//移动IP数据封装和隧道
case 6: return "TCP";//传输控制协议
case 8: return "EGP";//外部网关协议
case 17: return "UDP";//用户数据报文协议
case 41: return "IPv6";
case 46: return "RSVP";//资源预留协议
case 89: return "OSPF";// 开发式最短路径优先
default: return "UNKNOW";
}
}
void Print_stroe(int packsum)//循环捕获packnum个数据包,并解析输出
{
int num = 0;
while (num < packsum)
{
int n_recv = recv(sock, buffer, sizeof(buffer), 0);
if (n_recv > 0)
{
cout << "--------------第" << ++num << "个数据包-------------- " << endl;
IPheader ip = *(IPheader*)buffer;
cout << "版本号: IPv" << (ip.banben >> 4) << endl;
cout << "总长度: " << ip.totallen << endl;
cout << "标志位: " << "DF=" << ((ip.Flags >> 14) & 0x01) << ", MF=" << ((ip.Flags >> 13) & 0x01) << endl;
cout << "片偏移: " << (ip.FragOffset & 0x1fff) << " bits" << endl;
cout << "协议: " << Getip(ip) << endl;
cout << "原地址:" << inet_ntoa(*(in_addr*)&ip.sourceAddress) << endl;
cout << "目的地址:" << inet_ntoa(*(in_addr*)&ip.destinAddress) << endl;
}
}
}
int main() {
Start(); //创建Socket
Fill(); //填充sockaddr_in并绑定socket
Set(); //设置为混杂模式,截获流经网卡的所有IP数据报
cout << "请输入要捕获的IP包数目:" << endl;
int packsum;
cin >> packsum;//输入需要解析的IP包数目
cout << "开始捕获并分析IP数据包" << endl;
cout << endl;
Print_stroe(packsum);//循环捕获packnum个数据包
closesocket(sock);//关闭socket
WSACleanup();//关闭winsock
return 1;
}
- 课程设计总结体会
(1)命令
1.arp命令耗费了挺多时间,因为添加静态IP地址和物理地址还有删除是需要在管理员模式下才可以运行,探索了很久才发现是这样,最终通过查阅网上资料发现。
2.tracert命令,除了自己的地址,比较难找到可用的IP地址。除了baidu外其他的都很难找。
3.telnet命令:开始的时候什么配置都没有改就在命令行输入telnet,发现提示没有这种命令,通过网上查找资料发现这个命令需要在“启用和关闭windows功能”里面打开telnet客户端功能,勾选并确定后,我发现在命令行输入telnet是可以进入这个命令的,但是因为没有进入一个打开的端口,导致任何操作都是失败的。刚开始不知道是要进入一个端口才可以实现一些命令的操作,还以为是电脑配置的问题。倒腾了很久也没有收获,但是最终终于在一个正确的步骤引导下完成了。我才知道打开的端口号是要通过在命令行里输入netstat -a -n才能查看,最终可以进入端口,并在进入端口后键盘操作“CTRL+]”实现操作。这应该是最耗费时间的命令了。同时,在这个命令的实现过程中,我也大概了解了远程连接的一些条件和问题,还是非常有意义的事情。
(2)仿真实验:
静态路由的命令花费了很多时间,因为题目要求需要四个路由器,路由器之间的连接和路由器与交换机的连接方式不同,而且在配置过程中有许多端口的IP和子网掩码需要配置,对在不同位置的主机和端口需要根据他们连接的路由器配置IP。设置好这些之后,还需要在命令行里配置下一跳,不知道使出了什么问题,刚开始配置好之后,在路由器上show ip rou总是不会显示出配置的下一跳的信息,这就说明配置不成功,具体原因没有找到,在这里我又重复配置了很久,也不知道是哪里出了问题。但是后来换了PC和交换机和路由器后,又配置了,发现配置成功,终于可以进行下一步。配置完之后我发现,原来也是可以不在控制台里的命令行里配置,也可以直接查看属性并配置,但是在控制台配置更能锻炼和培养自己的能力。
动态路由配置上没有这么难,就是需要规划两条不一样的路由,显示出动态和静态的区别。
但是也需要规划接口和PC的IP地址。
。
(3)网络编程
版权声明:本文标题:计算机网络课程设计-常用命令、交换机与路由器、网络编程 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728363297a1155625.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论