停止等待协议的实现
- 格式:doc
- 大小:198.50 KB
- 文档页数:16
实验停止等待协议分析与协议模拟实现一、实验目的1)了解停止等待协议的原理2)掌握协议分析的方法和过程3)通过程序模拟停止等待协议的工作过程二、实验要求1)根据示例,编写停止等待协议的模拟程序,演示停止等待协议的工作过程。
2)撰写实验报告。
三、协议概述如果链路是理想的传输信道,1)所传送的任何数据既不会出差错也不会丢失;2)如果不管发送方以多快的速率发送数据,接收方总是来得及收下,并及时上交主机。
如果存在这样的传输信道,数据链路层协议也是不需要的。
信道不会出错,而且接收方缓存的容量为无限大而永远不会溢出;或接收速率与发送速率绝对精确相等。
在上述两个假定的情况下,数据链路层当然就不需要任何协议就可以保证数据传输的正确。
这就是说,传输数据的信道是不可靠的(即不能保证所传的数据不产生差错),并且还需要对数据的发送端进行流量控制。
在大多数协议中,流量控制是一组过程,这组过程是用来告诉发送方在等待接收方的应答信号之前最多可以传送多少数据。
流量控制有两个要点:(1)数据流不能使接收方过载。
任何接收设备都有一个处理输入数据的速率限制,并且存储输入数据的存储器容量也是有限的。
接收设备必须在达到这些限制之前通知发送设备并且请求发送设备发送较少的数据帧或是暂停一会儿。
在使用输入数据之前,需要对数据进行校验和处理,因此,每个接收设备都有一块存储器,叫做缓冲区,用于存放未来得及处理的数据帧。
如果缓冲区将满,接收方也必须能够通知发送方暂停传输,直到接收方又能接收数据。
(2)应答。
随着数据帧的到来,接收方对他们进行应答,可以每收到一帧给一个应答,也可以一次对若干帧进行应答。
如果一个帧到达时已经被破坏,接收方发送一个否定应答帧(NAK)。
在数据链路层,差错控制主要指错误检测和重传方法。
在一个帧中出现任何一个错误,接收方就返回一个否定应答帧,出错的帧就被发送方重新传送。
这个过程被称作自动重复请求(ARQ)。
数据被重传的情况有三种:帧破坏、帧丢失和应答帧丢失。
停止等待协议的工作原理停止等待协议是计算机网络中常用的一种协议,用于解决数据在传输过程中可能出现的错误和丢失情况。
该协议的工作原理可以分为以下几个步骤:第一步:发送方数据分包和发送在停止等待协议中,发送方在发送数据时,将数据分成若干个数据包,每个数据包含有一个序列号和具体的数据内容。
发送方按照一定的时间间隔(如1秒)将数据包发送给接收方,并等待接收方的确认信息。
第二步:接收方接收和反馈信息接收方在接收到数据包后,将数据包中的内容提取出来,并进行校验,判断数据包是否完整和正确。
如果数据包正确,接收方向发送方发送一个确认信息,该确认信息包含有接收到的数据包的序列号。
发送方在接收到确认信息后继续发送下一个数据包。
如果数据包不正确,接收方丢弃该数据包,并向发送方发送一个拒绝信息。
第三步:发送方超时重传如果发送方发送了一个数据包,但在一定时间内没有收到接收方的确认信息,发送方认为该数据包丢失了,就向接收方重新发送该数据包。
在重新发送该数据包时,发送方会将该数据包的序列号标注为“重传”,接收方在接收到“重传”数据包的确认信息后,也会将“重传”的标识返回给发送方。
第四步:接收方拒绝重传如果接收方在接收到数据包时发现数据包不正确,就会向发送方发送一个拒绝信息,该拒绝信息包含有接收方让发送方重新发送的数据包的序列号。
发送方在接收到拒绝信息后,会将被拒绝的数据包重新发送给接收方,接收方在接收到这些数据包时,不会将这些数据包的确认信息返回给发送方。
这样做的目的是为了避免数据包的重复发送。
综上所述,停止等待协议是一种解决数据丢失和错误的常见协议。
该协议的工作原理是将数据分成若干个数据包,按照一定的时间间隔发送给接收方,并等待接收方的确认信息。
如果数据包在传输过程中出现错误或丢失,发送方会进行超时重传,接收方会向发送方发送拒绝信息。
通过这些步骤,可以确保数据的安全性和完整性。
停止等待协议停止等待协议(Stop-and-Wait Protocol)是一种简单且常用的协议,用于在数据传输过程中确保数据的可靠性。
这种协议在通信的发送和接收过程中,必须等待对方的确认,并且只有在收到确认之后才能发送下一个数据包。
停止等待协议的基本原理非常简单。
当发送方准备好发送数据时,它先发送一个数据包给接收方。
接收方则等待接收数据,并且在成功接收到数据后,发送一个确认消息给发送方,告诉发送方数据已经接收成功。
发送方接收到确认消息后,就会发送下一个数据包。
如果接收方没有成功接收数据,或者发送方没有成功接收确认消息,那么发送方将重新发送数据包。
在停止等待协议中,数据包的发送和接收都是按照序列号来进行的。
发送方会给每个数据包分配一个唯一的序列号,并且在数据包中加入这个序列号,以便接收方能够准确地识别是哪个数据包。
接收方在接收到数据包之后,会将确认消息中包含这个序列号,以使发送方能够知道哪个数据包已经成功接收。
如果接收方在一定的时间内没有收到正确的序列号的数据包,它会发送一个特殊的确认消息给发送方,告诉发送方需要重新发送这个数据包。
停止等待协议的优点是简单易懂,并且能够确保数据的可靠传输。
它适用于小规模的数据传输,对于大规模的数据传输则效率较低。
这是因为在停止等待协议中,发送方必须等待接收方发送确认消息才能继续发送下一个数据包。
如果网络延迟较高或者丢包率较高,发送方的发送速度将受到很大限制,从而导致传输效率低下。
为了提高传输效率,停止等待协议可以进行一些改进。
一种常见的改进是引入滑动窗口机制。
滑动窗口可以同时发送多个数据包,并且不需要等待接收方发送确认消息。
接收方只需要在收到数据包后按序发送确认消息即可。
这种机制能够充分利用网络带宽,提高传输效率。
总而言之,停止等待协议是一种简单而常用的协议,用于在数据传输过程中确保数据的可靠性。
虽然效率较低,但它的原理简单易懂,适用于小规模的数据传输。
通过引入滑动窗口机制,可以提高传输效率。
实验停止等待协议分析与协议模拟实现一、协议介绍停止等待协议是一种简单的可靠数据传输协议,用于在不可靠信道上进行数据传输。
该协议的基本原理是发送方发送一帧后,等待接收方的确认帧,接收方收到帧后发送确认帧,发送方收到确认帧后才发送下一帧。
本实验旨在分析停止等待协议的性能和实现一个简单的协议模拟。
二、实验步骤1. 确定实验环境- 操作系统:Windows 10- 编程语言:Python 3.9- 开发环境:PyCharm2. 实验准备- 安装Python 3.9和PyCharm- 创建一个新的PyCharm项目,命名为"StopAndWaitProtocolSimulation"3. 实现停止等待协议- 创建一个名为"sender.py"的Python文件,实现发送方的逻辑。
- 创建一个名为"receiver.py"的Python文件,实现接收方的逻辑。
- 在发送方和接收方的代码中,使用Socket编程实现数据的发送和接收。
- 在发送方和接收方的代码中,实现停止等待协议的逻辑,包括发送帧、接收帧、发送确认帧等操作。
4. 编写测试代码- 创建一个名为"test.py"的Python文件,用于测试停止等待协议的性能。
- 在测试代码中,模拟发送方发送多个帧,并统计发送时间、接收时间、丢包率等指标。
- 在测试代码中,输出测试结果并保存到文件中,用于后续分析。
5. 运行实验- 在PyCharm中,分别运行"sender.py"和"receiver.py"。
- 在PyCharm中,运行"test.py",观察测试结果。
6. 分析实验结果- 根据测试结果,分析停止等待协议的性能,包括吞吐量、延迟、丢包率等指标。
- 根据测试结果,优化停止等待协议的实现,提高性能和可靠性。
三、注意事项1. 确保实验环境的稳定性和可靠性,避免其他应用程序的干扰。
实验停止等待协议分析与协议模拟实现停止等待协议分析与协议模拟实现一、引言停止等待协议是一种简单且常用的协议,用于在数据通信中实现可靠的传输。
本文将对停止等待协议进行详细分析,并进行协议模拟实现。
二、协议分析1. 协议描述停止等待协议是一种基于确认的可靠传输协议。
发送方将数据分割为固定大小的数据包,并逐个发送给接收方。
接收方在成功接收一个数据包后,发送一个确认消息给发送方。
如果发送方在一定时间内未收到确认消息,则认为数据包丢失,需要重新发送。
2. 协议流程发送方:- 将数据分割为固定大小的数据包。
- 发送数据包给接收方。
- 等待接收方发送确认消息。
- 如果在超时时间内未收到确认消息,则重新发送数据包。
接收方:- 接收数据包。
- 发送确认消息给发送方。
- 如果接收到的数据包已经接收过,则丢弃。
3. 协议特点停止等待协议具有以下特点:- 简单易实现:协议的流程简单明了,易于实现。
- 带宽浪费:发送方在等待确认消息期间无法发送新的数据包,导致带宽浪费。
- 无序接收:接收方可能会因为网络延迟或丢包而导致数据包无序接收。
三、协议模拟实现为了更好地理解停止等待协议的工作原理,我们将进行协议模拟实现。
以下是实现的步骤:1. 环境准备- 安装模拟器软件:我们将使用Python编程语言来实现停止等待协议的模拟。
请确保您的计算机上已经安装了Python环境。
- 导入必要的库:在Python程序中,我们需要导入socket库来进行网络通信。
2. 发送方实现- 创建发送方套接字:使用socket库创建发送方套接字,并指定通信协议和端口号。
- 读取待发送的文件:从本地文件系统中读取待发送的文件,并将文件内容分割为固定大小的数据包。
- 发送数据包:使用发送方套接字将数据包发送给接收方。
- 等待确认消息:设置超时时间,等待接收方发送确认消息。
- 处理超时:如果在超时时间内未收到确认消息,则重新发送数据包。
3. 接收方实现- 创建接收方套接字:使用socket库创建接收方套接字,并指定通信协议和端口号。
一、协议名称停止等待流控协议二、协议目的为确保数据链路层中数据的可靠传输,减少数据丢失和错误,提高网络传输效率,特制定本协议。
三、协议适用范围本协议适用于所有采用停止等待流控协议的数据链路层通信。
四、协议内容1. 基本原理停止等待流控协议是一种基于帧的数据链路层流量控制协议。
其基本原理为:发送方发送一帧数据后,等待接收方发送确认帧(ACK),确认帧到达后,发送方再发送下一帧数据。
若在预定时间内未收到确认帧,则发送方重传该帧。
2. 确认与否认(1)确认帧(ACK):接收方在正确接收一帧数据后,发送确认帧给发送方,表示已成功接收该帧。
(2)否认帧(NAK):接收方在接收到错误或丢失的帧时,发送否认帧给发送方,要求发送方重传该帧。
3. 超时重传(1)超时计时器:发送方在发送一帧数据后,启动超时计时器。
若在预定时间内未收到确认帧,则认为该帧丢失,发送方将重传该帧。
(2)超时重传次数:发送方设置超时重传次数,当达到该次数时,发送方停止重传,并报告错误。
4. 信道利用率与信道吞吐率(1)信道利用率:指实际传输的数据量与总传输量的比值。
停止等待流控协议的信道利用率较低,因为发送方在发送一帧数据后需要等待确认帧,导致信道利用率降低。
(2)信道吞吐率:指单位时间内通过信道的最大数据量。
停止等待流控协议的信道吞吐率较低,但能够保证数据的可靠传输。
5. 序列号为防止接收方处理重复数据,发送方和接收方对每帧数据分配一个序列号。
接收方在接收数据时,根据序列号判断数据是否重复。
五、协议实施与维护1. 发送方与接收方应遵循本协议,确保数据链路层通信的可靠性。
2. 发送方和接收方应定期检查协议执行情况,发现异常及时处理。
3. 发送方和接收方应定期对协议进行维护,确保协议的稳定运行。
六、协议终止当数据链路层通信结束或双方协商一致时,可终止本协议。
七、协议解释本协议的解释权归双方共同所有。
八、协议生效本协议自双方签字盖章之日起生效。
实验停止等待协议分析与协议模拟实现协议名称:停止等待协议分析与协议模拟实现一、引言停止等待协议是一种简单的协议,用于数据传输过程中的错误控制。
本协议旨在通过分析停止等待协议的原理、特点和效率,以及通过协议模拟实现来更好地理解该协议的工作原理。
二、协议分析1. 原理停止等待协议的原理是发送方发送数据后等待确认,只有在收到确认后才发送下一个数据。
接收方在收到数据后发送确认,若数据出错则发送否定确认,要求发送方重新发送该数据。
2. 特点停止等待协议的特点包括:- 简单易实现:该协议的实现相对简单,适用于对可靠性要求不高的数据传输。
- 效率低下:发送方必须等待确认才能发送下一个数据,导致传输效率较低。
- 无序传输:发送方发送的数据包在网络中可能以不同的顺序到达接收方。
3. 效率分析停止等待协议的效率主要受以下因素影响:- 传输延迟:发送方等待确认的时间会增加传输延迟。
- 信道利用率:由于发送方必须等待确认,信道可能处于空闲状态,造成信道利用率低。
- 重传次数:若数据出错,发送方需要重传,增加了传输时间和信道占用。
三、协议模拟实现为更好地理解停止等待协议的工作原理,可以进行协议模拟实现。
以下是一个简单的协议模拟实现的示例:1. 发送方实现:发送方需要完成以下步骤:- 将待发送的数据分割成适当大小的数据包。
- 发送数据包,并启动计时器。
- 等待接收方的确认。
- 若接收到确认,则停止计时器,发送下一个数据包。
- 若未接收到确认或接收到否定确认,则重新发送当前数据包。
2. 接收方实现:接收方需要完成以下步骤:- 接收数据包,并发送确认。
- 若接收到的数据包有误,则发送否定确认,要求发送方重新发送该数据包。
- 若接收到的数据包正确,则将数据传递给上层应用。
四、实验结果与分析通过协议模拟实现,可以观察到以下结果:- 传输延迟:发送方等待确认的时间会增加传输延迟,尤其是在网络负载较高的情况下。
- 信道利用率:由于发送方必须等待确认,信道可能处于空闲状态,造成信道利用率低。
停止等待协议
停止等待协议(Stop-and-Wait Protocol)是一种基本
的数据传输协议,它被广泛应用于串行通信领域中。
在停止等待协议中,每次只能发送一帧数据,并需要等待接收方的确认信息后才能发送下一帧数据,所以它也被称为“一帧一确认协议”。
停止等待协议的工作流程如下:发送方发送一帧数据后,等待接收方发送确认信息。
如果在规定的时间内未收到确认信息,发送方就会重新发送这一帧数据。
在接收方收到一帧数据后,如果数据正确,就会发送确认信息,否则就拒绝这一帧数据,发送方会在一段时间后重新发送。
停止等待协议的优点是简单可靠,可以在低速率的链路
上工作,对应用层和物理层的接口比较少。
但是,它的缺点也很明显,即效率低下。
因为每发送完一帧都要等待接收方的确认,这样就会浪费很多时间。
特别是在高速率的链路上,这种协议的效率就更加低下。
为了解决停止等待协议效率低下的问题,人们发明了许
多改进版本,其中最重要的是连续传输协议(Go-Back-N Protocol)和选择重传协议(Selective Repeat Protocol)。
它们使用窗口技术,允许发送方连续发送多个数据帧,而不必等待接收方的确认信息,从而提高了传输效率。
总之,停止等待协议是基本的数据传输协议,虽然效率
低下,但是非常简单、可靠,对于低速率的链路和简单的应用场景仍然有很大的应用价值。
停止等待协议一、解释停止等待协议(stop-and-wait)是最简单但也是最基础的数据链路层协议。
二、过程1、无差错情况、超时重传的情况分别如下图所示:2、确认丢失、确认迟到的情况分别如下图所示:三、要点只有收到序号正确的确认帧ACKn后,才更新发送状态变量V(S)一次,并发送新的数据帧。
接收端接收到数据帧时,就要将发送序号N(S) 与本地的接收状态变量V(R) 相比较。
若二者相等就表明是新的数据帧,就收下,并发送确认。
否则为重复帧,就必须丢弃。
但这时仍须向发送端发送确认帧ACKn,而接收状态变量V(R) 和确认序号n 都不变。
连续出现相同发送序号的数据帧,表明发送端进行了超时重传。
连续出现相同序号的确认帧,表明接收端收到了重复帧。
发送端在发送完数据帧时,必须在其发送缓存中暂时保留这个数据帧的副本。
这样才能在出差错时进行重传。
只有确认对方已经收到这个数据帧时,才可以清除这个副本。
实用的CRC 检验器都是用硬件完成的。
CRC 检验器能够自动丢弃检测到的出错帧。
因此所谓的“丢弃出错帧”,对上层软件或用户来说都是感觉不到的。
发送端对出错的数据帧进行重传是自动进行的,因而这种差错控制体制常简称为ARQ(Automatic Repeat reQuest),直译是自动重传请求,但意思是自动请求重传。
四、注意事项1、在发送完一个分组后,必须暂时保留已发送的分组的副本。
2、分组和确认分组都必须进行编号。
3、超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。
五、ARQ 的优缺点优点:比较简单。
缺点:通信信道的利用率不高,也就是说,信道还远远没有被数据比特填满。
如下图所示:其公式如下:D D AT U T RTT T =++六、定量分析设tf 是一个数据帧的发送时间,且数据帧的长度是固定不变的。
显然,数据帧的发送时间tf 是数据帧的长度 lf (bit)与数据的发送速率 C (bit/s)之比,即tf = lf /C = lf /C (s)发送时间tf 也就是数据帧的发送时延。
实验停止等待协议分析与协议模拟实现一、实验目的和任务1.掌握停止等待协议的原理及分析过程包括使用状态转移图进行协议的分析。
2.在计算机上编程模拟停止等待协议的工作过程并实现文件的端到端传输。
3.能够在文件的传输过程中表现出协议运行所遇到的各种状况,如丢包,差错控制等二、分析与设计1.设计任务分析:停止等待协议是数据链路层的几个协议中最简单的协议,是具有最简单流量控制的数据链路层协议,是数据链路层各种协议的基础。
实验是基于winsock编程,是visual C++6.0 win32控制台运用程序实现的。
它采用客户机/服务器(C/S)模型,即发送数据的一端为客户端,接收数据的一端为服务器端。
停止等待协议就是通过双方的收发数据而达到相互通信的目的。
本实验通过编程模拟实现停止等待协议,随机的发送文件,通过服务器的的接受结果和客户端的接受结果显示理解停止等待协议的原理,掌握其应用。
2. 协议分析假定 1:链路是理想的传输信道,所传送的任何数据既不会出差错也不会丢失。
假定 2:不管发方以多快的速率发送数据,收方总是来得及收下,并及时上交主机。
这个假定就相当于认为:接收端向主机交付数据的速率永远不会低于发送端发送数据的速率。
如果存在这样的传输信道,数据链路层协议也是不需要的。
信道不会出错,而且接收方缓存的容量为无限大而永远不会溢出;或接收速率与发送速率绝对精确相等。
在上述两个假定的情况下,数据链路层当然就不需要任何协议就可以保证数据传输的正确。
这就是说,传输数据的信道是不可靠的(即不能保证所传的数据不产生差错),并且还需要对数据的发送端进行流量控制。
现在不能保证接收端向主机交付数据的速率永远不低于发送端发送数据的速率。
由收方控制发方的数据流收方每接受到发方一帧后,回复确认帧,让发方继续发送下一帧,并且收方将数据帧交给上层软件识别,出现错误就将帧丢掉.在大多数协议中,流量控制是一组过程,这组过程是用来告诉发送方在等待接收方的应答信号之前最多可以传送多少数据。
福建农林大学计算机与信息学院课程设计报告课程名称:计算机网络课程设计题目:停止等待协议的实现姓名:系:计算机专业:计算机科学与技术年级:学号:指导教师:职称:2011 年6 月10 日福建农林大学计算机与信息学院课程设计报告结果评定目录1、课程设计的目的和任务 (4)2、课程设计的要求 (4)3、课程设计的分析与设计 (4)3.1 设计任务分析 (4)3.2 设计方案论证 (5)3.3 详细设计 (5)3、系统实施 (7)4、总结与体会 (9)5、参考文献 (9)附录:源代码 (10)停止等待协议的实现1、课程设计的目的和任务《计算机网络》课程讲述计算机网络的原理,尤其是TCP/IP协议栈的原理和应用,是一门理论性、应用性、实践性都比较强的课程。
而此次的课程设计是在学习完《计算机网络》课程后进行的一次全面的综合能力的检验。
计算机网络的课程设计是从原理和实践的角度,在计算机上编程模拟实现计算机网络的基本协议。
通过本次课程设计,使我们对计算机网络的原理能有更加深刻的认识和理解,同时进一步锻炼自己的动手能力。
在这次课程设计中,我设计的的是通过编译语言,编程模拟实现数据链路层协议中的停止等协议。
2、课程设计的要求通过双方的收发数据而达到相互通信的目的。
3、课程设计的分析与设计3.1 设计任务分析停止等待协议是数据链路层的几个协议中最简单的协议,是具有最简单流量控制的数据链路层协议,是数据链路层各种协议的基础。
此课程设计是基于winsock 编程,是在VC++6.0的MFC界面下和控制台下实现的。
它采用客户机/服务器(C/S)模型,即发送数据的一端为客户端,接收数据的一端为服务器端。
停止等待协议就是通过双方的收发数据而达到相互通信的目的。
本课程设计通过编程模拟实现停止等待协议,随机的发送数据,通过服务器的的接受结果和客户端的接受结果显示理解停止等待协议的原理,掌握其应用。
3.2 设计方案论证当收方收到一个正确的数据帧后,便会向发方发送一个确认帧ACK,表示发送的数据正确接收。
当发方收到确认帧后才能发送一个新的数据帧,这样就实现了接收方对发送方的流量控制。
由于通信线路质量各方面的影响,数据帧从发送方到接收方传输的过程中可能会出现差错。
为了保证数据的正确性和完整性,接收方在收到数据后,会用一定的方法对接收到的数据进行差错检验,所以接收方很容易检测出收到的数据帧是否出现差错。
当接收方发现收到的数据出现差错时,就会向发送方发送一个否认帧NAK,表示对方发送的数据错误。
发送方会根据接收方发来的信息做出相应的操作。
采用这样的有效的检错机制,数据链路层可以对上面的网络层提供了可靠的传输的服务。
3.3 详细设计停止等待协议的算法如下:为了对停止等待算法有一个完整而准确的理解,下面给出此协议的算法。
具有最简单流量控制的数据链路层协议假定 1:链路是理想的传输信道,所传送的任何数据既不会出差错也不会丢失。
假定 2:不管发方以多快的速率发送数据,收方总是来得及收下,并及时上交主机。
这个假定就相当于认为:接收端向主机交付数据的速率永远不会低于发送端发送数据的速率。
现在去掉上述的第二个假定。
但是,仍然保留第一个假定,即主机 A 向主机 B 传输数据的信道仍然是无差错的理想信道。
然而现在不能保证接收端向主机交付数据的速率永远不低于发送端发送数据的速率。
由收方控制发方的数据流,乃是计算机网络中流量控制的一个基本方法。
简单解释:收方每接受到发方一帧后,回复确认帧,让发方继续发送下一帧,并且收方将数据帧交给上层软件识别,出现错误就将帧丢掉.在接收结点:(1) 等待。
(2) 若收到由发送结点发过来的数据帧,则将其放入数据链路层的接收缓存。
(3) 将接收缓存中的数据帧上交主机。
(4) 向发送结点发一信息,表示数据帧已经上交给主机。
(5) 转到(1)在发送结点:(1) 从主机取一个数据帧。
(2) 将数据帧送到数据链路层的发送缓存。
(3) 将发送缓存中的数据帧发送出去。
(4) 等待。
(5) 若收到由接收结点发过来的信息(此信息的格式与内容可由双方事先商定好),则从主机取一个新的数据帧,然后转到(2)。
因此,在设计编程模拟实现停止等待协议时,因具体考虑有关帧的一些知识。
帧的结构:帧的类型帧的序号帧的确认号数据信息(可变)校验位帧的结构帧的类型(frame_kind)分为数据帧(data_frame),确认帧(ack_frame)和否认帧(nak_frame)三种。
发送方向接收方发送数据,是以帧为单位的,就称为数据帧。
它的数据信息是可变的,但最佳的帧长为1500个字节。
接收方接收数据后,会对收到的数据帧进行差错校验,当数据正确时,就会向发送方发送一个确认帧,以表示发送方发送的数据正确接收了,反之,就会向发送方发送一个否认帧,并把这个出错的数据帧丢弃。
帧的序号(seq):由于采用的是单工通信,帧的结构中用的控制域也很少,这个域会随着帧类型的不同而不同:对数据帧来说:序号(seq)表示的是发送端发送的帧的序号。
对确认帧来说:序号(seq)表示的是接收方希望接收到的帧的序号,它表示seq 以前的各帧都已经正确接收,希望收到序号为seq的帧。
对否认帧来说:序号(seq)也是表示接收方希望收到的数据帧的序号,表示接收方已经收到序号为seq的帧,但是这个帧出现错误,希望发送方重新发送该数据帧。
停止等待协议采用的是单工通信,接收端向发送端发送的确认帧和否认帧中没有数据信息,它们的数据域为空。
由于是单工通信,发送方只发送数据,所以发送方帧的“帧的确认号”中并没有包含任何的确认信息。
3、系统实施此次课程设计通过C++编程基本上模拟实现了数据链路层中的停止等待协议,但是程序中存在一定的不足,没有能够完全的体现停止等待协议的的工作原理。
在此课程设计中,数据的发送是随机生成的。
运行结果截图如下所示:服务器端的运行截图:客户端的运行截图:结果如下所示:客户端:服务器端:4、总结与体会经过这几天的课程设计,通过查阅相关的资料和以前的学习以及和同学之间的交流最终能够较成功的实现该课程设计。
停止等待协议是数据链路层的一个重要协议,也是计算机网络中的一个重要协议。
在进行课程设计时我遇到了不少的困难,通过同学的帮助和查阅相关的资料,最终解决了问题,模拟实现了停止等待协议。
在设计过程中,刚开始时,没有能够实现客户端和服务器的连接,最终导致客户端发送数据的失败,从而导致服务器端的接收失败。
经过查阅相关的资料,找到了错误的所在,并实现了停止等待协议的功能。
此外,此次课程设计中的一个难点就是客户端发送数据采用的是随机函数rand()产生随机发送的数据。
5、参考文献谢希仁《计算机网络》电子工业出版社附录:源代码发送端:(client.cpp)#include <stdio.h>#include <winsock2.h>#include <time.h>#pragma comment(lib,"Ws2_32.lib")#define SERVER_PORT 7300 //侦听端口客户端向服务器传送的结构:struct BAG{ char packet;};void main(int argc, char *argv[]){WORD wVersionRequested;WSADATA wsaData;int ret,i,ra,data=0;SOCKET sClient,sListen;struct sockaddr_in saServer;//地址信息struct BAG bag;char *ptr = (char *)&bag;BOOL fSuccess = TRUE;WinSock初始化:wVersionRequested = MAKEWORD(2, 2);//希望使用的WinSock DLL的版本ret = WSAStartup( wVersionRequested, &wsaData );if (ret != 0){printf("WSAStartup() failed!\n");return;}确认WinSock DLL支持版本2.2:if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE( wsaData.wVersion ) != 2 ){WSACleanup();printf("Invalid Winsock version!\n");return;}创建socket,使用TCP协议:sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sClient == INVALID_SOCKET){WSACleanup();printf("socket() failed!\n");return;}构建服务器地址信息:saServer.sin_family = AF_INET;//地址家族saServer.sin_port = htons(SERVER_PORT);//转化为网络字节序连接服务器:ret = connect(sClient, (struct sockaddr *)&saServer,sizeof(saServer));if (ret == SOCKET_ERROR){printf("connect() successed!\n");closesocket(sClient);//关闭套接字WSACleanup();return;}按照预定协议,客户端将发送一个数字:for(i=97;i<=104;i++){ra = rand()%11;if(ra%5 == 1) data+=i;else data=i;bag.packet=data;ret = send(sClient, (char *)&bag, sizeof(bag), 0);ret = recv(sListen, ptr, sizeof(bag), 0);if(bag.packet!=i){i--;printf("send()successed!\n");continue;}else if(bag.packet==i)printf("packet %d has been sent!\n",i+1);}closesocket(sClient); WSACleanup();}接受端(server.cpp):#include <stdio.h>#include <winsock2.h>#include <windows.h>#include <time.h>#pragma comment(lib,"Ws2_32.lib")#define SERVER_PORT 7300 //侦听端口客户端向服务器传送的结构:struct BAG{ char packet;};void main(){WORD wVersionRequested;WSADATA wsaData;int ret,nLeft,length;SOCKET sListen, sServer; //侦听套接字,连接套接字struct sockaddr_in saServer, saClient;//地址信息struct BAG bag;char *ptr,*pp;WinSock初始化:wVersionRequested = MAKEWORD(2, 2);//希望使用的WinSock DLL的版本ret = WSAStartup(wVersionRequested, &wsaData);if (ret != 0){printf("WSAStartup() failed!\n");return;}确认WinSock DLL支持版本2.2:if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE( wsaData.wVersion ) != 2 ){WSACleanup();printf("Invalid Winsock version!\n");return;}创建Socket,使用TCP协议:sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sListen == INVALID_SOCKET){WSACleanup();printf("socket() failed!\n");return;}构建本地地址信息:saServer.sin_family = AF_INET;//地址家族saServer.sin_port = htons(SERVER_PORT);//转化为网络字节序saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//使用INADDR_ANY 指示任意地址绑定:ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));if (ret == SOCKET_ERROR){printf("bind() failed! code:%d\n", WSAGetLastError());closesocket(sListen);//关闭套接字WSACleanup();return;}侦听连接请求:ret = listen(sListen, 5);if (ret == SOCKET_ERROR){printf("listen() failed! code:%d\n", WSAGetLastError());closesocket(sListen);//关闭套接字WSACleanup();return;}printf("Waiting for client connecting!\n");printf("tips : Ctrl+c to quit!\n");阻塞等待接受客户端连接:length = sizeof(saClient);sServer = accept(sListen, (struct sockaddr *)&saClient, &length); if(sServer == INVALID_SOCKET){ printf("accept() failed! code:%d\n", WSAGetLastError());closesocket(sListen);//关闭套接字WSACleanup();return;}printf("Accepted client: %s:%d\n",inet_ntoa(saClient.sin_addr), ntohs(saClient.sin_port));按照预定协议,客户端将发来一个信息:nLeft = sizeof(bag);ptr = (char *)&bag;for(int i=97;i<=104;i++){接收数据:pp=ptr;ret = recv(sServer, ptr, nLeft, 0);if(ret == SOCKET_ERROR){ printf("recv() failed!\n");break;}else if(bag.packet!=i){printf("wrong packet!\n");i--;ret = send(sServer, pp, nLeft, 0);continue;}else if(bag.packet==i){printf("recv() %c successd!\n",i);ret = send(sServer, ptr, nLeft, 0);}客户端已经关闭连接:if(ret == 0){printf("client has closed the connection!\n");break;}}closesocket(sListen);//关闭套接字closesocket(sServer);WSACleanup();。