计算机网络GBN和路由算法实验报告要点
计算机网络实验教程实验报告

计算机网络实验教程实验报告一、实验目的本次计算机网络实验的主要目的是通过实际操作和观察,深入理解计算机网络的基本原理和技术,提高对网络配置、通信协议、网络服务等方面的实践能力,培养解决网络问题的思维和方法。
二、实验环境1、硬件环境实验中使用了若干台个人计算机,其配置包括:处理器_____、内存_____、硬盘_____等。
2、软件环境操作系统:Windows 10 专业版网络模拟软件:Packet Tracer网络测试工具:Ping、Tracert 等三、实验内容与步骤实验一:网络拓扑结构的搭建1、打开 Packet Tracer 软件,选择合适的网络设备,如路由器、交换机、PC 等。
2、按照设计好的网络拓扑结构,将设备进行连接。
本次实验构建了一个包含两个局域网通过路由器互联的简单网络。
3、为各设备配置 IP 地址、子网掩码、网关等网络参数。
实验二:网络通信协议的分析1、在搭建好的网络中,选择两台 PC 进行通信。
2、使用 Ping 命令测试网络的连通性,并观察返回的结果。
3、利用 Wireshark 抓包工具捕获通信过程中的数据包,分析其中的协议字段,如 IP 头、TCP 头、UDP 头等,了解网络协议的工作原理。
实验三:网络服务的配置与测试1、在服务器上配置 Web 服务,安装 IIS 组件,创建网站,并设置相关的权限和访问规则。
2、从客户端访问服务器上的网站,验证 Web 服务的可用性。
3、配置 FTP 服务,设置用户账号和权限,进行文件上传和下载测试。
实验四:网络安全的实现1、在路由器上配置访问控制列表(ACL),限制特定 IP 地址或端口的访问。
2、启用防火墙功能,设置安全策略,防止网络攻击。
四、实验结果与分析实验一结果分析成功搭建了网络拓扑结构,各设备之间能够正常通信。
通过配置正确的网络参数,确保了数据包在网络中的准确传输。
实验二结果分析Ping 命令测试显示网络连通性良好,Wireshark 抓包分析揭示了数据包在网络层和传输层的封装和解封装过程,对 IP 协议和 TCP/UDP 协议的工作机制有了更直观的认识。
计算机网络实验报告(网关路由配置)

一,环境(详细说明运行的操作系统,网络平台,机器的IP地址)∙运行操作系统:Windows 7 SP1∙仿真网络平台:The Boson NetSim v5.31二,实验目的∙了解IP协议,网络层协议和数据链路层协议的工作原理及机制∙掌握IP地址的规划方法∙掌握路由协议的配置方法∙掌握路由器及二/三层交换机的配置方法∙了解VLAN的划分原理∙掌握访问控制的配置方法三,实验内容及步骤(包括主要流程和说明)1.画网络拓扑图拓扑图一拓扑图二2.第一项试验---组网实验(1) 使用拓扑图一,进行IP地址规划a.将PC1~PC2设置在同一个子网192.168.0.0内PC上路由地址,子网掩码,默认网关的配置方法如下C:>ipconfig /ip 192.168.0.2 255.255.255.0C:>ipconfig /dg 192.68.0.1按上边的方法为PC配置地址PC1: 192.168.0.2PC2: 192.168.0.3子网掩码为255.255.255.0网关为192.168.0.1将PC3~PC8设置在同一个子网192.168.1.0内PC3: 192.168.1.2PC4: 192.168.1.3PC5: 192.168.1.4PC6: 192.168.1.5PC7: 192.168.1.6PC8: 192.168.1.7子网掩码: 255.255.255.0默认网关: 192.168.1.0配置路由器端口使两个子网内部的各PC机可以自由通信fa0/0 : 192.168.0.1/24fa0/1: 192.168.1.1/24实验结果:8个PC之间能自由通信,如下所示:(在PC1下) Router>enableRouter#config tEnter configuration commands, one per line. End with CNTL/Z.Router(config)#int fa0Invalid CommandRouter(config)#int fa0/0Router(config-if)#ip address 192.168.0.1 255.255.255.0Router(config-if)#no shutdown%LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up Router(config-if)#int fa0/1Router(config-if)#ip address 192.168.1.1 255.255.255.0Router(config-if)#no shutdown%LINK-3-UPDOWN: Interface FastEthernet0/1, changed state to up子网内部能通信:C:#ping 192.168.0.3Pinging 192.168.0.3 with 32 bytes of data:Reply from 192.168.0.3: bytes=32 time=60ms TTL=241Reply from 192.168.0.3: bytes=32 time=60ms TTL=241Reply from 192.168.0.3: bytes=32 time=60ms TTL=241Reply from 192.168.0.3: bytes=32 time=60ms TTL=241Reply from 192.168.0.3: bytes=32 time=60ms TTL=241Ping statistics for 192.168.0.3: Packets: Sent = 5, Received = 5, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 50ms, Maximum = 60ms, Average = 55ms子网间能通信:C:#ping 192.168.1.5Pinging 192.168.1.5 with 32 bytes of data:Reply from 192.168.1.5: bytes=32 time=60ms TTL=241Reply from 192.168.1.5: bytes=32 time=60ms TTL=241Reply from 192.168.1.5: bytes=32 time=60ms TTL=241Reply from 192.168.1.5: bytes=32 time=60ms TTL=241Reply from 192.168.1.5: bytes=32 time=60ms TTL=241Ping statistics for 192.168.1.5: Packets: Sent = 5, Received = 5, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 50ms, Maximum = 60ms, Average = 55msb.PC1~PC2置于192.168.0.0PC1: 192.168.0.2/24PC2: 192.168.0.3/24默认网关: 192.168.0.1PC3,PC5,PC7置于192.168.1.0PC3: 192.168.1.2/24PC5: 192.168.1.3/24PC7: 192.168.1.4/24默认网关: 192.168.1.1PC4,PC6,PC8置于192.168.2.0PC4: 192.168.2.2/24PC6: 192.168.2.3/24PC8: 192.168.2.4/24默认网关: 192.168.2.1为路由器配置端口地址fa0/0: 192.168.0.1/24fa0/1: 191.168.1.1/24实验结果:子网内部能通信,但子网间不能通信,如下所示(在PC1下)子网内部能通信C:#ping 192.168.0.3Pinging 192.168.0.3 with 32 bytes of data:Reply from 192.168.0.3: bytes=32 time=60ms TTL=241Reply from 192.168.0.3: bytes=32 time=60ms TTL=241Reply from 192.168.0.3: bytes=32 time=60ms TTL=241Reply from 192.168.0.3: bytes=32 time=60ms TTL=241Reply from 192.168.0.3: bytes=32 time=60ms TTL=241Ping statistics for 192.168.0.3: Packets: Sent = 5, Received = 5, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 50ms, Maximum = 60ms, Average = 55ms子网间不能通信:C:#ping 192.168.2.3Request timed out.Request timed out.Request timed out.Request timed out.Request timed out.Ping statistics for 192.168.2.3:Packets: Sent = 5, Received = 0, Lost = 5 (100% loss),Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum = 0ms, Average = 0msPinging 192.168.2.3 with 32 bytes of data:3.第二项实验—路由配置实验(1) 使用拓扑图二(2) 配置PC的IP地址PC2 : 192.168.2.2PC3 : 192.168.3.2PC4 : 192.168.4.2(3) 配置路由器各端口的IP地址Router 1:fa0/0: 192.168.1.1/24s0: 127.0.1.1/24s1: 127.0.2.1/24Router 2:fa0/0: 192.168.2.1/24s0: 127.0.1.2/24s1: 127.0.3.1/24Router 3:fa0/0: 192.168.3.1/24s0: 127.0.2.2/24s1: 127.0.3.2/24s2: 127.0.4.1/24Router 4:fa0/0: 192.168.4.1/24s0: 127.0.4.2/24(4) 在3的基础上配置RIP协议Router#config tEnter configuration commands, one per line. End with CNTL/Z.Router(config)#router ripRouter(config-router)#network 192.168.1.0Router(config-router)#network 127.0.1.0Router(config-router)#network 127.0.2.0Router(config-router)#Router 1 上子网:192.168.1.0 127.0.1.0 127.0.2.0Router 2 上子网:192.168.2.0 127.0.1.0 127.0.3.0Router 3 上子网:192.168.3.0 127.0.2.0 127.0.3.0 127.0.4.0 Router 4 上子网:192.168.4.0 127.0.4.0实验结果:4台PC之间能互相通信,如下所示:(在PC1上运行)ping通PC2Pinging 192.168.2.2 with 32 bytes of data:Reply from 192.168.2.2: bytes=32 time=60ms TTL=241Reply from 192.168.2.2: bytes=32 time=60ms TTL=241Reply from 192.168.2.2: bytes=32 time=60ms TTL=241Reply from 192.168.2.2: bytes=32 time=60ms TTL=241Reply from 192.168.2.2: bytes=32 time=60ms TTL=241Ping statistics for 192.168.2.2: Packets: Sent = 5, Received = 5, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 50ms, Maximum = 60ms, Average = 55msping通PC3C:#ping 192.168.3.2Pinging 192.168.3.2 with 32 bytes of data:Reply from 192.168.3.2: bytes=32 time=60ms TTL=241Reply from 192.168.3.2: bytes=32 time=60ms TTL=241Reply from 192.168.3.2: bytes=32 time=60ms TTL=241Reply from 192.168.3.2: bytes=32 time=60ms TTL=241Reply from 192.168.3.2: bytes=32 time=60ms TTL=241Ping statistics for 192.168.3.2: Packets: Sent = 5, Received = 5, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 50ms, Maximum = 60ms, Average = 55msping通PC4C:#ping 192.168.4.2Pinging 192.168.4.2 with 32 bytes of data:Reply from 192.168.4.2: bytes=32 time=60ms TTL=241Reply from 192.168.4.2: bytes=32 time=60ms TTL=241Reply from 192.168.4.2: bytes=32 time=60ms TTL=241Reply from 192.168.4.2: bytes=32 time=60ms TTL=241Reply from 192.168.4.2: bytes=32 time=60ms TTL=241Ping statistics for 192.168.4.2: Packets: Sent = 5, Received = 5, Lost= 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 50ms, Maximum = 60ms, Average = 55ms(5) 思考题:如果不设置时钟频率,路由器之间的端口连接没法no shutdown使其保持状态为UP(6) 在步骤3的基础上配置OSPFRouter#config tEnter configuration commands, one per line. End with CNTL/Z.Router(config)#router ospf 1Router(config-router)#network 192.168.1.0 0.0.0.255 area 0Router(config-router)#network 127.0.1.0 0.0.0.255 area 0Router(config-router)#network 127.0.2.0 0.0.0.255 area 0各路由器上的子网信息同RIP协议实验结果:通步骤44.第三项试验--VLAN划分试验(1) 使用第一项试验b的结果(2) 配置交换机干道配置交换机2的干道SW2#config tSW2(config)#int fa0/1SW2(config-if)#switchport mode trunkSW2(config-if)#switchport trunk encapsulation dot1qSW2(config)#int fa0/2SW2(config-if)#switchport mode trunkSW2(config-if)#switchport trunk encapsulation dot1qSW2(config)#int fa0/3SW2(config-if)#switchport mode trunkSW2(config-if)#switchport trunk encapsulation dot1qSW2(config-if)#exit配置交换机3的干道SW3#config texitSW3(config)#int fa0/1SW3(config-if)#switchport mode trunkSW3(config-if)#switchport trunk encapsulation dot1qSW3(config-if)#switchport mode trunkSW3(config-if)#switchport trunk encapsulation dot1qSW3(config-if)#exit配置交换机4的干道SW4#config tSW4(config)#int fa0/1SW4(config-if)#switchport mode trunkSW4(config-if)#switchport trunk encapsulation dot1qSW4(config)#int fa0/2SW4(config-if)#switchport mode trunkSW4(config-if)#switchport trunk encapsulation dot1qSW4(config-if)#exit(3) 建立VTP服务器与客户端在SW2建立VTP域并将SW2设为VTP ServerSW2(config)# vtp mode server //设置switch 2 为VTP serverSW2(config)# endSW2#vlan databaseSW2(vlan)# vtp domain Anyname //定义域名SW2(vlan)# endSW2# show vlan将SW3、SW4设为VTP ClientSW3(config)# vtp mode client //设置switch 3为VTP clientSW3(config)# endSW3#vlan databaseSW3(vlan)# vtp domain Anyname //定义域名,必须和前面一致SW3(vlan)# endSW3# show vlanSW4(config)# vtp mode client //设置switch 4为VTP clientSW4(config)# endSW4#vlan databaseSW4(vlan)# vtp domain Anyname //定义域名,必须和前面一致SW4(vlan)# endSW4# show vlan在VTP Server SW2上划分VLAN,划分结果通过VTP域被SW3、SW4学习到SW2# vlan databaseSW2(vlan)# vlan 10 name test10 //在server上创建vlan10SW2(vlan)# vlan 20 name test20 //在server上创建vlan20SW2(vlan)#endSW2#config tSW2(config-if)# sw mode accessSW2(config-if)# sw access vlan 10 //将端口fa0/4划到vlan 10 SW2(config-if)# int fa0/5SW2(config-if)# sw mode accessSW2(config-if)# sw access vlan 20 //将端口fa0/5划到vlan 20SW2(config-if)#endSW2#show vlanSW2#copy run startup(4) 在交换机上划分子网在SW3上划分VLANSW3#config tSW3(config)int fa0/4SW3(config-if)# sw mode accessSW3(config-if)sw access vlan 10SW3(config)int fa0/5SW3(config-if)# sw mode accessSW3(config-if)sw access vlan 20SW3(config-if)endSW3#show vlanSW3#copy run startup在SW4上划分VLANSW4#config tSW4(config)int fa0/4SW4(config-if)# sw mode accessSW4(config-if)sw access vlan 10SW4(config)int fa0/5SW4(config-if)# sw mode accessSW4(config-if)sw access vlan 20SW4(config-if)endSW4#show vlanSW4#copy run startup这时pc3、pc5、pc7可以互相ping通这时pc4、pc6、pc8可以互相ping通但不同VLAN之间不通(5) 配置路由器使得二个VLAN互通Router#config tRouter(config)#int fa0/1Router(config-if)#no shutRouter(config-if)#int fa 0/1.1Router(config-if)#encap dot1q 10Router(config-if)#ip address 192.168.1.1 255.255.255.0Router(config-if)#int fa 0/1.2Router(config-if)#encap dot1q 20Router(config-if)#ip address 192.168.2.1 255.255.255.0Router(config-if)#endRouter#copy run startup这时2个VLAN之间可以ping通(6) 配置路由使得192.168.0.0子网可以和2个VLAN互通Router(config-if)#int fa0/0Router(config-if)#encap dot1q 1Router(config-if)#int fa0/1Router(config-if)#ip address 192.168.3.1 255.255.255.0Router(config-if)#endRouter#config tRouter(config-router)#router ripRouter(config-router)#network 192.168.0.0Router(config-router)#network 192.168.1.0Router(config-router)#network 192.168.2.0Router(config-router)#endRouter#copy run startup实验结果:8个PC间能互相PING通5.第四项实验---访问控制配置实验(1) 使用第二项实验步骤4的结果(2) 对路由器1进行访问控制配置,使得PC1无法访问其它PC,也不能被其它PC 访问在Router 1上配置Router#config tEnter configuration commands, one per line. End with CNTL/Z.Router(config)#access-list 10 deny host 192.168.1.0 0.0.0.255Router(config)#access-list 10 permit anyRouter(config)#int fa0/0Router(config-if)#ip access-group 10 in实验结果PC1无法ping通其他PCC:#ping 192.168.2.2Pinging 192.168.2.2 with 32 bytes of data:Request timed out.Request timed out.Request timed out.Request timed out.Request timed out.Ping statistics for 192.168.2.2:Packets: Sent = 5, Received = 0, Lost = 5 (100% loss),Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum = 0ms, Average = 0ms其它PC无法ping通PC1C:#ping 192.168.1.2Pinging 192.168.1.2 with 32 bytes of data:Request timed out.Request timed out.Request timed out.Request timed out.Request timed out.Ping statistics for 192.168.1.2:Packets: Sent = 5, Received = 0, Lost = 5 (100% loss),Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum = 0ms, Average = 0ms(3) 在步骤1的基础上,进行访问控制配置,使得PC1不能访问PC2,但能访问其他PC在Router 1上配置Router#config tEnter configuration commands, one per line. End with CNTL/Z.Router(config)#access-list 10 deny 192.168.2.0 0.0.0.255Router(config)#access-list 10 permit anyRouter(config)#int fa0/0Router(config-if)#ip access-group 10 inRouter(config-if)#ip access-group 10 out实验结果:PC1无法ping通PC2C:#ping 192.168.2.2Pinging 192.168.2.2 with 32 bytes of data:Request timed out.Request timed out.Request timed out.Request timed out.Request timed out.Ping statistics for 192.168.2.2:Packets: Sent = 5, Received = 0, Lost = 5 (100% loss),Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum = 0ms, Average = 0msPC1能ping通其它PCC:#ping 192.168.3.2Pinging 192.168.3.2 with 32 bytes of data:Reply from 192.168.3.2: bytes=32 time=60ms TTL=241Reply from 192.168.3.2: bytes=32 time=60ms TTL=241Reply from 192.168.3.2: bytes=32 time=60ms TTL=241Reply from 192.168.3.2: bytes=32 time=60ms TTL=241Reply from 192.168.3.2: bytes=32 time=60ms TTL=241Ping statistics for 192.168.3.2: Packets: Sent = 5, Received = 5, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 50ms, Maximum = 60ms, Average = 55msPC2不能ping通PC1C:#ping 192.168.1.2Pinging 192.168.1.2 with 32 bytes of data:Request timed out.Request timed out.Request timed out.Request timed out.Request timed out.Ping statistics for 192.168.1.2:Packets: Sent = 5, Received = 0, Lost = 5 (100% loss),Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum = 0ms, Average = 0ms其它PC能ping通PC1(PC3)C:#ping 192.168.1.2Pinging 192.168.1.2 with 32 bytes of data:Reply from 192.168.1.2: bytes=32 time=60ms TTL=241Reply from 192.168.1.2: bytes=32 time=60ms TTL=241Reply from 192.168.1.2: bytes=32 time=60ms TTL=241Reply from 192.168.1.2: bytes=32 time=60ms TTL=241Reply from 192.168.1.2: bytes=32 time=60ms TTL=241Ping statistics for 192.168.1.2: Packets: Sent = 5, Received = 5, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 50ms, Maximum = 60ms, Average = 55ms四,实验中的问题及心得在这次的仿真实验中,虽然是每个组员分别完成实验,但是我们组在老师允许的前提下,经过了详细的讨论,最终确定了方案。
计算机网络综合实验报告

计算机网络综合实验报告一、实验目的1. 掌握计算机网络的基本概念和原理;2. 了解计算机网络的主要协议和拓扑结构;3. 实践网络设备的配置和网络通信的实现;4. 培养动手能力和团队协作精神。
二、实验设备与环境1. 实验设备:* 计算机(PC)* 路由器(Router)* 交换机(Switch)* 网线若干* 电源、网线钳等工具2. 实验环境:* 实验室局域网* 网络设备已连接并设置好* 计算机操作系统为Windows或Linux三、实验原理与流程1. 计算机网络的基本概念和原理:计算机网络是指将多台计算机通过通信线路连接起来,实现资源共享和信息交换的一种计算机系统。
计算机网络的主要协议包括TCP/IP、HTTP、DNS等。
拓扑结构有星型、树型、环型、网型等,根据实际需求选择合适的拓扑结构可以提高网络性能。
2. 实验流程:(1)将路由器和交换机连接好,并设置好相关参数;(2)将计算机连接到路由器上,并设置IP地址等参数与网络匹配;(3)配置路由器和交换机,实现路由选择、数据转发等功能;(4)测试网络连通性,通过ping命令检查网络是否通畅;(5)实现网络设备之间的通信,测试网络性能。
四、实验步骤与记录1. 将路由器和交换机连接好,并设置好相关参数,确保设备正常运行;2. 将计算机连接到路由器上,并设置IP地址等参数,使其与网络匹配;3. 根据实验原理与流程,逐步配置路由器和交换机,实现路由选择、数据转发等功能;4. 使用ping命令测试网络连通性,检查结果是否正常;5. 实现网络设备之间的通信,观察通信过程是否正常,记录通信数据;6. 根据实验结果,分析网络性能,并记录相关数据。
五、实验结果与分析1. 实验结果:经过实验,我们成功配置了路由器和交换机,实现了网络设备的通信,测试了网络性能,得到了以下结果:(1)网络连通性测试:通过ping命令测试,所有计算机都能够正常访问互联网,网络连通性良好;(2)设备通信测试:路由器和交换机能够正常转发数据包,设备之间通信正常;(3)网络性能测试:网络延迟较小,数据包丢失率较低,网络性能良好。
计算机网络原理实验七实验报告

计算机⽹络原理实验七实验报告实验七、传输层可靠传输协GBN编程实验报告序号:姓名:学号:成绩指导⽼师:⼀、实验⽬的:1、通过编写实现⼀个简单可靠的数据传输协议GBN的发送和接收代码,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
⼆、实验指导:参考教材。
三、实验要求:编程实现⼀个GBN传输协议的发送⽅和接收⽅两程序,采⽤编程语⾔不限,要求能将发送――接收流程以及处理⽅法表现出来.附源代码及注释通过本次实验,了解了GBN传输协议的相关知识,因为实验代码是由三部分组成,所以⽤Studio做实验时,要建⽴3个⽂件,⼀个是头⽂件,存放gbn.h, 另外2个是源⽂件,分别存放gbn.c 和 gbn-cs.c,然后再启动调试。
实验代码通过查阅资料很容易理解,但是怎么实现这个程序对我来说是个问题。
后来我把程序分了3部分,⼀个头⽂件和两个源⽂件,通过visual studio可以良好的运⾏,以下为⽼师附带代码的运⾏结果⼀、GBN.h#pragma once#include//基础功能模块的数据结构声明#define BIDIRECTIONAL 1 /* change to 1 if you're doing extra credit and write a routine called B_output *//* a "msg" is the data unit passed from layer 5 (teachers code) to layer4 (students' code). It contains the data (characters) to be delivered tolayer 5 via the students transport level protocol entities. */ struct msg{ char data[20];};/* a packet is the data unit passed from layer 4 (students code) to layer3 (teachers code). Note the pre-defined packet structure, which allstudents must follow. */struct pkt{int seqnum;int acknum;int checksum;char payload[20];};#define WINDOWSIZE 8#define MAXBUFSIZE 50#define RTT 15.0#define NOTUSED 0#define NACK -1#define TRUE 1#define FALSE 0#define A 0#define B 1//⽹络仿真部分数据结构声明***********************************************************struct event{float evtime; /* event time */int evtype; /* event type code */int eventity; /* entity where event occurs */struct pkt *pktptr; /* ptr to packet (if any) assoc w/ this event */ struct event *prev;struct event *next;};/* possible events: */#define TIMER_INTERRUPT 0#define FROM_LAYER5 1#define FROM_LAYER3 2#define OFF 0#define ON 1//基础功能模块的函数声明******************************************************************* void ComputeChecksum(struct pkt *packet);//计算校验和int CheckCorrupted(struct pkt packet);//检查数据是否出错void A_output( struct msg message);//A端向外发送数据void A_input(struct pkt packet);//A端接收数据void A_timerinterrupt();//A计时器超时void A_init();//A端初始化void B_output(struct msg message);void B_input(struct pkt packet);void B_timerinterrupt();void B_init();//⽹络仿真部分的函数声明**************************************************void init(); //初始化仿真器float jimsrand();//随机数发⽣器[0,1]//处理事件列表部分的函数声明*********************************************void generate_next_arrival();//产⽣下⼀个到达的分组void insertevent(struct event *p);//向事件列表中插⼊⼀条新的事件void printevlist();//打印事件列表//******************************************************************** //**********************计时器模块*********************************** void stoptimer(int);//停⽌计时器void starttimer(int,float);//启动计时器//******************************************************************** *//**************************⽹络各层之间传送模块***********************void tolayer3(int AorB,struct pkt packet);//向第3层发送信息void tolayer5(int AorB,char datasent[20]);//向第5层发送信息⼆、GBN.c#include "GBN.h"#include#include#includeextern int TRACE = 1; /* for my debugging */extern int nsim = 0; /* number of messages from 5 to 4 so far */extern int nsimmax = 0; /* number of msgs to generate, then stop */extern float time = 0.000;float lossprob; /* probability that a packet is dropped */ float corruptprob; /* probability that one bit is packet is flipped */ float lambda; /* arrival rate of messages from layer 5 */ int ntolayer3; /* number sent into layer 3 */static int nlost = 0; /* number lost in media */static int ncorrupt = 0; /* number corrupted by media*/static int expectedseqnum = 0; /* expected sequence number at receiver side */static int nextseqnum; /* next sequence number to use in sender side */static int base; /* the head of sender window */struct pkt winbuf[WINDOWSIZE]; /* window packets buffer */static int winfront,winrear; /* front and rear points of window buffer */static int pktnum; /* packet number of window buffer */struct msg buffer[MAXBUFSIZE]; /* sender message buffer */int buffront,bufrear; /* front and rear pointers of buffer */ static int msgnum; /* message number of buffer */int packet_lost =0;int packet_corrupt=0;int packet_sent =0;extern int packet_correct=0;extern int packet_resent =0;int packet_timeout=0;extern struct event *evlist = NULL; /* the event list *///计算校验和void ComputeChecksum( struct pkt *packet){int checksum;int i;checksum = packet->seqnum;checksum = checksum + packet->acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet->payload[i]);checksum = 0-checksum;packet->checksum = checksum;}//检查是否出错int CheckCorrupted(struct pkt packet){int checksum;int i;checksum = packet.seqnum;checksum = checksum + packet.acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet.payload[i]);if ( (packet.checksum+checksum) == 0 )return (FALSE);elsereturn (TRUE);}//A端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void A_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n"); /* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* update state variables */nextseqnum = nextseqnum+1;starttimer(A,RTT);B_input(sendpkt);A_input(sendpkt);}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//B端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void B_output(struct msg message) {int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);A_input(sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* if it is the first packet in window, start timeout */ //if ( base == nextseqnum ) //{//starttimer(A,RTT);//printf("----A: start a new timer!\n");// }/* update state variables */nextseqnum = nextseqnum+1;}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//A端接收数据void A_input(struct pkt packet){struct pkt sendpkt;int i;/* if received packet is not corrupted and ACK is received */if ( (CheckCorrupted(packet) == FALSE) && (packet.acknum != NACK) ) {printf("----A: ACK %d is correctly received,",packet.acknum);packet_correct++;/* delete the acked packets from window buffer */winfront = (winfront+(packet.acknum+1-base)) % WINDOWSIZE; pktnum = pktnum - (packet.acknum+1-base); /* move window base */base = packet.acknum+1;stoptimer(A);if ( base < nextseqnum){//starttimer(A,RTT);printf ("\n\n\nsend new packets!");}/* if buffer is not empty, send new packets */while ( (msgnum!=0) && (nextseqnum/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;buffront = (buffront+1) % MAXBUFSIZE;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = buffer[buffront].data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* if it is the first packet in window, start timeout */ if ( base == nextseqnum ){//starttimer(A,RTT);printf ("send new packets!\n");}/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;winbuf[winrear] = sendpkt;pktnum ++;/* update state variables */nextseqnum = nextseqnum+1;/* delete message from buffer */msgnum --;}}elseprintf ("----A: NACK is received, do nothing!\n");}//B端接收数据*****************************************************⼀定要调⽤这个/* Note that with simplex transfer from a-to-B, there is no B_output() */ /* called from layer 3, when a packet arrives for layer 4 at B*/void B_input(struct pkt packet){struct pkt sendpkt;int i;/* if not corrupted and received packet is in order */if ( (CheckCorrupted(packet) == FALSE) && (packet.seqnum == expectedseqnum)){printf("\n----B: packet %d is correctly received, send ACK!\n",packet.seqnum);/* send an ACK for the received packet *//* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = expectedseqnum;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet *///tolayer3 (B, sendpkt);/* update state variables */expectedseqnum = expectedseqnum+1;printf("----B:expectedseqnum = %d\n",expectedseqnum);/* deliver received packet to layer 5 *///tolayer5(B,packet.payload);}/* otherwise, discard the packet and send a NACK */else{printf("----B: packet %d is corrupted or not I expects, send NACK!\n",packet.seqnum); /* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = NACK;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (B, sendpkt);}}//A计时器超时/* called when A's timer goes off */void A_timerinterrupt(){int i;printf("----A: time out,resend packets!\n");/* start timer */starttimer(A,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(A,winbuf[(winfront+i)%WINDOWSIZE]);}}//B计时器超时/* called when B's timer goes off */void B_timerinterrupt(){int i;printf("----B: time out,resend packets!\n");/* start timer */starttimer(B,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(B,winbuf[(winfront+i)%WINDOWSIZE]);}}//A端初始化/* entity A routines are called. You can use it to do any initialization */ void A_init(){base = 0;nextseqnum = 0;buffront = 0;bufrear = 0;msgnum = 0;winfront = 0;winrear = 0;pktnum = 0;}//B端初始化/* entity B routines are called. You can use it to do any initialization */ void B_init(){expectedseqnum = 0;}//初始化仿真器void init() /* initialize the simulator */{int i;float sum, avg;float jimsrand();FILE *fp;fp = fopen ("parameter.txt","r");printf("----- Stop and Wait Network Simulator Version 1.1 -------- \n\n");printf("Enter the number of messages to simulate: ");//fscanf(fp,"%d",&nsimmax);scanf("%d",&nsimmax);printf("\nEnter packet loss probability [enter 0.0 for no loss]: "); //fscanf(fp, "%f",&lossprob);scanf("%f",&lossprob);printf("\nEnter packet corruption probability [0.0 for no corruption]: "); //fscanf(fp,"%f",&corruptprob);scanf("%f",&corruptprob);printf("\nEnter average time between messages from sender's layer5 [ > 0.0]: ");//fscanf(fp,"%f",&lambda);scanf("%f",&lambda);printf("\nEnter TRACE: ");//fscanf(fp,"%d",&TRACE);scanf("%d",&TRACE);printf("\n\n");srand(9999); /* init random number generator */sum = 0.0; /* test random number generator for students */for (i=0; i<1000; i++)sum=sum+jimsrand(); /* jimsrand() should be uniform in [0,1] */avg = sum/1000.0;/*if(avg < 0.25 || avg > 0.75){printf("It is likely that random number generation on your machine\n" ); printf("is different from what this emulator expects. Please take\n"); printf("a look at the routine jimsrand() in the emulator code. Sorry. \n");exit(0);}*/printf("%f",avg);ntolayer3 = 0;nlost = 0;ncorrupt = 0;time=0.0; /* initialize time to 0.0 */generate_next_arrival(); /* initialize event list */}//随机数发⽣器float jimsrand(){double mmm = 2147483647; /* largest int - MACHINE DEPENDENT */ float x; /* individual students may need to change mmm */x = rand()/mmm; /* x should be uniform in [0,1] */return(x);}//**************************************************************************************//*******************************事件处理部分*******************************************void generate_next_arrival(){double x,log(),ceil();struct event *evptr;float ttime;int tempint;//if (TRACE>2)//printf("-----------------GENERATE NEXT ARRIVAL: creating new arrival\n"); x = lambda*jimsrand()*2; /* x is uniform on [0,2*lambda] *//* having mean of lambda */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + x;evptr->evtype = FROM_LAYER5;if (jimsrand()<0.5){evptr->eventity = A;}elseevptr->eventity = B;insertevent(evptr);}//向事件列表中插⼊⼀条新的事件void insertevent(struct event *p){struct event *q,*qold;if (TRACE>2){//printf(" INSERTEVENT: time is %lf\n",time);//printf(" INSERTEVENT: future time will be %lf\n",p->evtime);}q = evlist; /* q points to front of list in which p struct inserted */if (q==NULL)/* list is empty */{evlist=p;p->next=NULL;p->prev=NULL;}else{for (qold = q; q !=NULL && p->evtime > q->evtime; q=q->next) qold=q; if (q==NULL)/* end of list */{qold->next = p;p->prev = qold;p->next = NULL;}else if (q==evlist)/* front of list */{p->next=evlist;p->prev=NULL;p->next->prev=p;evlist = p;}else /* middle of list */{p->next=q;p->prev=q->prev;q->prev->next=p;q->prev=p;}}}//打印事件列表void printevlist(){struct event *q;int i;printf("--------------\nEvent List Follows:\n");for(q = evlist; q!=NULL; q=q->next){printf("Event time: %f, type: %d entity: %d\n",q->evtime,q->evtype,q->eventity); }printf("--------------\n");}//启动计时器void starttimer(int AorB,float increment){struct event *q;struct event *evptr;。
计算机网络实验路由器的基本配置实验报告

计算机网络实验实验题目:路由器的基本配置实验目的:掌握路由器的基本管理特性,学习路由器配置的基本指令,配置路由器支持Telnet 操作的相关指令实验内容要求:(1)网络设备模式的切换(2)网络设备指令的使用技巧(3)配置路由器的管理IP 地址(4)配置路由器密码(5)保存对路由器所作的配置第一步:在交换机上配置管理IP 地址第一步:在路由器上配置fastethernet0 端口的IP 地址Router:admin ! 进入特权模式Router#configterminal ! 进入全局配置模式Router(config)#hostnameRouterA ! 配置路由器名称为“RouterA”RouterA(config)#interfacegigabitEthernet0/1 ! 进入路由器接口配置模式或RouterA(config)#interfacegigabitEthernet0/0RouterA(config-if)#ipaddress192.168.0.138255.255.255.0 ! 配置路由器管理接口IP 地址RouterA(config-if)#noshutdown ! 开启路由器fastethernet1/0 接口RouterA(config-if)#exit RouterA(config)#exit验证测试:验证路由器接口配置状态RouterA(config)#showipinterfacebrief !显示IP 端口状态Interface IP-Address(Pri) IP-Address(Sec) Status Protocol GigabitEthernet0/0 192.168.1.1/24 noaddress down down GigabitEthernet0/1192.168.0.138/24 noaddress up up VLAN1 noaddress noaddress up down 第四步:保存在路由器上所做的配置RouterA#write Buildingconfiguration... [OK]实验结果:。
计算机网络实验报告

计算机网络实验报告计算机网络实验报告实验时间:参加人员:一、实验名称:简单以太网的组建二、实验内容1、观察教学机房,了解计算机网络结构,并画出计算机网络拓扑结构图。
2、了解计算机网络中的网络设备,并了解每台计算机上使用的网络标识、网络协议。
3、制作2根直通双绞线和2根交叉线,并测试。
4、分别用制作好的直通线、交叉线以及串口线、并口线,连接两台计算机。
三、实验步骤1、教学机房网络拓扑结构观察计算机教学机房的计算机网络的组成,并画出网络拓扑结构图。
(1)记录联网计算机的数量、配置、使用的操作系统、网络拓扑结构、网络建成的时间等数据。
(2)了解教学机房设备是如何互联的。
(3)认识并记录网络中使用的其他硬件设备的名称、用途和连接的方法。
(4)根据以上数据及观察结果画出拓扑结构图。
(5)分析网络使用的结构及其所属类型。
(6)打开计算机进入系统,查看计算机的网络参数,记录主要网络配置参数。
2、直通线的制作按照EIA/TIA568B的标准,制作两段直通线。
(1)利用双绞线拨线器将双绞线的外皮除去2~3cm。
有些双绞线电缆内含有一条柔软的尼龙绳,若在剥除双绞线的外皮时,裸露出部分太短,可紧握双绞线外皮,再捏住尼龙线的下方剥开。
(2)将裸露的双绞线中的橙色对线拨向自己的前方,棕色对线拨向自己的方向,绿色对线拨向自己的左方,蓝色对线拨向右方。
(3)将绿色对线和蓝色对线放在中间位置,橙色对线和棕色对线保持不动,即放在靠外的位置。
(4)小心拨开每一对线,而不必剥开各对线的外皮。
特别注意的是,绿色条线应跨越蓝色对线。
正确的线序是:白橙、橙、白绿、蓝、白蓝、绿、白棕、棕。
这里最容易犯错的是将白绿线与绿线相邻放在--起(5)将裸露出的双绞线用剪刀或斜口钳剪下只剩下约14mm的长度。
最后再将双绞线的每一根线依序放入RJ-45接头的引脚内,第一一只引脚内应该放白橙色的线,其余类推。
(6)确定双绞线的每根线已经正确放置后,就可以用RJ-45压线钳压接RJ-45接头了,要确保每一根线与接头的引脚充分接触。
计算机网络中的路由算法优化与仿真实验

计算机网络中的路由算法优化与仿真实验随着计算机网络的不断发展,网络中传输的数据量越来越大,网络规模也越来越庞大。
在这样的环境下,网络中路由算法的高效性和准确性变得越来越重要。
本文将讨论计算机网络中的路由算法优化与仿真实验。
一、路由算法的基本概念路由算法是计算机网络中非常重要的一个部分,它决定了数据包在网络中的传输路径。
具体来说,路由算法是一种算法,它通过计算选择最佳的路径,使得数据包能够快速、稳定地到达目的地。
计算机网络中常用的路由算法有很多种,比如最短路径算法、最大带宽优先算法、最小延迟路由算法、负载均衡算法等。
不同的路由算法有着不同的特点,应用场景也不尽相同。
因此,如何选择合适的路由算法,以及如何优化路由算法,是一个非常重要的问题。
二、路由算法的优化路由算法的优化可以从多个角度入手,其中比较常见的包括以下几点:1、改进路由选择指标路由选择指标是指路由算法选择哪条路径的分类依据。
不同的指标对路由算法的影响也不同,因此改进路由选择指标可以有效提升路由算法的效率。
比如,常见的路由选择指标包括带宽、延迟、稳定性等。
可以根据网络实际情况来选择最恰当的指标,从而优化路由算法。
2、优化路由表路由表是路由算法中非常重要的一部分,它记录了数据包应该走的路径。
路由表的优化可以通过多种方式完成,比如压缩路由表、减少冗余信息等。
这些方式可以有效提升路由算法的效率,降低网络延迟。
3、改进路由算法除了通过改进路由选择指标和路由表来优化路由算法外,还可以通过改进路由算法本身来提升网络性能。
比如,使用分级路由算法,将网络划分为多个级别,为不同级别的网络设备分配不同的路由算法。
这样可以有效降低网络拥塞,提升网络吞吐量。
三、仿真实验为了验证路由算法的效果,可以使用仿真实验方法进行测试。
在仿真实验中,可以通过模拟不同网络环境来测试路由算法的效率和准确性。
在仿真实验中,还可以得到大量的实验数据,用于优化路由算法。
仿真实验中,需要用到仿真软件。
《计算机网络》实验报告

《计算机网络》实验报告计算机网络实验报告引言计算机网络是现代社会不可或缺的一部分,它连接了世界各地的计算机和设备,使得信息的传递和交流变得更加便捷和高效。
本次实验旨在通过搭建一个简单的局域网,探索计算机网络的基本原理和应用。
实验目的本次实验的目的是通过搭建一个局域网,实现多台计算机之间的通信和文件共享。
通过这个实验,我们可以深入了解计算机网络的工作原理和相关技术,加深对网络通信的理解。
实验步骤1. 确定实验所需设备和软件:本次实验所需设备包括多台计算机、交换机、网线等。
软件方面,我们选择了Windows操作系统和网络配置工具。
2. 搭建物理连接:首先,我们需要将多台计算机通过网线连接到交换机上。
确保每台计算机都与交换机连接稳定,并能够正常获取IP地址。
3. 配置网络参数:在每台计算机上,我们需要进行网络参数的配置。
包括IP地址、子网掩码、网关等。
确保每台计算机都处于同一个局域网中,并能够相互通信。
4. 测试网络连接:在完成网络参数配置后,我们可以进行网络连接的测试。
通过在不同计算机上进行ping命令测试,确保各台计算机之间可以相互通信。
5. 文件共享设置:为了实现文件共享,我们需要在其中一台计算机上设置共享文件夹,并将其他计算机添加到共享访问权限中。
这样,其他计算机就可以通过网络访问和共享该文件夹中的文件。
实验结果与分析通过以上的实验步骤,我们成功搭建了一个局域网,并实现了多台计算机之间的通信和文件共享。
在测试网络连接时,我们发现网络的延迟时间较低,通信速度较快,符合我们对计算机网络的期望。
在进行文件共享时,我们发现共享文件夹的访问速度与网络带宽和计算机性能有关。
当网络负载较高或计算机性能较低时,可能会导致共享文件夹的访问速度较慢。
因此,在实际应用中,我们需要根据具体情况来评估和优化网络性能,以提高文件共享的效率。
实验总结通过本次实验,我们深入了解了计算机网络的基本原理和应用。
我们学习到了如何搭建一个局域网,并实现多台计算机之间的通信和文件共享。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GBN和路由算法实验报告 计算机网络实验报告 ----GBN和路由算法 姓名:房皓 学号:13410801 教师:尹辉
GBN模拟实验 1. 实验目的 运用java编程语言实现基于Go-Back-N的可靠数据传输软件。 2. 实验意义 通过本实验,使学生能够对可靠数据传输原理有进一步的理解和掌握。 3. 实验背景 Go-Back-N的有限状态机模型表示如下图所示:
(a) GBN和路由算法实验报告 (b) 图为Go-Back-N的有限状态机模型(a)发送端 (b)接受端 4. 实验步骤
(1) 选择java编程语言编程实现基于Go-Back-N的可靠数据传输软件。 (2) 在实际网络环境或模拟不可靠网络环境中测试和验证自己的可靠数据传输软件。 5. 实验环境 (1) 实验语言:JAVA (2) 实验平台:Eclipse (3) 引用库函数:随机(Random)库、计时库(Timer) 6. 类概览与描述 (1) Sender类:继承于Thread(线程)类,模拟发送方的 一切功能,主要功能函数有: A. Public void run()——启动函数,标识开始发送数据包 B. Sender()——构造函数,分配并初始化窗口值 C. Public void getack(in tack)——ACK接收函数,接收接收方返回的ACK并进行验证是否为期待的ACK值(若不是,则重发) GBN和路由算法实验报告 D. Public void time()——定时器函数,初始化定时,计时并记录超时与否的状态 (2) Receiver类:继承于Thread(线程)类,模拟接收方的一切功能,主要功能函数有: A. Public void run()——启动函数,标识开始等待并接收数据包 B. Void Receive(int data,Sender s)——数据包接收函数,功能强大!主要包括:接收数据包,验证数据包,判断与丢弃数据包,发送ack等 (3) Timers类:继承于TimerTask(计时器)类,具有自定义定时与超时提醒的功能,主要功能函数有: A. Public void run()——启动函数,标识开始计时(这里预设的是2秒的时间),超时后提醒并且停止计时器 B. Public Timers()——构造函数,清0计时器,等待下一次启动
(4) GBN类:继承于Thread(线程)类,是主函数类,具有本程序的核心功能,这里先作一部分简单介绍,主要函数功能有: A. Static void senddelay(int x) throws InterruptedExceptionPublic Timers()——随机延GBN和路由算法实验报告 迟函数,模拟数据包发送传输过程中的随机延迟,常用延迟值分别为:300ms, 750ms, 1200ms, 3000ms等 B. Public static void main(String[] args) throws IOException, InterruptedException()——主函数,功能强大,主要包含以下几大方面: ① 开启发送端与接收端(包括计时器) ② 超时或者ACK不匹配等情况导致的发送方 重新发送数据包 ③ (第一次)发送当前窗口内的数据包 ④ 随机函数模拟数据包发送过程中的丢包情况 ⑤ 实时更新与显示当前窗口内的数据包情况 ⑥ 统计每一个数据包被发送过的次数(含重发)并最终显示出来 C. static void OutputWindow(Sender s) ——输出当前窗口状态函数。 7. 代码展示与描述 (一) Sender类 import java.util.Timer; public class Sender extends Thread{ public int windowsize=4; //发送方窗口长度设为3 public String[] data={"data1","data2","data3", GBN和路由算法实验报告 "data4","data5","data6","data7"}; //模拟七个数据包 public int sign[]={0,1,2,3,4,5,6}; //为7个数据包标号 public int localack=-1; //保存最近收到的ACK public Timers litime=null; //定时器(这里定为2秒) public int switches=0; //超时标志,1为超时 public int windowsign[]; //当前窗口内待发的数据分组的序号 public int acksign[]={1,1,1,1,1,1,1}; //为0表示收到正确ACK,为1表示收到错误的ACK,必须重发! public int sent[]={1,1,1,1,1,1,1};//发送标记,1未发送,0已发送 public int acknowledged[]={1,1,1,1,1,1,1};//接收标记,1未接收,0已接收 public Sender(){ windowsign=new int[windowsize]; //给窗口分配指定大小的空间 for(int i=0;iwindowsign[i]=sign[i]; //窗口初始化时存放前3个序号 } public void run(){ System.out.println("发送方:现在开始发送分组数据!"); } public void getack(int ack){ System.out.println("发送方:收到了ACK,序号为"+ack+",现在开始确认!"); if(ack!=localack+1){ System.out.println("发送方:经验证,这不是发送方正期待的ACK,即将重发序号为"+(localack+1)+"的数据分组!"); //acksign[localack+1]=1; } else{ localack=ack; //表示正确确认了ACK acksign[localack]=0; } } public void time(){ switches=0; //标志初始化为0 litime=new Timers(); Timer limit=new Timer(); limit.schedule(litime, 0,100); } }
(二) Receiver类
import java.util.Random; public class Receiver extends Thread{ public int lastdata=-1; GBN和路由算法实验报告 public int expectdata; public Sender sender; public void run(Sender s){ sender=s; System.out.println("接收方:现在接收分组数据!"); } void receive(int data, Sender s){ sender=s; //发送方的参数传递 System.out.println("接收方:收到了序号为"+data+"的分组!");
if(data==lastdata+1){ //数据包序号校验,若连续则是正确/所期待的 System.out.println("接收方:该数据分组正是所期待的,接受它并准备回送对应的ACK!"); if(sender.litime.limit<20){ //判断是否超时(2秒) lastdata++; //更新本地保存的数据包序号变量 //ack=lastdata; //获取本场保存的数据包序号 sender.getack(lastdata); } else{ expectdata=lastdata+1; System.out.println("发送方:计时超时!!(未丢包但是时间超过2秒)即将重发序号为"+expectdata+"的数据分组!"); //sender.acksign[lastdata+1]=1; sender.switches=1; //如果超时,设置超时状态并显示警告 } //lastdata=data; //更新本地保存的数据包序号变量 //respond(lastdata+1); //回送该正确接收的数据包对应的ACK } else{ System.out.println("接收方:该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK!"); //respond(lastdata); //若不是所期待的数据包则丢弃并且重发上一次的ACK if(sender.litime.limit<20){ //判断是否超时(2秒) sender.getack(lastdata); } else{ expectdata=lastdata+1; System.out.println("发送方:计时超时!!(未丢包但是时间超过2秒)发送方即将重发序号为"+expectdata+"的数据分组!"); sender.switches=1; //如果超时,设置超时状态并显