计算机网络课程设计-常用命令、交换机与路由器、网络编程

  • 课程的目的和任务

本课程要求学生在“计算机网络原理”理论学习基础上,验证和加深对计算机网络概念的理解。通过本课程的实践,培养学生独立思考、综合分析和动手实践的能力。

通过本课程的学习,达到如下目标:

(1). 理解计算机网络体系结构和工作原理,掌握常用的网络命令,能够对命令的功能进行解释,分析命令执行结果,得到合理有效结论。

(2). 掌握Packet Tracer软件的操作方法,能够使用该软件模拟组网、配置交换机、路由器,能够按照实验方案实施仿真实验,采集和整理数据。

(3). 具备网络编程能力,能够设计抓包程序获取数据包,结合相关协议对数据包各个字段的含义进行分析、处理和解释,获取有效结论。

  • 课程的基本内容和要求
    1. 实验理论
    2. 实验内容

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命令:可以用于登录进入远程主机系统,进行远程桌面控制

  1. 在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.

  1. 安装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

下面测试连通性:

  1. 尝试在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)
  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路径

  1. 基于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的回复。可证明联通。

  1. 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)数据报详细介绍及简要流程图

  1. 版本号:长度4位,表示所使用的IP协议的版本。IPv4版本号字段值为4;IPV6版本号字段号的值为6.
  2. 标头长:长度4位,定义了一个以4B为一个单位的IP包的报头长度
  3. 服务类型:共8位,高3位组成优先级子域,随后4位组成服务类型子域。
  4. 数据报总长度:总长度为2B(即6位)。定义了以字节为单位的数据报的总长度。
  5. 重装标识:长度16位,用于识别IP数据报的编号,让目的主机判断新来的数据属于哪个分组。
  6. 分片标识:共3位,最高位为0;DF禁止分片标识。DF=0,可以分片;DF=1,不能分片。MF:分片标识。MF=0,表示接的是最后一个分片;MF=1,不是最后一个分片。
  7. 片偏移值:共13位,说明分片在整个数据报中的相对位置。
  8. 生存周期:8位,用来设置数据数据报在整个网络传输过程中的寿命。常以一个数据报可以经过的最多的路由器跳步数来控制。
  9. 协议类型:共8位,表示该IP数据报的高层协议类型。
  10. 标头校验和:共16位,用于存放检查报头错误的校验码。
  11. 源、宿主机地址:共32位,分别表示发送和接受数据报的源主机和宿主机的IP地址。
  12. 选项数据域: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)网络编程

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值