滑动窗口的仿真协议

合集下载

滑动窗口的仿真协议

滑动窗口的仿真协议

滑动窗口的仿真协议协议名称:滑动窗口的仿真协议一、引言本协议旨在定义滑动窗口的仿真协议,用于模拟网络通信中滑动窗口协议的行为和性能。

滑动窗口协议是一种流行的数据传输协议,用于实现可靠的数据传输。

通过仿真滑动窗口协议,我们可以评估协议的性能,并进行性能优化。

二、背景滑动窗口协议是一种基于窗口机制的数据传输协议,常用于计算机网络中。

其核心思想是发送方和接收方通过维护一个窗口来实现流量控制和错误恢复。

滑动窗口协议具有高效、可靠和灵活等特点,因此被广泛应用于各种网络通信场景。

三、目的本协议的目的是定义滑动窗口的仿真协议,用于模拟滑动窗口协议的行为和性能。

通过仿真,我们可以评估滑动窗口协议在不同条件下的性能表现,包括吞吐量、延迟、丢包率等指标。

同时,我们可以通过仿真结果来优化滑动窗口协议的设计和参数配置。

四、协议内容1. 协议参与方:- 发送方:模拟数据发送方,负责发送数据包并维护滑动窗口。

- 接收方:模拟数据接收方,负责接收数据包并发送确认信息。

- 网络模拟器:模拟网络环境,包括延迟、丢包等特性。

2. 协议流程:a. 发送方将数据包划分为多个固定大小的数据块,并按序号进行编号。

b. 发送方维护一个发送窗口,窗口大小为W,初始时窗口为空。

c. 发送方按顺序发送窗口内的数据包,同时启动定时器。

d. 接收方接收数据包,并发送确认信息。

e. 发送方收到确认信息后,将对应的数据包从发送窗口中移除,并滑动窗口。

f. 若发送方未收到确认信息,定时器超时,发送方重新发送窗口内的数据包。

g. 若接收方未收到期望的数据包,发送方重新发送该数据包。

h. 协议持续运行,直到所有数据包都被正确接收或达到最大重传次数。

3. 参数配置:- 数据包大小:定义数据包的大小,影响传输效率和网络利用率。

- 窗口大小:定义发送窗口的大小,影响流量控制和吞吐量。

- 超时时间:定义定时器的超时时间,影响错误恢复和延迟。

- 最大重传次数:定义最大重传次数,用于控制错误恢复的次数。

1 滑动窗口协议模拟程序

1 滑动窗口协议模拟程序

– 可以在发送方设置一个发送定时器模拟发送端 网络层数据流量。
14
协议模拟过程分析(2) • 关于接收方接收速率的模拟。
– 在接收方设置一个接收定时器,速率可设定。 – 使用令牌桶算法调节数据接收的平均速率。 – 令牌桶算法既可保证在接收窗口允许范围内产 生短暂的数据突发流量,同时又在较长时间范 围内控制接收速率的大小。
21
TCP滑动窗口协议的基本原理
• TCP发送方缓存与发送窗口
发送方缓存 发送窗口大小
… …
已发送 且已确认
34 35 36 37 38 39 40 41 42 43 44 45 46 47
已发送 但未确认 可连续 立即发送 窗口展开之前 暂不能发送
… …
空闲
下一个要发送的字节
• TCP接收方缓存与接收窗口
滑动窗口协议 模拟程序
1
概述 滑动窗口协议通常用于实现流量控 制和差错控制、保证数据传输的可 靠性和有效性。它既可以作为基本 的数据链路层协议,也可用于传输 层的TCP协议中
2
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
3பைடு நூலகம்
编程训练目的
• 掌握滑动窗口协议的概念、原理与基本 算法。 • 理解3种典型的数据链路层滑动窗口协议: l位滑动窗口协议、使用退后n帧的滑动 窗口协议与使用选择性重传的滑动窗口 协议。 • 了解传输层与数据链路层滑动窗口协议 的区别与联系,了解TCP滑动窗口协议 的实现原理。
4
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
5
编程训练要求
编程实现使用选择性重传策略的滑动窗口协议 模拟程序 :

滑动窗口协议

滑动窗口协议

滑动窗口协议协议名称:滑动窗口协议一、协议介绍滑动窗口协议是一种用于数据传输的协议,通过设置发送方和接收方的窗口大小,实现可靠的数据传输和流量控制。

本协议旨在确保数据的完整性和可靠性,提高数据传输的效率和可控性。

二、协议要求1. 数据传输的可靠性:确保数据在传输过程中不丢失、不损坏、不重复。

2. 流量控制:根据接收方的处理能力和网络状况,控制发送方的数据发送速率,避免数据拥塞。

3. 窗口管理:通过滑动窗口的机制,实现数据的分段发送和接收,提高数据传输的效率。

4. 错误检测和纠正:采用适当的错误检测和纠正机制,保证数据传输的准确性。

三、协议流程1. 发送方将待发送的数据分割为固定大小的数据段,并设置发送窗口的大小。

2. 发送方将数据段按照顺序发送给接收方,并启动定时器等待接收方的确认信息。

3. 接收方接收到数据段后,检查数据的完整性。

如果数据正确无误,则发送确认信息给发送方。

4. 发送方收到确认信息后,将发送窗口向前滑动一个位置,并继续发送下一个数据段。

5. 如果发送方在定时器超时前没有收到确认信息,则认为数据丢失,重新发送该数据段。

6. 接收方在收到重复的数据段时,丢弃重复数据并发送确认信息。

四、协议实现1. 窗口大小的选择:根据网络状况和接收方的处理能力,合理选择发送窗口和接收窗口的大小。

2. 序列号的分配:发送方为每个数据段分配一个唯一的序列号,接收方通过序列号确认接收到的数据段。

3. 确认机制:接收方在接收到数据段后,发送确认信息给发送方,确认已收到数据段。

4. 定时器机制:发送方设置定时器,超时后重新发送未收到确认的数据段。

5. 错误检测和纠正:采用适当的错误检测和纠正机制,如循环冗余校验(CRC)等。

五、协议优化1. 快速重传:接收方在收到连续的重复数据段时,立即发送确认信息,以提高数据传输效率。

2. 拥塞控制:根据网络拥塞的程度,动态调整发送窗口的大小,避免数据拥塞和丢失。

3. 流量控制:接收方通过发送窗口的大小,控制发送方的数据发送速率,防止数据过载。

滑动窗口的仿真协议

滑动窗口的仿真协议

滑动窗口的仿真协议协议名称:滑动窗口的仿真协议1. 引言本协议旨在定义滑动窗口的仿真协议,以实现数据传输的可靠性和效率。

该协议适用于需要传输大量数据的通信系统,特别是在网络通信中应用广泛。

本协议的目标是确保数据的可靠传输,同时最大化数据传输的效率。

2. 术语和定义在本协议中,以下术语和定义适用:- 发送方(Sender):负责将数据发送给接收方的实体。

- 接收方(Receiver):负责接收发送方传输的数据的实体。

- 数据帧(Data Frame):将数据分割为固定大小的块进行传输的单元。

- 窗口(Window):发送方和接收方之间的数据传输缓冲区。

- 序列号(Sequence Number):用于标识数据帧在发送方和接收方之间的顺序。

- 确认号(Acknowledgement Number):用于确认接收方已成功接收到的数据帧的序列号。

3. 协议流程3.1 发送方流程发送方执行以下步骤来实现滑动窗口的仿真协议:步骤1:初始化发送窗口的大小和初始序列号。

步骤2:将数据分割为适当大小的数据帧。

步骤3:将数据帧按照顺序发送给接收方。

步骤4:等待接收方的确认。

步骤5:接收到确认后,滑动发送窗口,更新序列号,并继续发送下一个数据帧。

步骤6:如果在一定时间内未收到确认,则重新发送未确认的数据帧。

3.2 接收方流程接收方执行以下步骤来实现滑动窗口的仿真协议:步骤1:初始化接收窗口的大小和初始序列号。

步骤2:等待发送方发送数据帧。

步骤3:接收到数据帧后,检查序列号是否与期望的序列号匹配。

步骤4:如果匹配,则发送确认给发送方,并将数据帧交付给上层应用。

步骤5:如果不匹配,则丢弃数据帧,并发送确认给发送方,确认接收到的最后一个正确的数据帧。

步骤6:滑动接收窗口,更新序列号,准备接收下一个数据帧。

4. 错误处理4.1 超时重传如果发送方在一定时间内未收到接收方的确认,则发送方将重新发送未确认的数据帧。

4.2 丢失数据帧如果接收方未收到发送方发送的数据帧,则接收方将发送一个确认,确认接收到的最后一个正确的数据帧,并要求发送方重新发送丢失的数据帧。

滑动窗口协议

滑动窗口协议

滑动窗口协议引言在计算机网络中,滑动窗口协议是一种常用的数据传输协议,用于确保可靠的数据传输。

本文将介绍滑动窗口协议的基本概念、工作原理以及应用场景等内容。

滑动窗口协议的基本概念滑动窗口协议是一种基于窗口的流量控制协议。

在数据传输过程中,发送方和接收方都维护着一个固定大小的窗口,用于管理待发送的数据和已接收的数据。

滑动窗口协议的工作原理滑动窗口协议的工作原理可以简单地描述为以下几个步骤: 1. 发送方将待发送的数据分割成若干个数据包,并按顺序发送。

2. 接收方接收数据包,并发送确认信息给发送方。

3. 发送方收到确认信息后,将窗口向前滑动一个单位,继续发送下一个数据包。

4. 如果接收方未收到某个数据包,或者数据包有错误,将请求发送方重新发送该数据包。

滑动窗口协议的优势相比于其他传输协议,滑动窗口协议具有以下优势: 1. 可靠性:滑动窗口协议通过确认机制和重传机制,能够确保数据的可靠传输。

2. 流量控制:通过窗口大小的控制,滑动窗口协议可以有效控制数据传输的速率,避免数据的丢失和网络拥塞。

3. 高效性:滑动窗口协议支持并行发送多个数据包,提高了数据传输的效率。

滑动窗口协议的应用场景滑动窗口协议广泛应用于各种数据传输场景,包括但不限于: 1. 文件传输:在文件传输过程中,滑动窗口协议可以确保文件的完整性和正确性。

2. 视频流传输:通过滑动窗口协议,可以实现对视频流的实时传输和播放。

3. 数据库同步:在数据库同步过程中,滑动窗口协议可以确保数据的一致性和可靠性。

总结滑动窗口协议是一种常用的数据传输协议,通过窗口管理机制,实现了数据的可靠传输和流量控制。

它具有可靠性、高效性和流量控制等优势,并在文件传输、视频流传输和数据库同步等场景中得到广泛应用。

熟悉滑动窗口协议的工作原理和应用场景,对于网络通信的设计和优化具有重要意义。

滑动窗口协议

滑动窗口协议

滑动窗口协议协议名称:滑动窗口协议一、引言滑动窗口协议是一种用于数据传输的协议,其主要目的是通过控制发送方和接收方之间的数据流量,实现可靠的数据传输。

本协议旨在确保数据的完整性、可靠性和顺序性,以满足任务要求。

二、协议概述滑动窗口协议基于数据包的发送和接收窗口的概念,通过动态调整窗口大小和确认机制来实现高效的数据传输。

发送方将数据划分为多个数据包,并按照顺序发送到接收方。

接收方通过发送确认消息来告知发送方已成功接收到数据包。

如果发送方未收到确认消息,将重传数据包,直到接收方正确接收到数据。

三、协议流程1. 建立连接阶段:1.1 发送方向接收方发送连接请求。

1.2 接收方收到连接请求后发送确认消息。

1.3 发送方收到确认消息后,建立连接。

2. 数据传输阶段:2.1 发送方将数据划分为多个数据包,并按照顺序发送。

2.2 接收方收到数据包后,发送确认消息。

2.3 发送方收到确认消息后,将发送窗口向前滑动一个位置。

2.4 如果发送方未收到确认消息,将重传数据包。

2.5 接收方收到重传的数据包后,丢弃重复的数据包。

3. 连接关闭阶段:3.1 发送方向接收方发送连接关闭请求。

3.2 接收方收到连接关闭请求后发送确认消息。

3.3 发送方收到确认消息后,关闭连接。

四、数据包格式滑动窗口协议的数据包格式如下:| 序列号 | 数据长度 | 数据内容 |- 序列号:用于标识数据包的顺序。

- 数据长度:指示数据内容的长度。

- 数据内容:实际的数据内容。

五、窗口管理1. 发送窗口:用于存放待发送的数据包。

- 发送窗口大小:根据网络状况和接收方处理能力动态调整,保证可靠传输。

- 发送窗口滑动:每次接收到确认消息后,将发送窗口向前滑动一个位置。

2. 接收窗口:用于存放接收到的数据包。

- 接收窗口大小:根据发送方发送速率和接收方处理能力动态调整,避免数据丢失或溢出。

- 接收窗口滑动:每次接收到数据包后,将接收窗口向前滑动一个位置。

滑动窗协议书范本

滑动窗协议书范本

滑动窗协议书范本甲方(发送方):_____________________乙方(接收方):_____________________鉴于甲方需要通过电子方式向乙方传输数据,为了保证数据传输的可靠性和有效性,双方本着平等互利的原则,经协商一致,就采用滑动窗协议进行数据传输的相关事宜达成如下协议:1. 定义1.1 滑动窗协议:一种用于计算机网络中传输数据的流量控制机制,允许发送方在等待接收方确认的情况下发送一定数量的未经确认的数据。

2. 协议参数2.1 窗口大小:甲方在未收到乙方确认的情况下,可以连续发送的数据包数量。

2.2 数据包编号:每个数据包的唯一标识,用于乙方确认已接收的数据包。

3. 数据传输流程3.1 发送方在每个数据包中包含一个序列号,用于乙方识别和排序。

3.2 接收方在接收到数据包后,应发送确认信息,告知发送方已成功接收的数据包编号。

3.3 发送方根据接收方的确认信息,决定是否发送新的数据包或重新发送未被确认的数据包。

4. 窗口管理4.1 甲方应根据乙方的接收能力和网络状况合理设置窗口大小。

4.2 乙方应即时向甲方反馈接收状态,以便甲方调整窗口大小。

5. 错误处理5.1 如乙方发现数据包丢失或错误,应立即通知甲方,并提供丢失或错误的数据包编号。

5.2 甲方在收到乙方的错误通知后,应重新发送指定编号的数据包。

6. 数据完整性6.1 甲方保证所发送的数据包内容的完整性和正确性。

6.2 乙方在接收数据包后,应进行完整性校验,确保数据未被篡改。

7. 安全保密7.1 双方应采取必要的安全措施,保护传输过程中的数据不被未授权访问。

7.2 双方应对传输过程中的数据保密,未经对方书面同意,不得向第三方披露。

8. 协议变更8.1 任何一方需变更协议内容,应提前____天书面通知对方,并经双方协商一致。

9. 违约责任9.1 如一方违反本协议约定,应承担相应的违约责任,并赔偿对方因此遭受的损失。

10. 争议解决10.1 本协议在执行过程中发生争议,双方应首先通过协商解决;协商不成的,可提交甲方所在地人民法院诉讼解决。

滑动窗口协议实验报告

滑动窗口协议实验报告

滑动窗口协议实验报告1. 引言滑动窗口协议是计算机网络中用于实现可靠数据传输的一种协议。

其核心思想是使用一个窗口来管理发送方和接收方之间的数据传输进程,通过滑动窗口的机制来实现流量控制和错误恢复。

本实验旨在通过编写滑动窗口协议的模拟程序,深入理解该协议的工作原理及其在数据传输中的应用。

2. 实验环境本次实验采用C++语言进行编程,并在Windows操作系统下进行测试。

3. 实验过程3.1 窗口大小的确定首先,我们需要确定滑动窗口的大小。

在实际应用中,窗口大小需要根据网络状况来调整,以保证传输效率。

本次实验中,我们设置窗口大小为5。

3.2 发送方逻辑实现发送方负责将数据分割为若干个数据包,并发送给接收方。

发送方需要维护发送窗口的起始位置和结束位置,在每次发送数据包后,将发送窗口向前滑动一格。

如果接收窗口收到接收方的确认信息,发送方将收到确认的数据包从发送窗口中移除,并将窗口向前滑动一格。

3.3 接收方逻辑实现接收方需要维护接收窗口的起始位置和结束位置。

当接收窗口收到数据包时,接收方首先检查数据包的顺序是否正确,如果顺序正确,则将数据包保存并发送确认信息给发送方。

接收方随后将接收窗口向前滑动一格,等待下一个数据包的到来。

3.4 测试与验证在实验过程中,我们通过模拟网络传输的延迟、丢包等情况来验证滑动窗口协议的可靠性。

通过调整滑动窗口的大小以及模拟网络传输的不同情况,我们可以观察到滑动窗口协议在不同场景下的性能表现。

4. 实验结果分析通过实验,我们观察到滑动窗口协议在正常网络传输情况下,能够实现高效的数据传输。

当网络传输出现延迟或丢包时,滑动窗口协议能够通过重传机制和流量控制策略,确保数据的可靠传输。

在窗口大小适当的情况下,滑动窗口协议能够最大化利用网络带宽,提高数据传输的效率。

5. 实验总结本次实验通过编写模拟程序,深入理解了滑动窗口协议的工作原理及其在数据传输中的应用。

滑动窗口协议通过窗口的滑动机制,实现了对数据传输过程的控制和管理,从而保证了数据的可靠性和传输效率。

滑动窗口的仿真协议

滑动窗口的仿真协议

计算机网络课程设计书学院计算机与信息工程学院专业网络工程课程名称计算机网络题目滑动窗口协议仿真完成期限自2015年6月23日至2015年6月29日共1周内容及任务一、项目的目的掌握滑动窗口协议的工作原理,并能够用所学计算机高级语言进行编程模拟其运行过程;培养学生的动手实践和思考能力。

二,项目任务的主要内容和要求(1)本次设计任务是根据滑动窗口协议的工作原理,在Visual C++ 6.0的平台上用C++语言编写一个基本TCP滑动窗口协议的模拟程序。

(2)要求该程序能够实现滑动窗口协议的发送和接收数据帧功能,在此功能上体现滑动窗口协议的运作。

(3) 程序按照滑动窗口协议实现端对端的数据传送。

包括协议的各种策略,如包丢失、停等应答、超时等都应有所仿真实现;(4) 显示数据传送过程中的各项具体数据。

双方帧的个数变化,帧序号,发送和接受速度,暂停或重传提示等;三、项目设计(研究)思路(1) 查阅相关资料,理解滑动窗口协议的工作原理;(2) 设计滑动窗口协议实现端对端数据传送的功能流程图;(3) 编写代码实现滑动窗口协议工作的模拟程序,包括包丢失、停等应答、超时等;(4) 测试程序功能的实现情况。

四、具体成果形式和要求(1)滑动窗口协议实现端对端数据传送的模拟程序。

(2)按照要求撰写课程设计报告并准备答辩。

进度安排起止日期工作内容2015.6.23-2015.6.24了解网络协议编程的基本知识;2015.6.25-2015.6.26了解滑动窗口协议的工作机制;2015.6.27-2015.6.28使用编程语言编写一个滑动窗口协议的模拟程序,按要求实现程序。

2015.6.29 最后汇总,调试,答辩主要参考资料[1] 谢希仁. 计算机网络[M]. 4版. 北京:电子工业出版社, 2003.[2] 李仁发.何彦. 基于虚拟实验方法的滑动窗口协议分析[J]. 系统仿真学报. 2002. 8 (14) ; 1026 - 1063.[3] 李建中,张冬冬. 滑动窗口规模的动态调整算法[J]. 软件学报. 2004. 12 (15) : 1800 - 1814.[4] 王栩,李建中,王伟平. 基于滑动窗口的数据流压缩技术及连续查询处理方法[ J ]. 计算机研究与发展. 2004. 10 (41) : 1639- 1644.[5] 特南鲍姆. 计算机网络(第四版). 清华出版社指导教师意见(签字):×年×月×日系(教研室)主任意见(签字):×年×月×日计算机网络课程设计说明书(封面)学院名称:计算机与信息工程学院班级名称:网络工程一班学生姓名:学号: 201321题目:滑动窗口协议仿真指导教师姓名:邵雪梅起止日期: 2015.6.23-2015.6.29第一部分:正文部分一,选题背景早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。

实验一 滑动窗口协议实验

实验一  滑动窗口协议实验

实验一滑动窗口协议实验◆实验目的:在NetRiver实验系统中,用C语言实现滑动窗口协议中的1比特滑动窗口协议和后退N帧协议,理解滑动窗口协议◆实验原理和说明:(1).窗口机制滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。

发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。

不同的滑动窗口协议窗口大小一般不同。

发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。

下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1):分析:①初始态,发送方没有帧发出,发送窗口前后沿相重合。

接收方0号窗口打开,等待接收0号帧;②发送方打开0号窗口,表示已发出0帧但尚确认返回信息。

此时接收窗口状态不变;③发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。

至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。

接收窗口此时状态仍未变;④接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。

此时发送窗口状态不变;⑤发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。

此时接收窗口状态仍不变;⑥发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。

至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;⑦接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。

此时发送窗口状态不变;⑧发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧。

此时接收窗口状态仍不变。

若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。

滑动窗口协议模拟

滑动窗口协议模拟

实验8滑动窗口协议模拟一、实验目的1.模拟实现滑窗协议在数据链路层上的数据传输过程,加深对滑窗协议的理解2.掌握滑动窗口协议基本原理与基本算法;二、要求:1.掌握滑动窗口协议的概念、原理与基本算法;2.实现“选择性重传策略或连续自动重传策略(后退N帧)”的滑动窗口协议模拟程序;3.了解传输层和链路层滑动窗口协议的区别与联系及TCP中滑动窗口协议的实现原理。

三、实验原理滑窗协议工作原理由于停等协议要为每一个帧进行确认后才继续发送下一个帧,大大降低了信道利用率,因此又提出来回退N帧的滑窗协议。

回退N帧协议中,发送方在发送完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。

由于减少了等待时间,必然提高通信的吞吐量和信道利用率。

回退N帧的滑窗协议(GO-DACK-N)基本原理是,当接收方检测出错的信息帧后,丢弃出错帧后的所有信息帧,而不管这些帧是否正确。

待发送方收到对出错帧的否定应答(NAK)时,将重发从出错后的所有数据帧;若应答帧出错,则超时重发。

因此,发送方在每发完一个数据帧时都要设置超时计时器。

只要在所设置的计时器超时而仍未收到确认帧,就要重发相应的数据帧,若等不到1号帧的确认应答而重发1号数据帧时,虽然发送方已经发送完3号帧,但仍必须将1号帧及其以后的各帧全部进行重传。

因此,后退N帧协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传,这种做法又使传送率降低。

四、实验要求1.Windows XP环境下运行,程序在1~2台PC上运行。

2.具体实现的协议可以采用回退N帧技术或者选择性重发技术的协议。

3.采用.NET平台中的C#、C++或其他编程语言实现。

五、实验内容模拟滑窗协议的实现过程为;(1)程序客户端线程发送连接请求。

(2) 服务器连接并返回连接信息。

(3) 客户端发送数据帧(窗口大小自行设定)。

C语言模拟滑动窗口协议

C语言模拟滑动窗口协议

C语言模拟滑动窗口协议#include#include#includemain(){struct swphdr{unsigned long seqnum;unsigned long acknum;unsigned short flags; /*flag=0表示这是一个数据帧,flag=1表示这是一个ACK帧*/};struct sendq_slot{unsigned short timeout;/*1时表示计时启动,0时表示已收到确认*/unsigned long msg;struct sendq_slot *next;};struct recvq_slot{unsigned short received;/*1表示顺序接收,0表示错序接受*/ unsigned long msg;struct recvq_slot *next;};struct swpstate{unsigned long lar;unsigned long lfs;unsigned long sws;struct swphdr hdr;unsigned long rws;struct sendq_slot *sendq;unsigned long nfe;struct recvq_slot *head;}swpstate1;unsigned long a;int flag,b;/*发送*/struct sendq_slot *sendq_rear,*sendp,*p3,*p4;struct recvq_slot *recvp,*recvq_rear,*p1,*p2;swpstate1.head=NULL;swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(struct sendq_slot));if(!swpstate1.sendq) exit(1);sendq_rear->next=NULL;printf("请输入窗口大小:");scanf("%ld",&swpstate1.sws);swpstate1.rws=swpstate1.sws;if (swpstate1.sws>0){printf("请输入第一帧的序列号:");scanf("%ld",&swpstate1.hdr.seqnum);}swpstate1.nfe=swpstate1.hdr.seqnum;sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot));if(!sendp) exit(1);sendp->msg=swpstate1.hdr.seqnum;sendp->timeout=1;sendp->next=NULL;sendq_rear->next=sendp;sendq_rear=sendp;--swpstate1.sws;swpstate1.lfs=swpstate1.hdr.seqnum;r=swpstate1.hdr.seqnum;do{while(swpstate1.sws>0){sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot));if(!sendp) exit(1);sendp->msg=swpstate1.lfs+1;sendp->timeout=1;sendp->next=NULL;sendq_rear->next=sendp;sendq_rear=sendp;--swpstate1.sws;++swpstate1.lfs;}swpstate1.hdr.acknum=0;swpstate1.hdr.flags=0;printf("最近收到的ACK的帧序号:%ld\n",r);printf("最近发送的帧序号(发送新帧后):%ld\n",swpstate1.lfs);/*接收*/if(swpstate1.hdr.flags==0){do{printf("请输入收到的数据帧号:");scanf("%ld",&a);if(a>=swpstate1.nfe&&a<=swpstate1.lfs){if(swpstate1.head==NULL){recvp=recvq_rear=(struct recvq_slot*)malloc(sizeof(struct recvq_slot));recvp->next=NULL;swpstate1.head=recvp;}elseif(swpstate1.head!=NULL){recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot));recvp->next=NULL;recvq_rear->next=recvp;recvq_rear=recvp;}}else{printf("所输数据不在接收窗口内!");break;}recvp->msg=a;if(recvp->msg==swpstate1.nfe)recvp->received=1;elserecvp->received=0;--swpstate1.rws;if(recvp->received==1){a=a-1;do{a=a+1;if(swpstate1.head==NULL)break;p1=swpstate1.head;flag=0;while((a!=p1->msg)&&(p1->next!=NULL)) {p2=p1;p1=p1->next;}if(a==p1->msg){flag=1;if(p1==swpstate1.head)swpstate1.head=swpstate1.head->next; else p2->next=p1->next;swpstate1.nfe=a+1;swpstate1.hdr.acknum=a+1;swpstate1.hdr.flags=1;}}while(flag==1);}printf("ACK号(期待的下一帧的序号):%ld\n",swpstate1.nfe);printf("没按序接受的序号:\n");p1=swpstate1.head;while(p1!=NULL){printf("%ld\t",p1->msg);p1=p1->next;}printf("\n");printf("继续接收帧?若是,输入1,若不是,输入0.\n");scanf("%d",&b);}while((swpstate1.rws>0)&&(b==1));}if(swpstate1.hdr.flags==1){p3=swpstate1.sendq->next;flag=0;while((swpstate1.hdr.acknum)!=p3->msg&&p3->next!=NU LL){p4=p3;p3=p3->next;}if(swpstate1.hdr.acknum==p3->msg){flag=1;if(p3->msg==swpstate1.sendq->next->msg)swpstate1.sendq->next=p3;else swpstate1.sendq->next=p3;}swpstate1.sws=swpstate1.sws+(swpstate1.sendq->next->m r);r=swpstate1.sendq->next->msg;swpstate1.hdr.seqnum=swpstate1.hdr.acknum;printf("最近收到的ACK的帧序号(收到ACK 后):%ld\n",r);printf("最近发送的帧序号(此时还未发送新的数据):%ld\n",swpstate1.lfs);}printf("继续执行吗?是请输入1\n");scanf("%d",&b);}while(b==1&&swpstate1.sws>0);}。

滑动窗口协议实验报告

滑动窗口协议实验报告

数据链路层滑动窗口协议实验报告1实验任务对实际系统中的协议分层和协议软件的设计与实现有基本的认识。

2实验内容利用所学数据链路层原理,自己设计一个滑动窗口协议并在仿真环境下编程实现有噪音信道环境下的可靠的双工通信。

信道模型为8000bps 全双工卫星信道,信道传播时延270 毫秒,信道误码率为10-5,信道提供字节流传输服务,网络层分组长度在240~256字节范围。

通过该实验,进一步巩固和深刻理解数据链路层的字节填充方式的成帧技术,误码检测的CRC 校验技术,以及滑动窗口的工作机理。

滑动窗口机制的两个主要目标:(1) 实现有噪音信道环境下的无差错传输; (2)充分利用传输信道的带宽。

在程序能够稳定运行并成功实现第一个目标之后,运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。

为实现第二个目标,提高滑动窗口协议信道利用率,需要根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及ACK 搭载定时器的时限。

这些参数的设计,需要充分理解滑动窗口协议的工作原理并利用所学的理论知识,经过认真的推算,计算出最优取值,并通过程序的运行进行验证。

对实际系统中的协议分层和协议软件的设计与实现有基本的认识。

3编程环境利用仿真环境下所提供的物理层服务和定时器机制为网络层提供服务。

8.1程序的总体结构设数据链路层通信的两个站点分别为站点A和站点B,仿真环境利用WindowsXP环境下的TCP协议和Socket客户端/服务器机制构建两个站点之间的通信,其中,站点A为服务器端,站点B为客户端。

编译、链接之后最终生成的可执行程序(.exe文件)为字符界面命令行程序(不是图形界面程序)。

可执行程序文件仅有一份,设为datalink.exe,在WindowsXP 的两个DOS 窗口中使用不同的命令行参数启动两个进程,分别仿真站点A和站点B。

8.2实验环境所提供的文件和编译运行方法实验环境使用Visual C++ 6.0系统datalink.dsw,datalink.dsp:Microsoft VC6.0的工程文件,包括Win32 Debug和Win32 Release两种配置。

滑动窗口协议

滑动窗口协议

滑动窗口协议一、协议概述滑动窗口协议是一种用于数据传输的协议,通过滑动窗口的机制实现可靠的数据传输。

该协议允许发送方将一定数量的数据分成多个数据包进行发送,接收方通过确认机制告知发送方已成功接收数据包,同时控制窗口大小来调整数据传输速率。

二、协议要求1. 可靠性:确保数据的完整性和准确性,防止数据丢失或损坏。

2. 效率:通过滑动窗口机制实现高效的数据传输,尽可能减少重传和延迟。

3. 可扩展性:支持动态调整窗口大小,适应不同网络环境和传输需求。

三、协议流程1. 发送方将待发送的数据分割成多个数据包,并按顺序编号,构成发送窗口。

2. 发送方发送窗口中的数据包,并启动定时器等待接收方的确认。

3. 接收方接收到数据包后,检查数据的完整性,如果正确则发送确认消息,同时将数据包交给上层应用。

4. 发送方收到确认消息后,将对应的数据包从发送窗口中移除,并根据接收方返回的确认信息调整窗口大小。

5. 如果发送方在定时器超时前未收到确认消息,则重新发送对应的数据包。

6. 发送方和接收方根据需要动态调整窗口大小,以优化数据传输效率。

四、协议数据包格式协议数据包由报头和数据两部分组成。

1. 报头格式:- 序号:用于标识数据包的顺序,保证数据包按序传输。

- 确认号:用于标识接收方期望接收的下一个数据包的序号。

- 窗口大小:用于告知发送方接收方当前可接收的数据包数量。

- 校验和:用于检测数据包是否损坏。

2. 数据格式:- 数据:待传输的数据内容。

五、协议控制机制1. 窗口滑动:发送方根据接收方返回的确认信息,动态调整发送窗口的大小,以提高传输效率。

2. 超时重传:发送方设置定时器,如果在定时器超时前未收到确认消息,则重新发送对应的数据包。

3. 确认机制:接收方收到数据包后发送确认消息,以告知发送方已成功接收数据。

4. 流量控制:接收方通过窗口大小控制来限制发送方的传输速率,以避免网络拥塞。

六、协议优化1. 滑动窗口大小的动态调整:根据网络状况和带宽情况,动态调整发送窗口的大小,以提高传输效率。

滑动窗口的仿真协议

滑动窗口的仿真协议

滑动窗口的仿真协议协议名称:滑动窗口的仿真协议1. 引言本协议旨在描述滑动窗口的仿真过程,并规定了参与方的角色、通信流程、数据传输机制等内容,以确保数据的可靠传输和系统的稳定运行。

2. 参与方本协议涉及以下参与方:- 发送方(Sender):负责将数据分割为适当大小的数据包,并通过滑动窗口机制发送数据。

- 接收方(Receiver):接收发送方发送的数据包,并确认接收到的数据包。

- 网络(Network):承载发送方和接收方之间的数据传输。

3. 通信流程3.1 发送方初始化发送方在开始数据传输前,需要进行初始化操作。

具体流程如下:- 发送方设置滑动窗口的大小(窗口大小)和初始序列号(初始序号)。

- 发送方将待发送的数据分割为适当大小的数据包,并为每个数据包分配一个序列号。

- 发送方将窗口内的数据包发送给接收方,并启动计时器。

3.2 数据传输发送方通过滑动窗口机制将数据发送给接收方。

具体流程如下:- 发送方发送窗口内的数据包给接收方。

- 接收方接收到数据包后,进行校验和验证,如果数据包有误,则丢弃该数据包。

- 接收方发送确认(ACK)给发送方,确认接收到的数据包。

- 发送方收到确认后,将确认的数据包从窗口内移除,并向前滑动窗口。

- 如果发送方在一定时间内没有收到确认,认为该数据包丢失,将重新发送该数据包。

3.3 窗口滑动窗口滑动是滑动窗口机制的核心步骤。

具体流程如下:- 当发送方收到接收方的确认时,发送方将窗口内的数据包移除,并将窗口向前滑动。

- 发送方将新的数据包发送给接收方,并启动计时器。

4. 数据传输机制4.1 停等协议发送方发送一个数据包后,会等待接收方的确认,直到收到确认后才发送下一个数据包。

如果发送方在一定时间内没有收到确认,将重新发送该数据包。

4.2 滑动窗口滑动窗口机制允许发送方在等待接收方确认的同时继续发送新的数据包。

发送方维护一个窗口,窗口内的数据包已发送但未收到确认。

窗口的大小决定了发送方可以发送的数据包数量。

课程设计报告滑动窗口协议仿真

课程设计报告滑动窗口协议仿真

滁州学院课程设计报告课程名称:计算机网络设计题目:滑动窗口协议仿真系别:计算机与信息工程学院专业:计算机科学与技术组别:第五组起止日期:2011年11月24日~2011年12月7日指导教师:赵国柱计算机与信息工程学院二○一一年制课程设计任务书一. 引言二. 基本原理2.1 窗口机制2.21bit滑动窗口协议2.3 后退N协议2.4选择重传协议2.5流量控制三. 需求分析3.1 课程设计题目3.2 开发环境3.3 运行环境3.4 课程设计任务及要求3.5界面要求3.6 网络接口要求四. 详细设计4.1 结构体的定义4.2 发送方的主要函数4.3 接受方的主要函数五.源代码5.1 发送方的主要代码5.2 接收方的主要代码六. 调试与操作说明致谢[参考文献]课程设计的主要内容1.引言早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。

由于大家不知道网络拥塞状况,一起发送数据,导致中间结点阻塞掉包,谁也发不了数据。

在数据传输过程中,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快,接收方就可能来不及接收,这就造成数据的丢失。

因此就有了滑动窗口机制来解决这些问题。

早期我们使用的是1bit滑动窗口协议,一次只发送一个帧,等收到ack确认才发下一个帧,这样对信道的利用率太低了。

因此提出了一种采用累积确认的连续ARQ协议,接收方不必对收到的帧逐个发送ack确认,而是收到几个帧后,对按序到达的最后一个帧发送ack确认。

同1bit滑动窗口协议相比,大大减少了ack数量,并消除了延迟ack对传输效率的影响。

但是,这会产生一个新的问题,如果发送方发送了5个帧,而中间的第3个帧丢失了。

这时接收方只能对前2个帧发出确认。

发送方无法知道后面三个帧的下落,只好把后面的3个帧再重传一次,这就是回退N协议。

为了解决这个问题,又提出了选择重传协议。

当接收方发现某帧出错后,继续接受后面送来的正确的帧,只是不交付它们,存放在自己的缓冲区中,并且要求发送方重传出错的那一帧。

滑动窗口协议

滑动窗口协议

滑动窗口协议协议名称:滑动窗口协议一、引言滑动窗口协议是一种用于数据通信的协议,旨在解决数据传输中的可靠性和流量控制问题。

本协议旨在确保数据的准确传输和接收,并通过控制发送方和接收方之间的数据流量,以提高通信效率。

二、协议目标本协议的目标是实现以下功能:1. 确保数据的可靠传输,防止数据丢失或损坏。

2. 控制发送方和接收方之间的数据流量,以避免数据拥塞和丢失。

3. 提供数据传输的顺序性,确保接收方按照发送方的顺序接收数据。

4. 提供错误检测和纠正机制,以确保数据的完整性和准确性。

三、协议流程1. 连接建立阶段:a. 发送方向接收方发送连接请求。

b. 接收方收到连接请求后,向发送方发送连接确认。

c. 发送方收到连接确认后,连接建立完成。

2. 数据传输阶段:a. 发送方将数据分割为固定大小的数据包,并按顺序编号。

b. 发送方将数据包发送给接收方,并启动计时器。

c. 接收方收到数据包后,发送确认信息给发送方。

d. 发送方收到确认信息后,将计时器停止,并发送下一个数据包。

e. 如果发送方在计时器超时前未收到确认信息,则重新发送该数据包。

f. 接收方收到数据包后,检查数据包的编号是否按顺序接收,如果不是,则丢弃该数据包。

g. 接收方将按顺序接收到的数据包组装成完整的数据。

3. 连接关闭阶段:a. 发送方向接收方发送连接关闭请求。

b. 接收方收到连接关闭请求后,发送确认信息给发送方。

c. 发送方收到确认信息后,连接关闭完成。

四、协议参数本协议使用以下参数来实现其功能:1. 滑动窗口大小:用于控制发送方发送的数据包数量。

2. 超时时间:用于控制发送方在未收到确认信息时重新发送数据包的时间间隔。

3. 序列号:用于标识数据包的顺序。

五、协议安全性为确保协议的安全性,可以采取以下措施:1. 加密传输:使用加密算法对数据进行加密,以防止数据被篡改或窃取。

2. 认证机制:使用认证机制对发送方和接收方进行身份验证,以确保通信双方的合法性。

滑动窗口协议

滑动窗口协议

滑动窗口协议协议名称:滑动窗口协议一、引言滑动窗口协议是一种用于数据传输的协议,它通过定义发送方和接收方之间的窗口大小和滑动窗口的移动来实现可靠的数据传输。

本协议的目的是确保数据在网络中的可靠传输,以满足任务名称中描述的需求。

二、术语定义1. 发送方:数据传输的发起方。

2. 接收方:数据传输的接收方。

3. 窗口大小:发送方和接收方之间的数据包传输窗口的最大容量。

4. 滑动窗口:发送方和接收方之间的可滑动的窗口,用于控制数据包的传输。

5. 序列号:数据包的唯一标识符,用于确保数据包的顺序传输。

三、协议规定1. 连接建立a. 发送方向接收方发送连接请求。

b. 接收方接收连接请求,并向发送方发送连接确认。

c. 发送方接收连接确认,连接建立成功。

2. 数据传输a. 发送方将数据分割为合适大小的数据包,并分配序列号。

b. 发送方将数据包发送给接收方。

c. 接收方接收数据包,并向发送方发送确认信息。

d. 发送方接收确认信息,并根据确认信息调整滑动窗口的大小和位置。

e. 发送方根据滑动窗口的位置重新发送未收到确认的数据包。

f. 接收方根据接收到的数据包的序列号将数据包按顺序组装。

3. 错误处理a. 发送方在超时时间内未收到确认信息,则重新发送未收到确认的数据包。

b. 接收方在收到重复的数据包时,丢弃重复的数据包并发送确认信息。

c. 发送方在收到确认信息时,确认接收方已正确接收数据包。

四、协议优化1. 滑动窗口大小的选择a. 根据网络状况和传输速度,动态调整滑动窗口的大小,以提高传输效率。

b. 可以使用拥塞控制算法来自动调整滑动窗口的大小,以防止网络拥塞。

2. 错误检测和纠正a. 可以使用校验和或循环冗余检测(CRC)来检测数据包的错误。

b. 可以使用前向纠错码(FEC)来纠正数据包的错误。

3. 流量控制a. 可以使用滑动窗口的大小和滑动窗口的移动来控制数据包的传输速率,以防止接收方无法及时处理大量数据包。

五、协议安全性1. 数据加密a. 可以使用加密算法对数据进行加密,以确保数据传输的安全性。

滑动窗口的仿真协议

滑动窗口的仿真协议

滑动窗口的仿真协议协议名称:滑动窗口的仿真协议一、引言本协议旨在模拟滑动窗口协议的工作原理,并通过仿真实验验证其可行性和性能。

滑动窗口协议是一种常用的数据传输协议,通过滑动窗口机制实现数据的可靠传输。

本协议将详细描述滑动窗口协议的设计原理、数据帧格式、窗口管理、错误控制等关键内容。

二、协议设计1. 数据帧格式数据帧由头部和数据两部分组成。

头部包含以下字段:- 序号:表示数据帧的序号,用于顺序传输和重传控制。

- 确认号:表示期望接收的下一个数据帧的序号。

- 标志位:用于标识数据帧的类型,如数据帧、确认帧等。

- 校验和:用于检测数据帧是否发生错误。

2. 窗口管理发送端维护一个发送窗口,接收端维护一个接收窗口。

发送窗口的大小由发送端和接收端协商确定,通常取决于网络的可靠性和带宽。

- 发送窗口:用于缓存待发送的数据帧,发送窗口的大小决定了发送端可以连续发送的数据帧数量。

- 接收窗口:用于缓存接收端期望接收的数据帧,接收窗口的大小决定了接收端可以接收的数据帧数量。

3. 数据传输流程1) 发送端将待发送的数据划分为若干数据帧,并按照序号顺序发送到接收端。

2) 发送端维护一个发送窗口,用于缓存待发送的数据帧。

发送窗口的大小决定了发送端可以连续发送的数据帧数量。

3) 接收端维护一个接收窗口,用于缓存接收端期望接收的数据帧。

接收窗口的大小决定了接收端可以接收的数据帧数量。

4) 发送端每发送一个数据帧,就等待接收端的确认帧。

如果在超时时间内未收到确认帧,则重传相应的数据帧。

5) 接收端收到数据帧后,检查序号是否与期望的序号一致。

如果一致,则将数据帧交给上层应用;如果不一致,则丢弃该数据帧,并向发送端发送相应的确认帧。

4. 错误控制为了保证数据的可靠传输,滑动窗口协议引入了错误控制机制。

- 超时重传:发送端在发送数据帧后,等待一段时间,如果在超时时间内未收到确认帧,则重传相应的数据帧。

- 累积确认:接收端发送的确认帧中的确认号表示期望接收的下一个数据帧的序号,发送端收到确认帧后,将确认号之前的所有数据帧都视为已成功传输,将发送窗口向前滑动。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机网络课程设计书计算机网络课程设计说明书(封面)学院名称:计算机与信息工程学院班级名称:网络工程一班学生姓名:学号:201321题目:滑动窗口协议仿真指导教师姓名:邵雪梅起止日期:2015.6.23-2015.6.29第一部分:正文部分一,选题背景早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。

由于大家不知道网络拥塞状况,一起发送数据,导致中间结点阻塞掉包,谁也发不了数据。

在数据传输过程中,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快,接收方就可能来不及接收,这就造成数据的丢失。

因此就有了滑动窗口机制来解决这些问题。

早期我们使用的是1bit滑动窗口协议,一次只发送一个帧,等收到ack确认才发下一个帧,这样对信道的利用率太低了。

因此提出了一种采用累积确认的连续ARQ协议,接收方不必对收到的帧逐个发送ack确认,而是收到几个帧后,对按序到达的最后一个帧发送ack确认。

同1bit滑动窗口协议相比,大大减少了ack数量,并消除了延迟ack对传输效率的影响。

但是,这会产生一个新的问题,如果发送方发送了5个帧,而中间的第3个帧丢失了。

这时接收方只能对前2个帧发出确认。

发送方无法知道后面三个帧的下落,只好把后面的3个帧再重传一次,这就是回退N协议。

为了解决这个问题,又提出了选择重传协议。

当接收方发现某帧出错后,继续接受后面送来的正确的帧,只是不交付它们,存放在自己的缓冲区中,并且要求发送方重传出错的那一帧。

一旦收到重传来的帧后,就可以将存于缓冲区中的其余帧一并按正确的顺序递交给主机。

本文主要介绍如何根据滑动窗口协议的原理,在Visual C++的平台上设计一个滑动窗口协议模拟程序,并最终使该程序得以实现。

本次程序设计分两部分:第一部分是发送方,第二部分是接收方。

通过发送方和接收方之间的数据帧传输模拟,学习滑动窗口协议控制流量的原理和方法,以及滑动窗口协议的工作机制。

二、设计理念2.1滑动窗口协议工作原理TCP滑动窗口用来暂存两台计算机间要传送的数据分组。

每台运行TCP协议的计算机有两个滑动窗口:一个用于数据发送,另一个用于数据接收。

发送端待发数据分组在缓冲区排队等待送出。

被滑动窗口框入的分组,是可以在未收到接收确认的情况下最多送出的部分。

滑动窗口左端标志X的分组,是已经被接收端确认收到的分组。

随着新的确认到来,窗口不断向右滑动。

滑动窗口算法工作过程如下:首先,发送方为每1帧赋一个序号(sequence number),记作SeqNum。

现在,我们忽略SeqNum是由有限大小的头部字段实现的事实,而假设它能无限增大。

发送方维护3个变量:发送窗口大小(send window size),记作SWS,给出发送方能够发送但未确认的帧数的上界; LAR表示最近收到的确认帧(last acknowledgement received)的序号;LFS表示最近发送的帧(last frame sent)的序号,发送方还维持如下的不变式:LAR-LFS≤SWS 。

2-1滑动窗口协议工作图窗口协议算法有三个功能:在不可靠链路上可靠地传输帧保持帧的传输顺序支持流量控制2.2 选择重传协议在选择重传协议中,当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。

一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。

这种方法称为选择重发(SELECTICE REPEAT),其工作过程如图所示。

显然,选择重发减少了浪费,但要求接收方有足够大的缓冲区空间。

2-2 选择重传协议原理图三、过程论述(1)发送方程序流程图:3-1发送方程序流程图(2)接收方程序流程图: 收到的包是否含收到包的序号与等待接收的序号是否收到包的序号在接收窗口范围N Y直接提取数据, Y入接收队列Y N 处理在接收队列中的包(如果是普通包要判断序号,或者进结束 N3-2接受方程序流程图3.2 功能实现(1)发送方程序:本程序设有四个变量:一是窗口大小变量,二是第一帧序列号变量,三是最近发送的帧变量,最后一个是最近收到的确认帧变量。

swpstate1.head=NULL; //变量初始值为空swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(structsen dq_slot);if(!swpstate1.sendq) exit(1);sendq_rear->next=NULL;printf("请输入窗口大小:");scanf("%ld",&swpstate1.sws); //输入窗口大小swpstate1.rws=swpstate1.sws; //把窗口大小的值赋给变量if (swpstate1.sws>0){printf("请输入第一帧的序列号:");scanf("%ld",&swpstate1.hdr.seqnum); //输入第一帧序列号}swpstate1.nfe=swpstate1.hdr.seqnum; //把第一帧的值放进缓冲池内sendp=(struct sendq_slot*) malloc (size of(struct sendq_slot));if(!sendp) exit(1);sendp->msg=swpstate1.hdr.seqnum;sendp->timeout=1;sendp->next=NULL;sendq_rear->next=sendp;sendq_rear=sendp;--swpstate1.sws;swpstate1.lfs=swpstate1.hdr.seqnum; //最近发送的帧取值r=swpstate1.hdr.seqnum; //最近收到的确认帧取值do{while(swpstate1.sws>0) //当窗口大小大于0时,执行以下的循环{sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot));if(!sendp) exit(1);sendp->msg=swpstate1.lfs+1; //如果输入的帧序号大于之前帧序号,那么窗口向前滑动sendp->timeout=1; //时延为1sendp->next=NULL;sendq_rear->next=sendp;sendq_rear=sendp;--swpstate1.sws;++swpstate1.lfs;}swpstate1.hdr.acknum=0; //ACK清空swpstate1.hdr.flags=0; //存储缓冲池清空printf("最近收到的ACK的帧序号:%ld\n",r);//输出最近收到的ACK帧序号printf("最近发送的帧序号(发送新帧后):%ld\n",swpstate1.lfs);//输出最近发送帧序号(2)接收方的接收原则从总体上看是先判断输入的数据帧是否在接收范围之内,若是,则继续判断是否符合其他接收条件;若不是,则马上丢弃该数据帧,不再进行其他条件的判断。

struct sendq_slot *sendq_rear,*sendp,*p3,*p4; //设定变量struct recvq_slot *recvp,*recvq_rear,*p1,*p2;if(swpstate1.hdr.flags==0)//上次输入的数据帧被放置在缓存区,输入区被清空{do //如果继续接收数据帧则实施下面循环{printf("请输入收到的数据帧号:");scanf("%ld",&a);if(a>=swpstate1.nfe&&a<=swpstate1.lfs) //判断数据帧应被接收或缓存{if(swpstate1.head==NULL){recvp=recvq_rear=(structrecvq_slot*)malloc(sizeof(structrecvq_slot));recvp->next=NULL;swpstate1.head=recvp;}elseif(swpstate1.head!=NULL){recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot));recvp->next=NULL;recvq_rear->next=recvp;recvq_rear=recvp;}}else{printf("所输数据不在接收窗口内!");break; //跳出该循环}(3)若输入数据帧在接收范围内则继续判断并进行以下循环。

recvp->msg=a;if(recvp->msg==swpstate1.nfe) //是否放入缓存判断recvp->received=1;elserecvp->received=0;--swpstate1.rws;if(recvp->received==1) //数据帧被接收,则进行下面语句{ a=a-1;do{ a=a+1;if(swpstate1.head==NULL)break;p1=swpstate1.head;flag=0;while((a!=p1->msg)&&(p1->next!=NULL)){p2=p1;p1=p1->next;}if(a==p1->msg){flag=1;if(p1==swpstate1.head)swpstate1.head=swpstate1.head->next;else p2->next=p1->next;swpstate1.nfe=a+1;swpstate1.hdr.acknum=a+1;swpstate1.hdr.flags=1;}}while(flag==1);}printf("ACK号(期待的下一帧的序号):%ld\n",swpstate1.nfe);printf("没按序接受的序号:\n");p1=swpstate1.head;while(p1!=NULL){printf("%ld\t",p1->msg);p1=p1->next;}(4)当接收完一个数据帧时,我们可以选择终止下面的继续接收,也可以选择继续接收。

相关文档
最新文档