停止等待协议的实现
- 格式:doc
- 大小:151.50 KB
- 文档页数:16
停止等待协议的算法为了对停止等待算法有一个完整而准确的理解,下面给出此协议的算法。
发送方:(1)取一个待发送的数据帧。
(2)V(S)←0。
/* 发送状态变量(帧序号)初始化 */(3)N(S)←V(S);/* 将发送状态变量的数值写入发送序号 */ 将数据帧送交发送缓存。
(4)将发送缓存中的数据帧发送出去。
(5)设置超时计时器。
/* 选择适当的超时重传时间t out */(6)等待。
/* 等待以下3个事件中最现出现的一个 */(7)若收到确认帧(ACK),则:取一个新的待发送数据帧;V(S)←[1- V(S)];/* 更新发送状态变量,序号交替为0和1 */转到(3)。
/* 准备发送下一数据帧 */(8)若收到否认帧(NAK),则转到(4)。
/*重传数据帧 */(9)若超时计时器时间到,则转到(4)。
/*重传数据帧 */接收方:(1) V(R)←0。
/* 接收状态变量初始化,欲接收的帧序号*/(2)等待。
(3)收到一个数据帧并检错;若检测出帧出错,转到(8)。
(4)若N(S) ≠ V(R),则:/* 帧无错,则检测帧序号是否正确 */ 丢弃此数据帧;/* 序号有误,表示重复帧 */转到(7)。
(5)将收到的数据帧中的数据部分送交高层。
/* 序号正确,认可数据帧 */(6)V(R)←[1- V(R)]。
/* 更新接收状态变量,准备接收下一数据帧 */(7)N(R)←V(R);/* 将发送状态变量的数值写入接收序号 */ 发送确认帧(ACK),并转到(2)。
/* 请求发送下一数据帧 */(8)发送否认帧(ACK),并转到(2)。
/* 请求重传该数据帧 */。
实验停止等待协议分析与协议模拟实现一、实验目的1)了解停止等待协议的原理2)掌握协议分析的方法和过程3)通过程序模拟停止等待协议的工作过程二、实验要求1)根据示例,编写停止等待协议的模拟程序,演示停止等待协议的工作过程。
2)撰写实验报告。
三、协议概述如果链路是理想的传输信道,1)所传送的任何数据既不会出差错也不会丢失;2)如果不管发送方以多快的速率发送数据,接收方总是来得及收下,并及时上交主机。
如果存在这样的传输信道,数据链路层协议也是不需要的。
信道不会出错,而且接收方缓存的容量为无限大而永远不会溢出;或接收速率与发送速率绝对精确相等。
在上述两个假定的情况下,数据链路层当然就不需要任何协议就可以保证数据传输的正确。
这就是说,传输数据的信道是不可靠的(即不能保证所传的数据不产生差错),并且还需要对数据的发送端进行流量控制。
在大多数协议中,流量控制是一组过程,这组过程是用来告诉发送方在等待接收方的应答信号之前最多可以传送多少数据。
流量控制有两个要点:(1)数据流不能使接收方过载。
任何接收设备都有一个处理输入数据的速率限制,并且存储输入数据的存储器容量也是有限的。
接收设备必须在达到这些限制之前通知发送设备并且请求发送设备发送较少的数据帧或是暂停一会儿。
在使用输入数据之前,需要对数据进行校验和处理,因此,每个接收设备都有一块存储器,叫做缓冲区,用于存放未来得及处理的数据帧。
如果缓冲区将满,接收方也必须能够通知发送方暂停传输,直到接收方又能接收数据。
(2)应答。
随着数据帧的到来,接收方对他们进行应答,可以每收到一帧给一个应答,也可以一次对若干帧进行应答。
如果一个帧到达时已经被破坏,接收方发送一个否定应答帧(NAK)。
在数据链路层,差错控制主要指错误检测和重传方法。
在一个帧中出现任何一个错误,接收方就返回一个否定应答帧,出错的帧就被发送方重新传送。
这个过程被称作自动重复请求(ARQ)。
数据被重传的情况有三种:帧破坏、帧丢失和应答帧丢失。
停止等待协议的工作原理停止等待协议是计算机网络中常用的一种协议,用于解决数据在传输过程中可能出现的错误和丢失情况。
该协议的工作原理可以分为以下几个步骤:第一步:发送方数据分包和发送在停止等待协议中,发送方在发送数据时,将数据分成若干个数据包,每个数据包含有一个序列号和具体的数据内容。
发送方按照一定的时间间隔(如1秒)将数据包发送给接收方,并等待接收方的确认信息。
第二步:接收方接收和反馈信息接收方在接收到数据包后,将数据包中的内容提取出来,并进行校验,判断数据包是否完整和正确。
如果数据包正确,接收方向发送方发送一个确认信息,该确认信息包含有接收到的数据包的序列号。
发送方在接收到确认信息后继续发送下一个数据包。
如果数据包不正确,接收方丢弃该数据包,并向发送方发送一个拒绝信息。
第三步:发送方超时重传如果发送方发送了一个数据包,但在一定时间内没有收到接收方的确认信息,发送方认为该数据包丢失了,就向接收方重新发送该数据包。
在重新发送该数据包时,发送方会将该数据包的序列号标注为“重传”,接收方在接收到“重传”数据包的确认信息后,也会将“重传”的标识返回给发送方。
第四步:接收方拒绝重传如果接收方在接收到数据包时发现数据包不正确,就会向发送方发送一个拒绝信息,该拒绝信息包含有接收方让发送方重新发送的数据包的序列号。
发送方在接收到拒绝信息后,会将被拒绝的数据包重新发送给接收方,接收方在接收到这些数据包时,不会将这些数据包的确认信息返回给发送方。
这样做的目的是为了避免数据包的重复发送。
综上所述,停止等待协议是一种解决数据丢失和错误的常见协议。
该协议的工作原理是将数据分成若干个数据包,按照一定的时间间隔发送给接收方,并等待接收方的确认信息。
如果数据包在传输过程中出现错误或丢失,发送方会进行超时重传,接收方会向发送方发送拒绝信息。
通过这些步骤,可以确保数据的安全性和完整性。
停止等待协议停止等待协议(Stop-and-Wait Protocol)是一种简单且常用的协议,用于在数据传输过程中确保数据的可靠性。
这种协议在通信的发送和接收过程中,必须等待对方的确认,并且只有在收到确认之后才能发送下一个数据包。
停止等待协议的基本原理非常简单。
当发送方准备好发送数据时,它先发送一个数据包给接收方。
接收方则等待接收数据,并且在成功接收到数据后,发送一个确认消息给发送方,告诉发送方数据已经接收成功。
发送方接收到确认消息后,就会发送下一个数据包。
如果接收方没有成功接收数据,或者发送方没有成功接收确认消息,那么发送方将重新发送数据包。
在停止等待协议中,数据包的发送和接收都是按照序列号来进行的。
发送方会给每个数据包分配一个唯一的序列号,并且在数据包中加入这个序列号,以便接收方能够准确地识别是哪个数据包。
接收方在接收到数据包之后,会将确认消息中包含这个序列号,以使发送方能够知道哪个数据包已经成功接收。
如果接收方在一定的时间内没有收到正确的序列号的数据包,它会发送一个特殊的确认消息给发送方,告诉发送方需要重新发送这个数据包。
停止等待协议的优点是简单易懂,并且能够确保数据的可靠传输。
它适用于小规模的数据传输,对于大规模的数据传输则效率较低。
这是因为在停止等待协议中,发送方必须等待接收方发送确认消息才能继续发送下一个数据包。
如果网络延迟较高或者丢包率较高,发送方的发送速度将受到很大限制,从而导致传输效率低下。
为了提高传输效率,停止等待协议可以进行一些改进。
一种常见的改进是引入滑动窗口机制。
滑动窗口可以同时发送多个数据包,并且不需要等待接收方发送确认消息。
接收方只需要在收到数据包后按序发送确认消息即可。
这种机制能够充分利用网络带宽,提高传输效率。
总而言之,停止等待协议是一种简单而常用的协议,用于在数据传输过程中确保数据的可靠性。
虽然效率较低,但它的原理简单易懂,适用于小规模的数据传输。
通过引入滑动窗口机制,可以提高传输效率。
简述停等协议的工作过程停等协议(Ethernet)是一种在数据通信中控制访问共享媒体的协议,其工作过程主要包括信号发送、冲突检测、冲突解决和数据传输四个步骤。
本文将对停等协议的工作过程进行简要介绍,并探讨其在局域网通信中的应用。
停等协议是一种基于载波侦听多路访问(CSMA/CD)的协议,用于协调多个设备在共享传输介质上的数据传输。
CSMA/CD协议要求设备在发送数据前首先侦听传输介质,以确保没有其他设备正在发送数据。
如果侦听到信道空闲,则设备可以直接发送数据;如果侦听到信道忙碌,设备则需要进行停等并在一定时间后再次侦听。
具体来说,停等协议的工作过程如下:1. 信号发送:当一个设备准备发送数据时,首先进行信号发送。
设备将数据分成一定长度的帧,并附带必要的控制信息,然后通过传输介质发送出去。
2. 冲突检测:在信号发送的过程中,其他设备也可能会尝试发送数据,这可能导致数据碰撞。
当设备发送数据的它需要不断地侦听传输介质,以检测是否有其他设备在发送数据。
如果发生冲突,设备会立即停止发送,并进入冲突解决阶段。
3. 冲突解决:设备在检测到冲突后,会通过发送干扰信号通知其他设备停止发送数据,并随机等待一段时间后重新侦听信道。
这个等待时间是在一定范围内随机选择的,以减少多个设备同时重新发送数据造成的再次冲突。
4. 数据传输:设备在随机等待一段时间后,重新侦听信道。
如果信道空闲,设备即可重新发送数据;如果侦听到信道忙碌,设备将继续进行停等和随机等待,直到成功发送数据。
停等协议的工作过程可以很好地适应局域网通信环境,保证数据的正常传输并避免冲突的发生。
其简单的工作原理和易于实现的特点,使其成为广泛被应用于以太网等共享介质局域网中的数据通信协议。
停等协议通过信号发送、冲突检测、冲突解决和数据传输四个步骤,有效地协调了多个设备在共享传输介质上的数据传输。
这种协议在局域网中发挥着重要的作用,保障了数据通信的有效性和可靠性。
简述停止等待协议的工作原理简述停止等待协议的工作原理一、双方的基本信息甲方:名称:地址:电话:法定代表人:委托代理人:乙方:名称:地址:电话:法定代表人:委托代理人:二、各方身份、权利、义务、履行方式、期限、违约责任1.甲方身份:甲方是XXXXX公司,具有XXXXX业务。
甲方权利:甲方有权要求乙方完成XXXXX业务,并且有权决定此停止等待协议实施后的期限。
甲方义务:为保障本协议顺利履行,甲方需要在规定期限内提供必要的协助与配合,并且需要保证相应的技术和人员资源。
甲方履行方式:甲方需要根据业务需求给乙方提供配套的技术方案和操作指导,以便乙方按时完成所承担的任务。
甲方期限:甲方根据业务的实际需求而定。
甲方违约责任:如甲方未能根据约定时间完成相应的技术方案和操作指导,从而导致乙方无法完成工作,将承担由此造成的相应经济损失。
2.乙方身份:乙方是XXXXX公司,具有XXXXX技术。
乙方权利:乙方有权根据甲方的技术方案和操作指导按时完成工作,并且有权从甲方获得相应的酬劳。
乙方义务:乙方需要在规定期限内完成相应的任务,并且需要保证所提供的技术方案和操作指导符合相应的技术标准和规范。
乙方履行方式:乙方需要根据甲方提供的技术方案和操作指导按时完成相应的工作,同时需要根据实际业务需求给甲方提供相应的技术反馈和建议。
乙方期限:乙方需要在约定的期限内完成工作。
乙方违约责任:如乙方未能按时完成工作,将承担由此造成的相应经济损失。
三、需遵守中国的相关法律法规1.甲、乙双方要遵守《中华人民共和国合同法》及其相关法律法规的规定,履行双方在合同中约定的义务,维护合同的有效性和合法性。
2.如发生争议,双方应履行协商解决的义务,如无法履行协商解决,则可以选择通过仲裁或向人民法院提起诉讼。
3.本协议履行过程中产生的税负、信用等问题,需按照国家相关税收和信用管理规定解决。
四、明确各方的权力和义务1.甲、乙双方在本协议中分别约定了自己的权利和义务,双方分别履行自己的义务,保障双方权益,维护商业信誉。
一、协议名称停止等待流控协议二、协议目的为确保数据链路层中数据的可靠传输,减少数据丢失和错误,提高网络传输效率,特制定本协议。
三、协议适用范围本协议适用于所有采用停止等待流控协议的数据链路层通信。
四、协议内容1. 基本原理停止等待流控协议是一种基于帧的数据链路层流量控制协议。
其基本原理为:发送方发送一帧数据后,等待接收方发送确认帧(ACK),确认帧到达后,发送方再发送下一帧数据。
若在预定时间内未收到确认帧,则发送方重传该帧。
2. 确认与否认(1)确认帧(ACK):接收方在正确接收一帧数据后,发送确认帧给发送方,表示已成功接收该帧。
(2)否认帧(NAK):接收方在接收到错误或丢失的帧时,发送否认帧给发送方,要求发送方重传该帧。
3. 超时重传(1)超时计时器:发送方在发送一帧数据后,启动超时计时器。
若在预定时间内未收到确认帧,则认为该帧丢失,发送方将重传该帧。
(2)超时重传次数:发送方设置超时重传次数,当达到该次数时,发送方停止重传,并报告错误。
4. 信道利用率与信道吞吐率(1)信道利用率:指实际传输的数据量与总传输量的比值。
停止等待流控协议的信道利用率较低,因为发送方在发送一帧数据后需要等待确认帧,导致信道利用率降低。
(2)信道吞吐率:指单位时间内通过信道的最大数据量。
停止等待流控协议的信道吞吐率较低,但能够保证数据的可靠传输。
5. 序列号为防止接收方处理重复数据,发送方和接收方对每帧数据分配一个序列号。
接收方在接收数据时,根据序列号判断数据是否重复。
五、协议实施与维护1. 发送方与接收方应遵循本协议,确保数据链路层通信的可靠性。
2. 发送方和接收方应定期检查协议执行情况,发现异常及时处理。
3. 发送方和接收方应定期对协议进行维护,确保协议的稳定运行。
六、协议终止当数据链路层通信结束或双方协商一致时,可终止本协议。
七、协议解释本协议的解释权归双方共同所有。
八、协议生效本协议自双方签字盖章之日起生效。
实验停止等待协议分析与协议模拟实现协议名称:停止等待协议分析与协议模拟实现一、引言停止等待协议是一种简单的协议,用于数据传输过程中的错误控制。
本协议旨在通过分析停止等待协议的原理、特点和效率,以及通过协议模拟实现来更好地理解该协议的工作原理。
二、协议分析1. 原理停止等待协议的原理是发送方发送数据后等待确认,只有在收到确认后才发送下一个数据。
接收方在收到数据后发送确认,若数据出错则发送否定确认,要求发送方重新发送该数据。
2. 特点停止等待协议的特点包括:- 简单易实现:该协议的实现相对简单,适用于对可靠性要求不高的数据传输。
- 效率低下:发送方必须等待确认才能发送下一个数据,导致传输效率较低。
- 无序传输:发送方发送的数据包在网络中可能以不同的顺序到达接收方。
3. 效率分析停止等待协议的效率主要受以下因素影响:- 传输延迟:发送方等待确认的时间会增加传输延迟。
- 信道利用率:由于发送方必须等待确认,信道可能处于空闲状态,造成信道利用率低。
- 重传次数:若数据出错,发送方需要重传,增加了传输时间和信道占用。
三、协议模拟实现为更好地理解停止等待协议的工作原理,可以进行协议模拟实现。
以下是一个简单的协议模拟实现的示例:1. 发送方实现:发送方需要完成以下步骤:- 将待发送的数据分割成适当大小的数据包。
- 发送数据包,并启动计时器。
- 等待接收方的确认。
- 若接收到确认,则停止计时器,发送下一个数据包。
- 若未接收到确认或接收到否定确认,则重新发送当前数据包。
2. 接收方实现:接收方需要完成以下步骤:- 接收数据包,并发送确认。
- 若接收到的数据包有误,则发送否定确认,要求发送方重新发送该数据包。
- 若接收到的数据包正确,则将数据传递给上层应用。
四、实验结果与分析通过协议模拟实现,可以观察到以下结果:- 传输延迟:发送方等待确认的时间会增加传输延迟,尤其是在网络负载较高的情况下。
- 信道利用率:由于发送方必须等待确认,信道可能处于空闲状态,造成信道利用率低。
计算机网络原理 停-等协议停-等协议是最简单的流量控制算法(策略),当源主机发送一个帧后,即停止发送,等待对方的应答。
如果收到目的地主机的肯定应答,则接着发送下一个帧;如果收到否定应答或者超过规定的时间没有收到肯定应答,则重发该帧。
它是简单而重要的数据链路层协议,在物理链路层上进行流量控制和差错控制,实现可靠的数据传输。
下面我们来通过下列几咱数据传输情况,来学习停-等协议的原理。
图4-2(a )所示,源主机发送一个数据帧,而目的地主机收到正确的数据帧,将此帧进行拆装后传送到网络层,然后向源主机返回一个确认帧ACK 。
当源主机收到确认ACK 后,再发送下一个数据帧。
数据传输有差错,一般通过出错重发和超时重发机制来解决此问题。
数据在传输过程中差错,目的地主机收到有差错的数据帧以后可以通过检错码检查出错误,于是不向源主机发送确认帧ACK 或者向其发送否认帧NAK ;为了避免源主机陷入一直等待,使它在发出一个数据帧后就立即启动一个定时器,如果超出了重发时间后,还没有收到目的地主机的确认帧,就重新发送该数据帧。
例如,图4-2(b )和图4-2(c )分别表示原始帧和ACK 丢失的情况。
图4-2(d )表示源主机正确接收了数据帧,但返回的确认帧丢失的情况。
例如,源主机发送数据帧,目的地主机返回确认帧ACK ,但该确认帧在传送过程中丢失或者超时。
因此,源主机收不到确认帧,又重新发送该数据帧,于是目的地主机收到两个同样的数据帧,所以就产生错误。
(a)确认在超时前到达目的地主机源主机源主机目的地主机(b)原始帧丢失技 巧 在发送数据帧后,重发时间应定得适当,一般选为略大于从发送完毕到收到确认帧所需时间的平均值。
数据在发送过程中,如果连续多次重新发送都出现差错,超过一定次数据,就停止发送,向上一级报告故障情况。
提 示“丢失”是帧在传输中出错,目的地主机用差错码检测到这类差错,接着将帧丢弃。
源主机目的地主机(c)确认丢失源主机目的地主机(d)超时过快图4-2 数据帧的几种传输情况在停止等待算法中有一个重要的细节。
福建农林大学计算机与信息学院课程设计报告课程名称:计算机网络课程设计题目:停止等待协议的实现姓名:系:计算机专业:计算机科学与技术年级:学号:指导教师:职称:2011 年6 月10 日福建农林大学计算机与信息学院课程设计报告结果评定目录1、课程设计的目的和任务 (4)2、课程设计的要求 (4)3、课程设计的分析与设计 (4)设计任务分析 (4)设计方案论证 (5)详细设计 (5)3、系统实施 (7)4、总结与体会 (9)5、参考文献 (9)附录:源代码 (10)停止等待协议的实现1、课程设计的目的和任务《计算机网络》课程讲述计算机网络的原理,尤其是TCP/IP协议栈的原理和应用,是一门理论性、应用性、实践性都比较强的课程。
而此次的课程设计是在学习完《计算机网络》课程后进行的一次全面的综合能力的检验。
计算机网络的课程设计是从原理和实践的角度,在计算机上编程模拟实现计算机网络的基本协议。
通过本次课程设计,使我们对计算机网络的原理能有更加深刻的认识和理解,同时进一步锻炼自己的动手能力。
在这次课程设计中,我设计的的是通过编译语言,编程模拟实现数据链路层协议中的停止等协议。
2、课程设计的要求通过双方的收发数据而达到相互通信的目的。
3、课程设计的分析与设计设计任务分析停止等待协议是数据链路层的几个协议中最简单的协议,是具有最简单流量控制的数据链路层协议,是数据链路层各种协议的基础。
此课程设计是基于winsock 编程,是在VC++的MFC界面下和控制台下实现的。
它采用客户机/服务器(C/S)模型,即发送数据的一端为客户端,接收数据的一端为服务器端。
停止等待协议就是通过双方的收发数据而达到相互通信的目的。
本课程设计通过编程模拟实现停止等待协议,随机的发送数据,通过服务器的的接受结果和客户端的接受结果显示理解停止等待协议的原理,掌握其应用。
设计方案论证当收方收到一个正确的数据帧后,便会向发方发送一个确认帧ACK,表示发送的数据正确接收。
当发方收到确认帧后才能发送一个新的数据帧,这样就实现了接收方对发送方的流量控制。
由于通信线路质量各方面的影响,数据帧从发送方到接收方传输的过程中可能会出现差错。
为了保证数据的正确性和完整性,接收方在收到数据后,会用一定的方法对接收到的数据进行差错检验,所以接收方很容易检测出收到的数据帧是否出现差错。
当接收方发现收到的数据出现差错时,就会向发送方发送一个否认帧NAK,表示对方发送的数据错误。
发送方会根据接收方发来的信息做出相应的操作。
采用这样的有效的检错机制,数据链路层可以对上面的网络层提供了可靠的传输的服务。
详细设计停止等待协议的算法如下:为了对停止等待算法有一个完整而准确的理解,下面给出此协议的算法。
具有最简单流量控制的数据链路层协议假定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、参考文献谢希仁《计算机网络》电子工业出版社附录:源代码发送端:()#include <>#include <>#include <>#pragma comment(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支持版本:if (LOBYTE != 2 || HIBYTE( ) != 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;}构建服务器地址信息:= AF_INET;//地址家族= 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;=data;ret = send(sClient, (char *)&bag, sizeof(bag), 0);ret = recv(sListen, ptr, sizeof(bag), 0);if!=i){i--;printf("send()successed!\n");continue;}else if==i)printf("packet %d has been sent!\n",i+1);}closesocket(sClient); WSACleanup();}接受端():#include <>#include <>#include <>#include <>#pragma comment(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支持版本:if (LOBYTE != 2 || HIBYTE( ) != 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;}构建本地地址信息:= AF_INET;//地址家族= htons(SERVER_PORT);//转化为网络字节序= 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, ntohs);按照预定协议,客户端将发来一个信息: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!=i){printf("wrong packet!\n");i--;ret = send(sServer, pp, nLeft, 0);continue;}else if==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();。