网络原理实验报告(GBN)
gbn协议
gbn协议GBN协议(Go-Back-N Protocol)是一种混合ARQ协议,主要用于解决数据分组在网络传输过程中可能发生丢失、损坏或重复的问题。
GBN协议采用了窗口滑动的机制,能够实现高效可靠的数据传输。
GBN协议的基本原理是在发送方和接收方之间维护一个滑动窗口。
发送方每次发送一个数据分组后,会等待接收方的确认消息。
如果发送方收到了确认消息,它就会将滑动窗口向前滑动一个位置,并发送下一个数据分组。
如果发送方在规定的时间内没有收到确认消息,就会认为该数据分组丢失了,并重新发送该分组。
接收方会记录已经收到的数据分组,并发送一个确认消息给发送方,确认已接收到的数据分组。
GBN协议的窗口滑动机制可以提高网络链路的利用率。
在网络传输过程中,发送方可以持续发送数据分组,而无需等待接收方的确认消息,从而减少了传输时延。
只有在接收方出现丢包或乱序情况时,发送方才会重新发送数据分组。
GBN协议还能够提供可靠的数据传输。
接收方会按序接收数据分组,并发送确认消息给发送方。
如果接收方收到一个已经接收过的分组,它会丢弃该分组,并继续等待下一个分组。
发送方在接收到确认消息后,会将滑动窗口向前滑动一个位置,继续发送数据分组。
由于接收方可能会出现网络延迟,发送方需要在一定时间内等待确认消息。
如果在超时时间内,发送方没有收到确认消息,就会重新发送已经发送过但没有被确认的数据分组。
GBN协议也存在一些缺点。
首先,发送方可能会在网络传输时延比较高的情况下重发已经发送过的数据分组,这会导致网络资源的浪费。
其次,接收方需要按序接收数据分组,一旦发生丢包或乱序,会对传输性能造成影响。
此外,GBN协议只适用于具有较低的网络丢包率和延迟的情况,对于高丢包率和延迟的网络环境来说,GBN协议的性能可能会变得很差。
总结起来,GBN协议是一种高效可靠的数据传输协议,通过窗口滑动机制实现了高利用率的网络传输。
它能够提供可靠的数据传输,但在一些特殊的网络环境下可能会存在性能问题。
网络原理实验报告
网络原理实验报告网络原理实验报告一、引言网络原理是计算机科学中的重要基础知识,通过实验可以更好地理解和掌握网络的工作原理。
本实验报告旨在总结和分析我们在网络原理实验中所做的实验内容和实验结果。
二、实验目的本次实验的主要目的是通过搭建一个简单的局域网,了解和掌握网络的基本概念和工作原理。
具体实验内容包括网络拓扑结构的搭建、IP地址的配置、网络通信的测试等。
三、实验过程1. 网络拓扑结构的搭建我们使用了三台计算机和一个交换机来搭建一个简单的局域网。
首先,我们将三台计算机连接到交换机上,确保每台计算机都能够正常连接到交换机。
然后,我们通过配置交换机的端口,将这三台计算机连接在同一个局域网中。
2. IP地址的配置在搭建好网络拓扑结构后,我们需要为每台计算机配置IP地址,以便它们能够相互通信。
我们使用了静态IP地址的方式进行配置,为每台计算机分配了一个唯一的IP地址。
通过配置IP地址,我们可以实现计算机之间的互联和数据传输。
3. 网络通信的测试在完成网络拓扑结构的搭建和IP地址的配置后,我们进行了网络通信的测试。
我们通过在不同计算机上运行ping命令,测试计算机之间的连通性。
通过ping命令,我们可以发送一个网络数据包到目标计算机,并接收到该计算机的响应。
通过测试,我们可以判断网络是否正常工作。
四、实验结果与分析通过实验,我们成功搭建了一个简单的局域网,并配置了IP地址。
在进行网络通信测试时,我们发现所有计算机之间都能够正常通信,ping命令的结果都为成功。
这表明我们的网络拓扑结构和IP地址配置是正确的。
在实验过程中,我们还发现了一些问题。
首先,网络拓扑结构的搭建需要注意连接线的正确插入。
如果连接线插入不正确,计算机之间可能无法正常通信。
其次,IP地址的配置要确保每台计算机的IP地址不重复,并且属于同一个网段。
如果IP地址配置错误,计算机之间也无法正常通信。
通过本次实验,我们深入理解了网络的工作原理。
网络是由多台计算机通过网络设备连接在一起,通过IP地址进行通信的。
网络实验报告1
网络实验报告1一、实验目的本次网络实验的主要目的是深入了解网络的工作原理,掌握网络配置和管理的基本技能,以及探究网络性能优化的方法。
通过实践操作,提高对网络技术的实际应用能力,为今后在网络领域的学习和工作打下坚实的基础。
二、实验环境本次实验在学校的网络实验室进行,实验室配备了多台计算机、网络交换机、路由器等设备。
操作系统为 Windows 10,使用的网络模拟软件为 Packet Tracer。
三、实验内容(一)网络拓扑结构设计首先,根据实验要求设计了一个简单的网络拓扑结构。
该结构包括一个核心交换机、两个接入交换机、多个终端设备(如计算机、服务器等)以及一个路由器,用于连接不同的网段。
(二)IP 地址规划与分配为了确保网络中的设备能够正常通信,需要对各个设备进行合理的IP 地址分配。
根据网络拓扑结构,划分了不同的子网,并为每个子网分配了相应的 IP 地址范围。
同时,还设置了子网掩码、网关等参数。
(三)网络设备配置1、交换机配置对核心交换机和接入交换机进行了基本配置,包括创建 VLAN、将端口划分到相应的 VLAN 中、设置端口速率和双工模式等。
2、路由器配置在路由器上配置了静态路由,实现不同网段之间的通信。
同时,还进行了 NAT 转换,使内网中的设备能够访问外网。
(四)网络性能测试1、带宽测试使用测速软件对网络的带宽进行测试,测量了不同设备之间的数据传输速率,以评估网络的性能。
2、延迟测试通过 Ping 命令对网络中的设备进行延迟测试,测量了数据包从发送到接收所经历的时间,以了解网络的响应速度。
(五)网络安全设置为了提高网络的安全性,设置了访问控制列表(ACL),限制了某些设备对特定网络资源的访问。
同时,还启用了防火墙功能,对网络中的数据包进行过滤和监控。
四、实验步骤(一)网络拓扑结构搭建1、打开 Packet Tracer 软件,从设备库中选择所需的网络设备,如交换机、路由器、计算机等,并将它们拖放到工作区中。
计算机网络实验报告(6篇)
计算机网络实验报告(6篇)计算机网络实验报告(通用6篇)计算机网络实验报告篇1一、实验目的1、熟悉微机的各个部件;2、掌握将各个部件组装成一台主机的方法和步骤;3、掌握每个部件的安装方法;4、了解微型计算机系统的基本配置;5、熟悉并掌握DOS操作系统的使用;6、掌握文件、目录、路径等概念;7、掌握常用虚拟机软件的安装和使用;8、熟悉并掌握虚拟机上WINDOWS操作系统的安装方法及使用;9、掌握使用启动U盘的制作和U盘安装windows操作系统的方法;10、了解WINDOWS操作系统的基本配置和优化方法。
二、实验内容1.将微机的各个部件组装成一台主机;2.调试机器,使其正常工作;3.了解计算机系统的基本配置。
4.安装及使用虚拟机软件;5.安装WINDOWS7操作系统;6.常用DOS命令的使用;7.学会制作启动U盘和使用方法;8.WINDOWS7的基本操作;9.操作系统的基本设置和优化。
三、实验步骤(参照实验指导书上的内容,结合实验过程中做的具体内容,完成此项内容的撰写)四、思考与总结(写实验的心得体会等)计算机网络实验报告篇2windows平台逻辑层数据恢复一、实验目的:通过运用软件R-Studio_5.0和winhe_对误格式化的硬盘或者其他设备进行数据恢复,通过实验了解windows平台逻辑层误格式化数据恢复原理,能够深入理解并掌握数据恢复软件的使用方法,并能熟练运用这些软件对存储设备设备进行数据恢复。
二、实验要求:运用软件R-Studio_5.0和winhe_对电脑磁盘或者自己的U盘中的删除的数据文件进行恢复,对各种文件进行多次尝试,音频文件、系统文件、文档文件等,对简单删除和格式化的磁盘文件分别恢复,并检查和验证恢复结果,分析两个软件的数据恢复功能差异与优势,进一步熟悉存储介质数据修复和恢复方法及过程,提高自身的对存储介质逻辑层恢复技能。
三、实验环境和设备:(1)Windows _P 或Windows 20__ Professional操作系统。
网络基本原理实习报告
实习报告实习单位:XX网络科技有限公司实习时间:2021年7月1日至2021年8月31日实习岗位:网络工程师一、实习背景及目的随着互联网技术的飞速发展,网络已经成为现代社会生活、工作的重要部分。
作为一名网络工程专业的学生,为了更好地将理论知识与实际工作相结合,提高自己的实际操作能力,我选择了网络基本原理实习,希望通过实习深入了解网络的工作原理和实际应用。
二、实习内容及过程1. 实习内容(1)学习网络基础知识,包括TCP/IP协议、网络拓扑结构、网络设备等;(2)了解公司网络架构,参与网络设备的配置和维护;(3)参与公司内部网络故障排查,提高网络问题解决能力;(4)学习网络安全知识,了解常见的安全威胁和防护措施;(5)参加公司举办的培训和讲座,拓宽知识面。
2. 实习过程(1)在实习初期,我通过阅读专业书籍、观看视频教程等方式,系统学习了网络基础知识,为实际操作打下基础;(2)在导师的指导下,我了解了公司网络架构,学会了使用网络设备,如路由器、交换机等,并参与了网络设备的配置和维护;(3)在实习过程中,我参与了公司内部网络故障的排查,通过实际操作,提高了网络问题解决能力;(4)我参加了公司举办的网络安全培训,了解了常见的安全威胁和防护措施,增强了网络安全意识;(5)实习期间,我还参加了多次讲座,拓宽了知识面,为今后的职业发展奠定了基础。
三、实习收获通过这次实习,我收获颇丰,具体表现在以下几个方面:1. 提高了自己的实际操作能力,将理论知识运用到实际工作中;2. 加深了对网络基本原理的理解,掌握了网络设备的配置和维护方法;3. 学会了网络安全知识和防护措施,增强了网络安全意识;4. 拓宽了知识面,为今后的职业发展奠定了基础;5. 增强了团队合作能力,学会了与同事沟通、协作。
四、实习总结通过这次网络基本原理实习,我深刻认识到理论知识与实际工作的重要性。
在今后的学习和工作中,我将继续努力提高自己的专业素养,将所学知识运用到实际工作中,为公司的发展贡献自己的力量。
计算机网络GBN和路由算法实验报告
A.Public void run()启动函数,标识开始计时(这
里预设的是2秒的时间),超时后提醒并且停止 计时器
B.Public Timers()――构造函数,清0计时器,等待
下一次启动
(4)GBN类:继承于Thread(线程)类,是主函数类,具
有本程序的核心功能,这里先作一部分简单介绍,主 要函数功能有:
计算机网络实验报告
----GBN和路由算法
GBh
1.
运用java编程语言实现基于Go-Back-N的可靠数据传输软件。
2.
通过本实验,使学生能够对可靠数据传输原理有进一步的理 解和掌握。
3.
Go-Back- N的有限状态机模型表示如下图所示:
rdt_send(data)if(nexteeqnum <base十N) t
况
6统计每一个数据包被发送过的次数(含重
发)并最终显示出来
C.static void OutputWi ndow(Se nder s)输出
当前窗口状态函数。
7•
(一)Sender类
import java.util.Timer;
public class Sen der exte nds Thread{
compute chksum
m ake_p kt(snd pktfnextseq num)),n extseqn umxJota;ch ksu m)udi_se nd(sndpkt(nextseq numj)
if (base==nextseqnum)
start」inn的
nextseqnum-nextseqnurm+1
lOExcepti on, In terruptedExcepti on()主函数,
计算机网络实验报告
计算机网络实验报告引言计算机网络是现代社会中不可或缺的基础设施,它使得我们能够在全球范围内实现信息交流与资源共享。
为了更好地理解计算机网络的工作原理,本次实验我们进行了一系列的网络实验。
一、网络拓扑实验首先,我们进行了网络拓扑实验,通过搭建不同拓扑结构的网络,观察其性能表现和通信效率。
我们尝试了星型、环状和总线型拓扑结构,并通过测量网络中的传输时延、带宽和吞吐量来评估不同拓扑结构的优劣。
结果显示,星型拓扑结构具有较好的扩展性和可靠性,但是对中央节点的要求较高,一旦中央节点故障,整个网络将无法正常运行。
而环状和总线型拓扑结构则相对简单,但是容易产生信号干扰和数据冲突等问题。
二、网络传输协议实验接下来,我们进行了网络传输协议实验,重点研究TCP/IP协议的性能和可靠性。
我们通过改变传输文件的大小、网络拥塞程度等因素,测试了TCP协议在不同情境下的传输速度和稳定性。
同时,我们也对比了UDP协议的传输效果。
实验结果表明,TCP协议在数据传输方面具有较好的可靠性和流量控制能力,但是在高丢包率的情况下会出现明显的传输延迟。
相比之下,UDP协议虽然传输速度较快,但是无法保证数据的可靠性,容易出现丢包和重传等问题。
三、网络安全实验随后,我们进行了网络安全实验,探讨了网络攻击与防御的相关技术。
我们采用了常见的入侵检测系统和防火墙来保护网络安全,通过模拟各种攻击手段,如拒绝服务攻击、端口扫描等,测试了网络的防护能力。
实验结果显示,入侵检测系统和防火墙能够有效地阻止大多数网络攻击,但是对于某些高级攻击手段,如零日漏洞攻击,仍然存在一定的漏洞。
因此,网络安全的保护需要综合运用各种技术手段,不断提升系统的安全性。
结论通过本次计算机网络实验,我们对网络拓扑结构、传输协议和网络安全等方面有了更深入的理解。
网络拓扑结构的选择应根据实际需求进行权衡,传输协议的选择应根据网络特性和应用场景进行调整,而网络安全则需要综合运用各种安全技术来确保系统的稳定性和数据的安全性。
网络原理综合实验报告
华北科技学院计算机系综合性实验实验报告课程名称计算机网络原理实验学期 2011 至 2012 学年第一学期学生所在系部计算机系年级 2009级专业班级网络B09X 学生姓名 heihei 学号 200907024129 任课教师陈振国实验成绩计算机系制《计算机网络原理》课程综合性实验报告开课实验室:网络专业实验室2011年11月14日实验题目子网规划与组网实验一、实验题目:综合实验二、实验目的:通过本次实验,使学生掌握从网络规划、设备与拓扑结构选择一直到最后组网和测试的全过程,从而培养学生独立进行子网划分、设备选型、交换机配置、路由器配置,并对组建的网络进行测试等多方面综合操作的能力,加深对相关内容知识的理解。
三、实验设备及环境:PC兼容机、Windows操作系统、Visio软件、交换机、路由器、网线制作工具、测试工具四、实验内容及要求:1、现有教务处、人事处、科研处、财务处四个部门要接入网络,每个部门预计最多有25台机器,为了保证安全性和操作的方便性,要求各个部门内部能够直接连通,各个部门之间需要借助路由设备或三层设备来实现彼此的通信(即每个部门属于一个VLAN),若给定的网络地址空间为:192.168.10.0,在该空间内分配四个部门的地址(在该空间内划分出四个子网,分配给四个部门),完成上述组网要求,输出最后的规划方案(包括划分的原则及每个部门所分配的地址)。
2、根据规划方案,选择合适的网络设备和拓扑结构,输出网络拓扑结构图。
3、根据规划方案和网路拓扑图,进行实际的组网操作,完成整个网络的组建;(在实际组网中,每个部门可用一台设备来代表)1)将各设备接入网络。
2)根据规划方案,对交换机进行配置,将四个部门划分到不同的子网中去。
3)对路由器或三层交换设备进行配置,实现各个子网之间的通信(选作)。
本部分输出整个网络组建的操作过程,以及在此过程中遇到的问题和解决的方案。
4、组网完成后对其连通性进行测试。
计算机网络原理实验报告
计算机网络原理实验报告一、实验目的1.了解计算机网络的基本概念和原理;2.掌握计算机网络的基本组成部分及其功能;3.学习使用网络配置工具进行网络的配置和管理;4.掌握网络通信的基本步骤和网络协议的作用;5.通过实验,加深对计算机网络的理论知识的理解和应用。
二、实验环境1. 操作系统:Windows 10;2. 软件工具:Packet Tracer;3.实验设备:计算机、路由器、交换机。
三、实验内容1.网络配置实验通过使用Packet Tracer软件,建立一个简单的局域网,包括一台计算机、一台路由器和一台交换机。
使用网络配置工具进行网络的配置和管理,实现计算机与路由器之间的通信以及计算机与交换机之间的通信。
2.网络通信实验通过Ping命令测试计算机与路由器之间的连通性,并观察分组的传输过程。
同时,使用Wireshark抓包工具,捕获网络数据包,并分析数据包的结构和内容。
可以观察到IP地址、MAC地址以及各类协议的使用情况。
四、实验步骤1. 打开Packet Tracer软件,创建一个场景,包括一台计算机、一台路由器和一台交换机。
2.使用网络配置工具,给计算机、路由器和交换机分配IP地址,并设置子网掩码。
3.配置路由器的路由表,将计算机所在的网段加入到路由器的路由表中。
4. 在计算机上通过命令行窗口,使用Ping命令测试与路由器的连通性。
5. 同时,启动Wireshark抓包工具,并对网络通信进行抓包。
6. 观察Ping命令的结果,判断是否与路由器连通。
7. 分析Wireshark抓包结果,观察数据包的结构和内容,了解网络通信的基本原理和过程。
五、实验结果与分析1.网络配置实验通过网络配置工具,成功配置了计算机、路由器和交换机的IP地址,并设置了子网掩码。
通过配置路由器的路由表,实现了计算机与路由器之间的通信以及计算机与交换机之间的通信。
2.网络通信实验Ping命令的结果显示,计算机与路由器之间连通正常。
计算机网络原理实验七传输层可靠传输协议GBN编程实验报告精编
计算机网络原理实验七传输层可靠传输协议GBN编程实验报告精编实验七:传输层可靠传输协议-GBN编程实验报告一、实验目的1. 理解传输层的可靠传输协议GBN(Go-Back-N)的工作原理;2. 利用Python编程实现GBN协议;3.通过实验验证GBN协议的可靠性。
二、实验环境1. 操作系统:Windows 10;2. 开发工具:Python3.9;3. Python库:socket, threading。
三、实验原理GBN(Go-Back-N)协议是一种滑动窗口协议,用于实现可靠的传输。
在GBN协议中,发送方可以连续发送一批数据包,每个数据包都有一个序号。
接收方会按照相同的序号顺序接收并确认收到的数据包,若一些数据包丢失,则接收方会等待一定时间,然后要求发送方重传从丢失的数据包开始之后的所有数据包。
在本实验中,我们将通过编程实现一个简化的GBN协议。
发送方和接收方将通过socket进行通信。
发送方将发送一定数量的数据包,接收方将模拟数据包丢失,并且在一段时间后要求发送方重传。
四、实验过程1. 建立发送方和接收方的socket连接,并互相绑定IP地址和端口号;2.发送方将一定数量的数据包发送给接收方;3.接收方按照GBN协议的规定接收数据包,并发送确认信息给发送方;4.发送方接收到确认信息后,继续发送下一批数据包;5.当接收方丢失数据包时,等待一段时间之后要求发送方重传;6.发送方收到重传请求后,重新发送从丢失的数据包开始之后的所有数据包;7.重复步骤2-6,直到所有数据包都被成功接收。
五、实验结果经过多次实验,数据包的发送与接收均顺利进行。
发送方能够根据接收方的确认信息进行滑动窗口的滑动,并实现重传功能。
接收方也能够检测到丢失的数据包,并要求发送方进行重传。
整个传输过程基本完成了GBN协议可靠性传输的要求。
六、实验总结通过本次实验,我深入理解了传输层的可靠传输协议GBN的工作原理,并通过编程实现了一个简化的GBN协议。
实验五、传输层可靠传输协议GBN编程实验报告
实验五、传输层可靠传输协议GBN编程实验报告序号:姓名:杨学号:成绩一、实验目的:1、编程实现简单可靠的数据传输GBN协议,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
二、实验指导:参考教材。
三、实验要求:编程实现一个GBN传输协议,程序源代码:发送方源代码:// sender.cpp发送方程序代码,定义控制台应用程序的入口点//#include <stdafx.h>#include <iostream>#include <WinSock2.h>#include <string.h>#include <../header/ARQ.h>#include <../header/Exception.h>#define SERVER_PORT 2011 // 服务器端口#define MAXRETRY 5 //最大重传次数#define TIMEOUT 2000 // 传送传时时间#pragma comment(lib,"ws2_32.lib")//设置link时的lib库using namespace std;SOCKET PrimaryUDP;char ServerIP[20];char FilePath[MAX_PATH];bool g_number = false; // 用作奇偶检校的序号char g_bcc;// 返回的控制字符HANDLE m_hEvent;void InitWinSock(){WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){throw Exception("Windows sockets 2.2 startup unsuccessful");}else{printf("Using %s (Status: %s)\n",wsaData.szDescription, wsaData.szSystemStatus);printf("with API versions %d.%d to %d.%d\n\n",LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));}}void mksock(int type){PrimaryUDP = socket(AF_INET, type, 0);if (PrimaryUDP < 0){throw Exception("create socket error");}}void BindSock(){sockaddr_in sin;sin.sin_addr.S_un.S_addr = INADDR_ANY;sin.sin_family = AF_INET;sin.sin_port = 0;if (bind(PrimaryUDP, (struct sockaddr*)&sin, sizeof(sin)) < 0) throw Exception("bind error");}bool ASendto(){sockaddr_in remote;remote.sin_addr.S_un.S_addr = inet_addr(ServerIP);remote.sin_family = AF_INET;remote.sin_port = htons(SERVER_PORT);int fromlen = sizeof(remote);// 打开文件FILE * file;if((file = fopen(FilePath, "rb")) == NULL){cout<<FilePath<<" open error"<<endl;return false;}cout<<"file open succeed"<<endl;// 设置文件指针位置SetFilePointer(file, 0, NULL, FILE_BEGIN);BSC bsc;bsc.header = STX;bsc.tail = ETX;// 设为有信号SetEvent(m_hEvent);// 分段序号bool number = false;unsigned long dwRead = -1;bool sendComplete = false;while(!sendComplete){// 清空数据memset(bsc.data, 0, MAXBSCLENGTH);// 当前分块的奇偶序号bsc.number=number;// 记录当前的分块序号g_number = bsc.number;if (dwRead ==-1)//第一次应发送文件请求消息{// 发送文件请求bsc.bcc = ENQ;char * filename = FilePath;if ((filename = strrchr(FilePath,'\\'))==NULL)filename = FilePath;else++filename;strcpy(bsc.data,filename);dwRead = 0;}else{if(!feof(file)){bsc.bcc = SYN;int i = fread(bsc.data, sizeof(char),MAXBSCLENGTH , file);cout<<"read:"<<i<<"\tsend:"<<sizeof(bsc.data)<<endl;dwRead+=i;}else{// 发送完毕bsc.bcc = EOT;sendComplete = true;cout<<"send complete.send size:"<<dwRead<<endl;fclose(file);}}for(int i=0;i<MAXRETRY;i++){sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,fromlen);ResetEvent(m_hEvent);DWORD reslut = WaitForSingleObject(m_hEvent,TIMEOUT);if (reslut == WAIT_OBJECT_0){// 收到应答消息,一种是ACK,一种是NAKif (g_bcc == NAK){if (i == MAXRETRY -1){return false;}// 继续重传continue;}else{ // 收到应答消息//cout<<"send succeed"<<endl;break;}}else if(i == MAXRETRY-1){cout<<"send file failed"<<endl;return false;}} // 开始发下一段数据number = !number;}return true;}DWORD WINAPI ARecv(LPVOID lpParam){sockaddr_in remote;int sinlen = sizeof(remote);BSC buffer;int iread = 0;while (true){iread = recvfrom(PrimaryUDP,(char*)&buffer,sizeof(buffer),0,(sockaddr*)&remote,&sinlen);// 处理ACK与NAKif (iread == SOCKET_ERROR){continue;}// 与当前的分块序号进行比较,看是不是当前块的应答if (buffer.number!=g_number){continue;}if (buffer.bcc == ACK || buffer.bcc == NAK){// 保存返回的控制字符g_bcc = buffer.bcc;SetEvent(m_hEvent);}}return 0;}int _tmain(int argc, _TCHAR* argv[]){InitWinSock();mksock(SOCK_DGRAM);BindSock();cout<<"Please input receiver ip:";cin>>ServerIP;cout<<"Please input the file path:";cin>>FilePath;m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);CreateThread(NULL, 0, ARecv, NULL, 0, NULL);if (!ASendto()){cout<<"file send failed"<<endl;getchar();}getchar();getchar();return 0;}接收方源代码:// receiver.cpp 接收方程序代码,定义控制台应用程序的入口点// #include <stdafx.h>#include <iostream>#include <WinSock2.h>#include <../header/ARQ.h>#include <../header/Exception.h>#define SERVER_PORT 2011// 服务器端口#pragma comment(lib,"ws2_32.lib")//设置link时的lib库using namespace std;SOCKET PrimaryUDP;char FileSavePath[MAX_PATH];void InitWinSock(){WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){throw Exception("Windows sockets 2.2 startup unsuccessful");}else{printf("Using %s (Status: %s)\n",wsaData.szDescription, wsaData.szSystemStatus);printf("with API versions %d.%d to %d.%d\n\n",LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));}}void mksock(int type){PrimaryUDP = socket(AF_INET, type, 0);if (PrimaryUDP < 0){throw Exception("create socket error");}}void BindSock(){sockaddr_in sin;sin.sin_addr.S_un.S_addr = INADDR_ANY;sin.sin_family = AF_INET;sin.sin_port = htons(SERVER_PORT);if (bind(PrimaryUDP, (struct sockaddr*)&sin, sizeof(sin)) < 0) throw Exception("bind error");}DWORD WINAPI ARecv(LPVOID lpParam){FILE * file = NULL;sockaddr_in remote;int sinlen = sizeof(remote);BSC buffer,bsc;bsc.header = STX;bsc.tail = ETX;memset(bsc.data, 0, MAXBSCLENGTH);int iread = 0;unsigned long dwReceived = 0;bool number = true;//发送方的数据开始发送时的序号设为0,为了判断是不是第一次一段数据,所以这里标为1while (true){iread = recvfrom(PrimaryUDP,(char*)&buffer,sizeof(buffer),0,(sockaddr*)&remote,&sinlen) ;if (SOCKET_ERROR == iread || buffer.header != STX || buffer.tail != ETX) {// 数据错误,发送负应答cout<<"received a error data"<<endl;bsc.bcc = NAK;bsc.number=false;//number这时没有实际的意义sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,sinlen);continue;}if (buffer.number == number){// 重复收到数据,发送应答消息cout<<"received a repeat data"<<endl;bsc.bcc = ACK;bsc.number = buffer.number;sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,sinlen);continue;}switch(buffer.bcc){case ENQ:{number = !number;//准备接收下一段数据// 文件请求cout<<"received a file request message,filename:"<<buffer.data<<endl;// 打开文件if(strcmp((FileSavePath+strlen(FileSavePath)-1),"\\")!=0)strcat(FileSavePath,"\\");strcat(FileSavePath,buffer.data);if((file = fopen(FileSavePath, "ab")) == NULL){cout<<"file open failed"<<endl;return -1;}break;}case SYN:{number = !number;// 文字发送中int i =0;if((i=fwrite(buffer.data, sizeof(char), sizeof(buffer.data), file)) <= 0){cout << "write failed" << endl;return -1;}dwReceived += i;cout<<"write:"<<i<<"\treceived:"<<sizeof(buffer.data)<<endl;break;}case EOT:{number = !number;// 文件发送完毕cout<<"file received completely,save path:"<<FileSavePath<<",received size:"<<dwReceived<<endl;fclose(file);break;}default:{// 数据错误,发送负应答bsc.bcc = NAK;bsc.number=false;sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,sinlen);continue;break;}} // 发送应答消息bsc.bcc = ACK;bsc.number = buffer.number;sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,sinlen);}return 0;}int _tmain(int argc, _TCHAR* argv[]){InitWinSock();mksock(SOCK_DGRAM);BindSock();CreateThread(NULL, 0, ARecv, NULL, 0, NULL);cout<<"Please input the file save path:";cin>>FileSavePath;cout<<"receiver start succeed"<<endl;getchar();getchar();return 0;}四、实验总结通过这次实验基本弄清了停止等待协议的工作机理。
简述go-back-n策略的基本原理
简述go-back-n策略的基本原理
Go-Back-N(GBN)是一种常用的拥塞控制策略,它主要用于面向连接的网络
环境中,被广泛用于TCP协议,是一种可靠的数据传输策略。
它是由NICAMAC公司发明的,即网络有序报文中的”向后移动N“策略。
主要基本原理是:探查的数据
报文会以递增的方式发送,发现丢包后,则停止发送,让发送方重发编号小于出现丢包的号码的报文,这一策略不断重复下去,直至接收到即将报文确认后重新恢复发送,以此达到可靠传输的目的。
Go-Back-N策略首先由源端发送端发出数据报文,然后进行确认,当等待超时
或者接收端重新发送确认时,源端发送端就会重新发送丢失的数据报文。
这种策略的优点是发送端在未收到接收端的确认时可以继续发送,使传输效率大大提高,但是缺点是如果接收方失去了太多数据报文,那么重传可能会超出网络缓冲区的容量,最终导致系统堵塞。
Go-Back-N在高校和高等教育中也是一种被广泛使用的传输策略,例如学校隔
离系统、网络实验,以及智能教学和课堂特殊实验要求较高的地方。
可以应用Go-Back-N策略,使传输速度增快,并有效控制网络拥塞,但要注意避免数据报文的
完整性被破坏,以及丢包的频繁出现,有效的把握数据的传输,避免数据的安全加密被攻破。
Go-Back-N策略是一种拥塞控制技术,它在高校和高等教育中有广泛的应用,其优
点是发送端在未收到接收端的确认时可以继续发送,使传输效率大大提高,但同时也有一定的缺点,要提高网络传输的可靠性,就需要注意控制丢包率,并且要保持数据报文的完整性和加密安全性。
网络原理实验报告(GBN)
姓名:班级:学号:教师:运用各种编程语言实现基于Go-Back-N的可靠数据传输软件。
PS:这里使用的是JAVA语言2.实验意义通过本实验,使学生能够对可靠数据传输原理有进一步的理解和掌握。
3.实验背景Go-Back-N的有限状态机模型表示如下图所示:(a)(b)图为Go-Back-N的有限状态机模型(a)发送端(b)接受端(1)选择合适的编程语言编程实现基于Go-Back-N的可靠数据传输软件。
(2)在实际网络环境或模拟不可靠网络环境中测试和验证自己的可靠数据传输软件。
5.实验环境(1)实验语言:JAVA(2)实验平台:Eclipse(3)引用库函数:.net库、随机(Random)库、计时库(Timer)6.类概览与描述(1)Sender类:继承于Thread(线程)类,模拟发送方的一切功能,主要功能函数有:A.Public void run()——启动函数,标识开始发送数据包B.Sender()——构造函数,分配并初始化窗口值C.Public void getack(in tack)——ACK接收函数,接收接收方返回的ACK并进行验证是否为期待的ACK值(若不是,则重发)D.Public void time()——定时器函数,初始化定时,计时并记录超时与否的状态(2)Receiver类:继承于Thread(线程)类,模拟接收方的一切功能,主要功能函数有:A.Public void run()——启动函数,标识开始等待并接收数据包B.Void Receive(int data,Sender s)——数据包接收函数,功能强大!主要包括:接收数据包,验证数据包,判断与丢弃数据包等C.Public void respond(int ack)——ACK发送函数,发送当前接收到的最后一次正确的数据包对应的ACK(3)Timers类:继承于TimerTask(计时器)类,具有自定义定时与超时提醒的功能,主要功能函数有:A.Public void run()——启动函数,标识开始计时(这里预设的是2秒的时间),超时后提醒并且停止计时器B.Public Timers()——构造函数,清0计时器,等待下一次启动(4)GBN类:继承于Thread(线程)类,是主函数类,具有本程序的核心功能,这里先作一部分简单介绍,主要函数功能有:A.Static void senddelay(int x) throwsInterruptedExceptionPublic Timers()——随机延迟函数,模拟数据包发送传输过程中的随机延迟,常用延迟值分别为:300ms, 750ms, 1200ms,3000ms等B.Public static void main(String[] args) throwsIOException, InterruptedException()——主函数,功能强大,主要包含以下几大方面:①开启发送端与接收端(包括计时器)②超时或者ACK不匹配等情况导致的发送方重新发送数据包③(第一次)发送当前窗口内的数据包④随机函数模拟数据包发送过程中的丢包情况⑤实时更新与显示当前窗口内的数据包情况⑥统计每一个数据包被发送过的次数(含重发)并最终显示出来7.代码展示与描述(一)Sender类import java.util.Timer;public class Sender extends Thread{public int windowsize=3; //发送方窗口长度设为3public String[] data={"data1","data2","data3","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=0;//为0表示收到正确ACK,为1表示收到错误的ACK,必须重发!public Sender(){windowsign=new int[windowsize];//给窗口分配指定大小的空间for(int i=0;i<3;i++)windowsign[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=1;}else{localack=ack; //表示正确确认了ACKacksign=0;}}public void time(){switches=0; //标志初始化为0litime=new Timers();Timer limit=new Timer();limit.schedule(litime, 0,100);}}(二)Receiver类import java.util.Random;public class Receiver extends Thread{public int lastdata;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!=0){if(data==lastdata+1){//数据包序号校验,若连续则是正确/所期待的System.out.println("该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!");lastdata=data; //更新本地保存的数据包序号变量respond(lastdata); //回送该正确接收的数据包对应的ACK }else{System.out.println("该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK!");respond(lastdata);//若不是所期待的数据包则丢弃并且重发上一次的ACK }}else{System.out.println("该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!");lastdata=data;respond(lastdata); //首次接收数据包并且回送ACK }}void respond(int ack){ //回送指定序号的ACKif(sender.litime.limit<20){ //判断是否超时(2秒)ack=lastdata; //获取本场保存的数据包序号sender.getack(ack);}else{System.out.println("计时超时!!(未丢包但是时间超过2秒)发送方准备重发序号为"+ack+"的数据分组!");sender.switches=1; //如果超时,设置超时状态并显示警告}}}(三)Timers类import java.util.TimerTask;public class Timers extends TimerTask {public int switches;public int limit;public void run(){if(limit<20) limit++; //计时2秒else {switches=-1;this.cancel();} //开关为-1表示超时,并且停止计时器}public Timers(){switches=0; //启动计时器时全部初始化limit=0;}}(四)GBN类import .*;import java.util.Random;import java.io.*;public class GBN extends Thread{static void senddelay(int x) throws InterruptedException{if(x==1) {sleep(300); System.out.println("发送数据分组时发生延迟:300毫秒!"); }else if(x==2) {sleep(750); System.out.println("发送数据分组时发生延迟:750毫秒!");}else if(x==3) {sleep(1200);System.out.println("发送数据分组时发生延迟:1200毫秒!");}else if(x==4) {sleep(3000);System.out.println("发送数据分组时发生延迟:3000毫秒!");}else;}public static void main(String[] args) throws IOException, InterruptedException {Sender s=new Sender();Receiver re=new Receiver();s.start(); //发送端启动re.run(s); //接收端启动sleep(1000); //延迟处理int[] retimes=new int[7];//计算每个分组被发送的次数for(int i=0;i<7;i++) retimes[i]=0; //数据包顺次发送for(int i=0;i<=s.sign.length;i++){while(i>s.localack+1){ //尚有未确认的数据包,重发!System.out.println("发送方开始重新发送序号为"+(s.localack+1)+"的数据分组");retimes[s.localack+1]++;int ran=new Random().nextInt(3);int randelay=new Random().nextInt(5);s.time();senddelay(randelay); //设置随机值,模拟数据传输延迟if(ran!=1) re.receive(s.localack+1,s);//设置随机值,模拟数据丢包过程else System.out.println("序号为"+(s.localack+1)+"的分组在传给接收方途中发生了丢包!");}if(i!=s.sign.length){System.out.println();System.out.println("发送方现在开始第一次发送序号为"+i+"的数据分组");retimes[i]++;if(i!=0){for(int k=0;k<3;k++){//表示至少成功发送并确认了一个数据分组s.windowsign[k]++;//这种情况下滑动窗口向前移动!}}System.out.println();System.out.println("当前窗口内的分组情况为:");//显示当前窗口内数据包情况for(int p=0;p<3;p++){if(s.windowsign[p]<=6)System.out.println("第"+p+"号窗口里面存放的是序号为"+s.windowsign[p]+"的马上待发送的数据分组!");elseSystem.out.println("第"+p+"号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!");}System.out.println();int ran=new Random().nextInt(3);int randelay=new Random().nextInt(5);s.time(); //计时开始(2秒时间)senddelay(randelay); //设置随机值,模拟数据传输延迟if(ran!=1) re.receive(s.sign[i],s);//设置随机值,模拟数据丢包过程else System.out.println("序号为"+i+"的分组在传给接收方途中发生了丢包!");}}System.out.println();System.out.println("以下是每个数据分组被发送过的次数的统计结果");for(int i=0;i<7;i++) //显示关于每个数据包发送次数的统计表System.out.println("序号为"+i+"的数据分组被发送过的次数为:"+retimes[i]);System.exit(0);}}8.程序运行结果部分截图。
计算机网络原理 实验报告
计算机网络原理实验报告计算机网络原理实验报告引言计算机网络是现代社会中不可或缺的一部分,它使得信息的传递和共享变得更加高效和便捷。
本次实验旨在通过实际操作和观察,深入了解计算机网络的基本原理和工作机制。
实验一:局域网配置与通信在本实验中,我们使用了两台计算机和一台路由器来构建一个简单的局域网,并进行了配置和通信的实验。
1. 实验目的通过本实验,我们的目的是了解局域网的基本概念和配置方法,掌握IP地址和子网掩码的设置,以及实现计算机之间的通信。
2. 实验步骤和结果首先,我们需要将两台计算机和路由器连接起来。
我们使用了网线将计算机和路由器的LAN口连接在一起,并确保连接正确无误。
接下来,我们进行了IP地址和子网掩码的配置。
在计算机1上,我们设置了IP地址为192.168.0.1,子网掩码为255.255.255.0;在计算机2上,我们设置了IP地址为192.168.0.2,子网掩码同样为255.255.255.0。
配置完成后,我们进行了通信测试。
我们在计算机1上打开了一个命令行窗口,输入ping 192.168.0.2命令,发现能够成功与计算机2进行通信,返回了一些网络包的信息。
3. 实验总结通过本实验,我们了解了局域网的基本配置和通信原理。
我们学会了如何设置IP地址和子网掩码,并且成功地实现了计算机之间的通信。
实验二:网络协议分析在本实验中,我们使用Wireshark工具来对网络数据包进行抓包和分析,以深入了解网络协议的工作机制。
1. 实验目的通过本实验,我们的目的是熟悉Wireshark工具的使用方法,并能够分析网络数据包中的各个字段和协议。
2. 实验步骤和结果首先,我们下载并安装了Wireshark工具,并打开了一个网络抓包会话。
我们选择了一个局域网接口作为抓包的目标,并开始了抓包操作。
在抓包过程中,我们访问了一些网站和进行了一些网络操作,以产生一些网络数据包。
抓包结束后,我们停止了抓包会话,并开始分析抓到的数据包。
网络定理测试实验报告
一、实验目的1. 验证戴维南定理和诺顿定理的正确性,加深对该定理的理解。
2. 掌握测量有源二端网络等效参数的一般方法。
3. 学习电路分析的基本原理和实验技能。
二、实验原理1. 戴维南定理:任何一个线性含源一端口网络,对外部电路而言,总可以用一个理想电压源和电阻的串联形式来代替,理想电压源的电压等于原一端口的开路电压Uoc,其电阻等于网络中所有独立源置零时的入端等效电阻Req。
2. 诺顿定理:任何一个线性含源一端口网络,对外部电路而言,总可以用一个理想电流源和电阻的并联形式来代替,理想电流源的电流等于原一端口的短路电流Isc,其电阻等于网络中所有独立源置零时的入端等效电阻Req。
三、实验仪器与设备1. 信号发生器2. 万用表3. 电阻箱4. 电流表5. 电压表6. 电路实验板7. 连接线四、实验步骤1. 构建电路:根据实验原理,搭建戴维南等效电路和诺顿等效电路。
2. 测量开路电压Uoc:将万用表设置在电压挡,测量原一端口的开路电压。
3. 测量短路电流Isc:将万用表设置在电流挡,测量原一端口的短路电流。
4. 计算等效电阻Req:根据戴维南定理和诺顿定理,计算等效电阻Req。
5. 测试等效电路:将等效电路接入外部电路,观察并记录电路性能。
五、实验数据与结果1. 开路电压Uoc:测量值1为5V,测量值2为5.2V。
2. 短路电流Isc:测量值1为0.5A,测量值2为0.48A。
3. 等效电阻Req:根据戴维南定理和诺顿定理,计算得到Req为10Ω。
4. 测试等效电路:将等效电路接入外部电路,观察并记录电路性能。
在测试过程中,发现等效电路的性能与原电路基本一致。
六、实验分析与讨论1. 实验结果表明,戴维南定理和诺顿定理在理论上是正确的,可以通过实验验证。
2. 实验过程中,需要注意电路搭建的准确性,以及测量数据的准确性。
3. 实验结果表明,等效电路的性能与原电路基本一致,说明戴维南定理和诺顿定理在实际应用中具有较高的可靠性。
计算机网络原理--实验报告
实验内容与完成情况:一、(1)右击桌面的【网上邻居】图标,在出现的快捷菜单中选择【属性】命令,打开【网络连接】窗口,如图所示。
【网络连接】窗口(2)右击【本地连接】图标,在出现的快捷菜单中选择【属性】命令,打开【本地连接属性】对话框,如图所示。
【本地连接属性】对话框(3)选择【Internet协议(TCP/IP)】选项,单击【属性】按钮,打开【Internet 协议(TCP/IP)属性】对话框,如图所示。
图 Internet协议(TCP/IP)属性在图所示的【常规】选项卡中,可以看到下列选项:自动获得IP地址:允许客户利用DHCP服务器来快速获得网络参数的设置。
DHCP服务器被安装之后,启用这个设置的客户将自动获得可用的IP地址和系统管理员设置的其他属性。
使用下面的IP地址:这个按钮有三个文本框:IP 地址、子网掩码和默认网关。
自动获得DNS服务器地址:用户也能够通过DHCP自动获得。
使用下面的DNS服务器地址:这个按钮有两个文本框,即【首选 DNS服务器】和【备用DNS服务器】。
这是人工设置DNS服务器计算机地址的入口。
没有这两个文本框,这台计算机就不能通过域名与该局域网或者Internet上的计算机进行通讯。
(4)单击【确定】按钮以关闭【Internet 协议(TCP/IP)属性】对话框,再单击【关闭】按钮以关闭【本地连接属性】对话框。
二、使用IPconfig命令查看网络的参数配置,尤其是在使用动态主机配置协议DHCP 自动获取网络参数后,可以使用IPconfig/all命令查看所获取的IP地址、子网掩码、DHCP 服务器地址、DNS服务器地址等信息。
(1)命令行如下所示:ipconfig /all运行结果如图所示。
图 ipconfig命令(2)参数如下所示:/all:产生完整显示。
在没有该开关的情况下Ipconfig只显示IP地址、子网掩码和每个网卡的默认网关值。
如果没有参数,那么Ipconfig使用程序将向用户提供所有当前的TCP/IP配置值,包括IP地址和子网掩码。
计算机网络原理实验报告
计算机网络原理实验报告一、实验目的1.理解计算机网络基本原理2.掌握计算机数据传输的过程3.了解计算机网络的基本组成二、实验器材1.计算机2.网线3.路由器三、实验过程1.实验一:理解网络分层结构-计算机网络采用分层结构,分为物理层、数据链路层、网络层、传输层、应用层。
-物理层负责传输比特流,主要是光纤、双绞线等物理媒介。
-数据链路层负责将比特流转化为帧,并进行传输以保证数据的可靠性。
-网络层负责寻路和分组转发,将数据包从源节点传输到目标节点。
-传输层负责端到端连接的可靠性和流量控制。
-应用层为用户提供服务,负责通信协议的选择和具体的应用功能。
2.实验二:数据传输过程-数据从源主机通过物理媒介传输到目标主机的过程可以分为三个阶段:发送、传输和接受。
-发送端将数据按照层级结构封装,并通过物理媒介传输到接收端。
-接收端根据层级结构进行解封装和处理,最终将数据交给应用层使用。
3.实验三:计算机网络的基本组成-计算机网络由主机和链路两部分组成。
-主机包括终端设备和网络结点,终端设备有桌面电脑、笔记本电脑、智能手机等,网络结点有路由器、交换机等。
-链路是连接主机之间和主机与网络结点之间的通信路径。
四、实验结果在实验过程中,我成功地理解了计算机网络的基本原理,掌握了计算机数据传输的过程,并了解了计算机网络的基本组成。
实验结果表明,计算机网络是一个复杂的系统,需要多个层级结构相互配合才能实现数据的传输和通信。
五、实验总结通过本次实验,我深入理解了计算机网络的基本原理,掌握了计算机数据传输的过程,并了解了计算机网络的基本组成。
实验过程中,我遇到了一些问题,但通过与同学们的讨论和老师的指导,我成功地解决了这些问题,并达到了实验的目标。
六、总结和建议总的来说,本次实验对我来说是一次很好的学习机会,通过实践操作,我深入理解了计算机网络的基本原理。
然而,实验时间比较紧张,希望老师能够给予更多的实验训练的时间,让我们有更多的机会去实践和探索。
gbn协议
GBN协议简介GBN(Go-Back-N)协议是一种流量控制协议,用于在计算机网络中可靠地传输数据。
它是一种数据链路层协议,确保数据在发送方和接收方之间的可靠传输。
工作原理GBN协议通过在发送方和接收方之间维护一个滑动窗口来实现可靠传输。
滑动窗口的大小表示发送方未确认的数据包数目。
发送方按照窗口的大小将数据包发送给接收方。
接收方在正确收到数据包后发送确认消息,发送方收到确认消息后将滑动窗口向前滑动,继续发送下一个数据包。
如果发送方在一定时间内没有收到确认消息,它将重新发送滑动窗口中的所有数据包。
这样确保了数据的可靠传输。
GBN协议的特点1.流量控制:GBN协议通过滑动窗口的大小控制数据包的发送速率,以避免发送方发送过多数据导致接收方缓冲区溢出。
2.可靠性:GBN协议通过确认消息和超时重传机制确保数据的可靠传输。
发送方会不断重传未收到确认消息的数据包,直到接收方正确接收。
3.有序性:GBN协议保证接收方按照发送方发送的顺序接收数据包,不会发生乱序。
GBN协议的优缺点优点•实现相对简单:GBN协议的实现相对简单,适用于网络环境较为良好的情况。
•可靠性较高:通过确认消息和超时重传机制,GBN协议能够确保数据的可靠传输。
缺点•延迟较高:GBN协议的延迟较高,因为发送方需要等待确认消息才能发送下一个数据包。
•信道利用率低:当发生数据包丢失或损坏时,发送方需要重传整个滑动窗口中的数据包,导致信道利用率降低。
使用GBN协议的应用场景GBN协议适用于对数据可靠性要求较高的场景,例如: - 文件传输:在文件传输过程中,确保文件的完整性是非常重要的。
GBN协议可以用于在不可靠的网络环境中可靠地传输文件。
- 视频流传输:对于实时性较强的视频流传输,GBN协议可以确保视频数据的有序接收,减少视频播放的卡顿和断续。
总结GBN协议是一种可靠的流量控制协议,通过滑动窗口和确认消息机制实现数据的可靠传输。
虽然有一定的延迟和信道利用率低的缺点,但在对数据可靠性要求较高的场景下,GBN协议仍然是一种有效的选择。
计算机网络原理实验报告
计算机网络原理实验报告计算机网络原理实验报告一、引言计算机网络是当今社会中不可或缺的一部分,它连接了世界各地的计算机,使得信息的传输和共享变得更加便捷。
本篇实验报告将介绍计算机网络的基本原理以及我们在实验中所学到的知识和经验。
二、实验目的本次实验的目的是通过搭建一个简单的局域网,理解计算机网络的基本原理,并掌握网络的搭建和配置方法。
三、实验环境我们使用了两台计算机和一台路由器来搭建局域网。
其中,计算机A和计算机B分别连接到路由器的两个端口上,路由器通过交换机将两台计算机连接起来。
四、实验步骤1. 首先,我们将路由器和计算机A、计算机B连接起来,确保物理连接正常。
2. 在路由器上进行基本配置,包括设置IP地址、子网掩码和默认网关。
这些配置将决定计算机A和计算机B之间的通信。
3. 在计算机A和计算机B上配置IP地址和子网掩码,确保它们与路由器的配置相匹配。
4. 进行网络连通性测试,确保计算机A和计算机B之间可以相互通信。
五、实验结果经过以上步骤的操作,我们成功地搭建了一个局域网,并实现了计算机A和计算机B之间的通信。
我们进行了一系列的网络连通性测试,包括ping命令和文件传输等,结果均显示两台计算机之间的通信正常。
六、实验总结通过本次实验,我们深入了解了计算机网络的基本原理,并通过实际操作掌握了网络的搭建和配置方法。
我们了解了IP地址、子网掩码和默认网关的作用,以及它们在网络通信中的重要性。
同时,我们也学会了如何进行网络连通性测试,以确保网络的正常运行。
在实验过程中,我们遇到了一些问题,如配置错误导致网络无法通信等。
通过仔细排查和调试,我们最终找到了问题的所在并解决了它们。
这些问题的出现使我们更加深入地理解了网络配置的重要性,并提醒我们在实际应用中要注意细节和正确性。
总的来说,本次实验使我们对计算机网络有了更深入的理解,并提高了我们的实际操作能力。
我们将继续学习和探索计算机网络的更多知识,为今后的工作和学习打下坚实的基础。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络原理实验报告——编程模拟GBN姓名:班级:学号:教师:1.实验目的运用各种编程语言实现基于Go-Back-N的可靠数据传输软件。
PS:这里使用的是JAVA语言2.实验意义通过本实验,使学生能够对可靠数据传输原理有进一步的理解和掌握。
3.实验背景Go-Back-N的有限状态机模型表示如下图所示:(a)(b)图为Go-Back-N的有限状态机模型(a)发送端(b)接受端4.实验步骤(1)选择合适的编程语言编程实现基于Go-Back-N的可靠数据传输软件。
(2)在实际网络环境或模拟不可靠网络环境中测试和验证自己的可靠数据传输软件。
5.实验环境(1)实验语言:JAVA(2)实验平台:Eclipse(3)引用库函数:.net库、随机(Random)库、计时库(Timer)6.类概览与描述(1)Sender类:继承于Thread(线程)类,模拟发送方的一切功能,主要功能函数有:A.Public void run()——启动函数,标识开始发送数据包B.Sender()——构造函数,分配并初始化窗口值C.Public void getack(in tack)——ACK接收函数,接收接收方返回的ACK并进行验证是否为期待的ACK值(若不是,则重发)D.Public void time()——定时器函数,初始化定时,计时并记录超时与否的状态(2)Receiver类:继承于Thread(线程)类,模拟接收方的一切功能,主要功能函数有:A.Public void run()——启动函数,标识开始等待并接收数据包B.Void Receive(int data,Sender s)——数据包接收函数,功能强大!主要包括:接收数据包,验证数据包,判断与丢弃数据包等C.Public void respond(int ack)——ACK发送函数,发送当前接收到的最后一次正确的数据包对应的ACK(3)Timers类:继承于TimerTask(计时器)类,具有自定义定时与超时提醒的功能,主要功能函数有:A.Public void run()——启动函数,标识开始计时(这里预设的是2秒的时间),超时后提醒并且停止计时器B.Public Timers()——构造函数,清0计时器,等待下一次启动(4)GBN类:继承于Thread(线程)类,是主函数类,具有本程序的核心功能,这里先作一部分简单介绍,主要函数功能有:A.Static void senddelay(int x) throwsInterruptedExceptionPublic Timers()——随机延迟函数,模拟数据包发送传输过程中的随机延迟,常用延迟值分别为:300ms, 750ms, 1200ms,3000ms等B.Public static void main(String[] args) throwsIOException, InterruptedException()——主函数,功能强大,主要包含以下几大方面:①开启发送端与接收端(包括计时器)②超时或者ACK不匹配等情况导致的发送方重新发送数据包③(第一次)发送当前窗口内的数据包④随机函数模拟数据包发送过程中的丢包情况⑤实时更新与显示当前窗口内的数据包情况⑥统计每一个数据包被发送过的次数(含重发)并最终显示出来7.代码展示与描述(一)Sender类import ;public class Sender extends Thread{public int windowsize=3; //发送方窗口长度设为3public String[] data={"data1","data2","data3","data4","data5","data6","data7"}; //模拟七个数据包public int sign[]={0,1,2,3,4,5,6}; //为7个数据包标号public int localack=-1; //保存最近收到的ACKpublic Timers litime=null; //定时器(这里定为2秒)public int switches=0; //超时标志,1为超时public int windowsign[]; //当前窗口内待发的数据分组的序号public int acksign=0;//为0表示收到正确ACK,为1表示收到错误的ACK,必须重发!public Sender(){windowsign=new int[windowsize];//给窗口分配指定大小的空间for(int i=0;i<3;i++)windowsign[i]=sign[i]; //窗口初始化时存放前3个序号}public void run(){"发送方开始发送分组数据!");}public void getack(int ack){"发送方收到了ACK,序号为"+ack+"并且开始加以确认!");if(ack!=localack+1){"经验证,这不是发送方正期待的ACK,立刻重发序号为"+(localack+1)+"的数据分组!");acksign=1;}else{localack=ack; //表示正确确认了ACKacksign=0;}}public void time(){switches=0; //标志初始化为0litime=new Timers();Timer limit=new Timer();limit.schedule(litime, 0,100);}}(二)Receiver类import ;public class Receiver extends Thread{public int lastdata;public Sender sender;public void run(Sender s){sender=s;"接收方开始接收分组数据!");}void receive(int data, Sender s){sender=s; //发送方的参数传递"接收方收到了序号为"+data+"的分组!");if(data!=0){if(data==lastdata+1){//数据包序号校验,若连续则是正确/所期待的"该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!");lastdata=data; //更新本地保存的数据包序号变量respond(lastdata); //回送该正确接收的数据包对应的ACK }else{"该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK!");respond(lastdata);//若不是所期待的数据包则丢弃并且重发上一次的ACK }}else{"该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!");lastdata=data;respond(lastdata); //首次接收数据包并且回送ACK }}void respond(int ack){ //回送指定序号的ACK if( //判断是否超时(2秒)ack=lastdata; //获取本场保存的数据包序号sender.getack(ack);}else{"计时超时!!(未丢包但是时间超过2秒)发送方准备重发序号为"+ack+"的数据分组!");sender.switches=1; //如果超时,设置超时状态并显示警告}}}(三)Timers类import ;public class Timers extends TimerTask {public int switches;public int limit;public void run(){if(limit<20) limit++; //计时2秒else {switches=-1;this.cancel();} //开关为-1表示超时,并且停止计时器}public Timers(){switches=0; //启动计时器时全部初始化limit=0;}}(四)GBN类import .*;import ;import java.io.*;public class GBN extends Thread{static void senddelay(int x) throws InterruptedException{if(x==1) {sleep(300); "发送数据分组时发生延迟:300毫秒!"); }else if(x==2) {sleep(750); "发送数据分组时发生延迟:750毫秒!");}else if(x==3) {sleep(1200);"发送数据分组时发生延迟:1200毫秒!");}else if(x==4) {sleep(3000);"发送数据分组时发生延迟:3000毫秒!");}else;}public static void main(String[] args) throws IOException, InterruptedException {Sender s=new Sender();Receiver re=new Receiver();s.start(); //发送端启动re.run(s); //接收端启动sleep(1000); //延迟处理int[] retimes=new int[7];//计算每个分组被发送的次数for(int i=0;i<7;i++) retimes[i]=0; //数据包顺次发送for(int i=0;i<=;i++){while(i>s.localack+1){ //尚有未确认的数据包,重发!"发送方开始重新发送序号为"+(s.localack+1)+"的数据分组");retimes[s.localack+1]++;int ran=new Random().nextInt(3);int randelay=new Random().nextInt(5);s.time();senddelay(randelay); //设置随机值,模拟数据传输延迟if(ran!=1) re.receive(s.localack+1,s);//设置随机值,模拟数据丢包过程else"序号为"+(s.localack+1)+"的分组在传给接收方途中发生了丢包!");}if(i!=;"发送方现在开始第一次发送序号为"+i+"的数据分组");retimes[i]++;if(i!=0){for(int k=0;k<3;k++){//表示至少成功发送并确认了一个数据分组s.windowsign[k]++;//这种情况下滑动窗口向前移动!}};"当前窗口内的分组情况为:");//显示当前窗口内数据包情况for(int p=0;p<3;p++){if(s.windowsign[p]<=6)"第"+p+"号窗口里面存放的是序号为"+s.windowsign[p]+"的马上待发送的数据分组!");else"第"+p+"号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!");};int ran=new Random().nextInt(3);int randelay=new Random().nextInt(5);s.time(); //计时开始(2秒时间)senddelay(randelay); //设置随机值,模拟数据传输延迟if(ran!=1) re.receive(s.sign[i],s);//设置随机值,模拟数据丢包过程else"序号为"+i+"的分组在传给接收方途中发生了丢包!");}};"以下是每个数据分组被发送过的次数的统计结果");for(int i=0;i<7;i++) //显示关于每个数据包发送次数的统计表"序号为"+i+"的数据分组被发送过的次数为:"+retimes[i]);System.exit(0);}}8.程序运行结果部分截图PS:随机选择了某次程序运行后结果显示的部分截图。