滑动窗口的仿真协议
- 格式:doc
- 大小:261.00 KB
- 文档页数:16
滑动窗口协议协议名称:滑动窗口协议一、协议介绍滑动窗口协议是一种用于数据传输的协议,通过设置发送方和接收方的窗口大小,实现可靠的数据传输和流量控制。
本协议旨在确保数据的完整性和可靠性,提高数据传输的效率和可控性。
二、协议要求1. 数据传输的可靠性:确保数据在传输过程中不丢失、不损坏、不重复。
2. 流量控制:根据接收方的处理能力和网络状况,控制发送方的数据发送速率,避免数据拥塞。
3. 窗口管理:通过滑动窗口的机制,实现数据的分段发送和接收,提高数据传输的效率。
4. 错误检测和纠正:采用适当的错误检测和纠正机制,保证数据传输的准确性。
三、协议流程1. 发送方将待发送的数据分割为固定大小的数据段,并设置发送窗口的大小。
2. 发送方将数据段按照顺序发送给接收方,并启动定时器等待接收方的确认信息。
3. 接收方接收到数据段后,检查数据的完整性。
如果数据正确无误,则发送确认信息给发送方。
4. 发送方收到确认信息后,将发送窗口向前滑动一个位置,并继续发送下一个数据段。
5. 如果发送方在定时器超时前没有收到确认信息,则认为数据丢失,重新发送该数据段。
6. 接收方在收到重复的数据段时,丢弃重复数据并发送确认信息。
四、协议实现1. 窗口大小的选择:根据网络状况和接收方的处理能力,合理选择发送窗口和接收窗口的大小。
2. 序列号的分配:发送方为每个数据段分配一个唯一的序列号,接收方通过序列号确认接收到的数据段。
3. 确认机制:接收方在接收到数据段后,发送确认信息给发送方,确认已收到数据段。
4. 定时器机制:发送方设置定时器,超时后重新发送未收到确认的数据段。
5. 错误检测和纠正:采用适当的错误检测和纠正机制,如循环冗余校验(CRC)等。
五、协议优化1. 快速重传:接收方在收到连续的重复数据段时,立即发送确认信息,以提高数据传输效率。
2. 拥塞控制:根据网络拥塞的程度,动态调整发送窗口的大小,避免数据拥塞和丢失。
3. 流量控制:接收方通过发送窗口的大小,控制发送方的数据发送速率,防止数据过载。
滑动窗口协议引言在计算机网络中,滑动窗口协议是一种常用的数据传输协议,用于确保可靠的数据传输。
本文将介绍滑动窗口协议的基本概念、工作原理以及应用场景等内容。
滑动窗口协议的基本概念滑动窗口协议是一种基于窗口的流量控制协议。
在数据传输过程中,发送方和接收方都维护着一个固定大小的窗口,用于管理待发送的数据和已接收的数据。
滑动窗口协议的工作原理滑动窗口协议的工作原理可以简单地描述为以下几个步骤: 1. 发送方将待发送的数据分割成若干个数据包,并按顺序发送。
2. 接收方接收数据包,并发送确认信息给发送方。
3. 发送方收到确认信息后,将窗口向前滑动一个单位,继续发送下一个数据包。
4. 如果接收方未收到某个数据包,或者数据包有错误,将请求发送方重新发送该数据包。
滑动窗口协议的优势相比于其他传输协议,滑动窗口协议具有以下优势: 1. 可靠性:滑动窗口协议通过确认机制和重传机制,能够确保数据的可靠传输。
2. 流量控制:通过窗口大小的控制,滑动窗口协议可以有效控制数据传输的速率,避免数据的丢失和网络拥塞。
3. 高效性:滑动窗口协议支持并行发送多个数据包,提高了数据传输的效率。
滑动窗口协议的应用场景滑动窗口协议广泛应用于各种数据传输场景,包括但不限于: 1. 文件传输:在文件传输过程中,滑动窗口协议可以确保文件的完整性和正确性。
2. 视频流传输:通过滑动窗口协议,可以实现对视频流的实时传输和播放。
3. 数据库同步:在数据库同步过程中,滑动窗口协议可以确保数据的一致性和可靠性。
总结滑动窗口协议是一种常用的数据传输协议,通过窗口管理机制,实现了数据的可靠传输和流量控制。
它具有可靠性、高效性和流量控制等优势,并在文件传输、视频流传输和数据库同步等场景中得到广泛应用。
熟悉滑动窗口协议的工作原理和应用场景,对于网络通信的设计和优化具有重要意义。
滑动窗口协议协议名称:滑动窗口协议一、引言滑动窗口协议是一种用于数据传输的协议,其主要目的是在发送方和接收方之间建立可靠的数据传输通道。
该协议通过使用滑动窗口的概念来实现数据的流控制和错误恢复。
二、协议背景随着网络通信的发展,数据传输的可靠性和效率成为了重要的问题。
传统的数据传输方式存在着丢包、重传等问题,因此需要一种更可靠、高效的协议来解决这些问题。
滑动窗口协议应运而生。
三、协议原理1. 数据分段:发送方将要传输的数据按照一定的大小进行分段,并为每个数据段分配一个序号。
2. 窗口大小:发送方和接收方都维护一个滑动窗口,窗口大小表示当前可以发送或接收的数据段的数量。
3. 发送方操作:a. 发送窗口:发送方将窗口内的数据段发送给接收方,并等待接收方的确认。
b. 接收确认:接收到接收方的确认后,发送方将窗口滑动,并发送下一个窗口内的数据段。
c. 超时重传:如果发送方在一定时间内未收到接收方的确认,将会重传窗口内的数据段。
4. 接收方操作:a. 接收窗口:接收方接收到发送方发送的数据段后,将其存储在接收窗口中,并发送确认给发送方。
b. 确认重复:如果接收方收到重复的数据段,将会发送上一次确认的序号给发送方。
c. 有序交付:接收方将有序交付给上层应用的数据段,即按照序号顺序将数据段交付给应用层。
四、协议流程1. 发送方将要传输的数据按照一定的大小进行分段,并为每个数据段分配一个序号。
2. 发送方维护一个发送窗口,将窗口内的数据段发送给接收方,并等待接收方的确认。
3. 接收方接收到发送方发送的数据段后,将其存储在接收窗口中,并发送确认给发送方。
4. 发送方收到接收方的确认后,将窗口滑动,并发送下一个窗口内的数据段。
5. 如果发送方在一定时间内未收到接收方的确认,将会重传窗口内的数据段。
6. 接收方如果收到重复的数据段,将会发送上一次确认的序号给发送方。
7. 接收方将有序交付给上层应用的数据段,即按照序号顺序将数据段交付给应用层。
滑动窗口协议协议名称:滑动窗口协议一、引言滑动窗口协议是一种用于数据传输的协议,其主要目的是通过控制发送方和接收方之间的数据流量,实现可靠的数据传输。
本协议旨在确保数据的完整性、可靠性和顺序性,以满足任务要求。
二、协议概述滑动窗口协议基于数据包的发送和接收窗口的概念,通过动态调整窗口大小和确认机制来实现高效的数据传输。
发送方将数据划分为多个数据包,并按照顺序发送到接收方。
接收方通过发送确认消息来告知发送方已成功接收到数据包。
如果发送方未收到确认消息,将重传数据包,直到接收方正确接收到数据。
三、协议流程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. 数据分割:发送方将待传输的数据流分割为多个数据包,每个数据包的大小由发送方自行定义。
2. 窗口设置:发送方和接收方都设置一个滑动窗口,用于控制数据传输的流量。
3. 序列号:每个数据包都有一个唯一的序列号,用于标识数据包的顺序。
4. 确认应答:接收方收到数据包后,发送确认应答给发送方,以确认数据包的接收情况。
5. 超时重传:如果发送方在规定时间内未收到确认应答,则会将该数据包重新发送。
三、协议过程1. 发送方:a) 初始化:发送方设置窗口的大小、超时时间,并将待发送的数据流分割为多个数据包。
b) 发送数据:发送方将窗口内的数据包发送给接收方,并开始计时。
c) 等待确认:发送方等待接收方的确认应答,如果在超时时间内未收到应答,则进行超时重传。
d) 窗口滑动:当接收方发送确认应答时,发送方将窗口向前滑动,并发送窗口内的下一个数据包。
e) 数据重传:如果发送方在超时时间内未收到确认应答,则会将窗口内的所有数据包进行重传。
2. 接收方:a) 初始化:接收方设置窗口的大小,并准备接收数据。
b) 接收数据:接收方接收发送方发送的数据包,并发送确认应答给发送方。
c) 确认应答:接收方发送确认应答给发送方,以告知发送方数据包的接收情况。
d) 窗口滑动:当接收方接收到连续的数据包时,窗口向前滑动,并将接收到的数据传递给上层应用。
e) 数据重复:如果接收方收到重复的数据包,则丢弃该数据包,并重新发送上次确认应答。
四、协议特点1. 可靠性:滑动窗口协议通过确认应答和超时重传机制,确保数据的可靠传输。
2. 流量控制:发送方和接收方通过设置窗口大小,实现了对数据传输的流量控制,避免了网络拥塞。
3. 效率:滑动窗口协议通过窗口滑动和数据分割,提高了网络传输的效率,减少了传输延迟。
滑动窗口协议实验报告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第一部分:正文部分一,选题背景早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。
实验四滑动窗口协议1、实验目的(1)掌握滑动窗口协议的概念、原理与基本算法。
(2)理解3种典型的数据链路层滑动窗口协议:l位滑动窗口协议、使用退后n帧的滑动窗口协议与使用选择性重传的滑动窗口协议。
(3)了解传输层与数据链路层滑动窗口协议的区别与联系,了解TCP滑动窗口协议的实现原理。
2、实验要求编程实现使用选择性重传策略的滑动窗口协议模拟程序:(1)所有功能应可视,具有简单的界面。
(2)由一台PC向另一台PC发送数据包,界面中应动态显示数据帧的发送和接收情况,以表明协议模拟程序的正确运作过程。
(3)当发送方速度过快或帧丢失时,接收方应发送消息,要求暂停或者重传。
接收方应按序向网络层提交接收到的帧。
(4)发送方应可设置发送速度、滑动窗口数目、停止等待等的超时时间间隔以及发送类型(用于模拟信道错误如正常发送,帧校验错,帧丢失)等参数。
3、实验环境微机一台、Visual Studio 6.0集成开发环境。
4、实验相关知识滑动窗口协议的流量控制:发送方窗口内的序列号代表已经发送但尚未确认的帧,一旦窗口达到最大值,发送方的数据链路层必须强行关闭网络层直到有一帧缓冲区可用为止。
接收方数据链路层的窗口对应于允许接收的帧。
任何落在接收窗口之外的帧都不加说明地丢弃。
滑动窗口协议的差错控制:使用后退n帧技术:接收端丢弃出错帧后所有的帧,而不管这些帧是正确的还是出错的;对应于接收窗口的尺寸为1的情况;如果信道错误率高,将会浪费大量的带宽。
选择性重传策略:信道出错时,接收方将存储所有跟在坏帧之后的正确帧,并只要求发送方重传出错的帧;对应于接收窗口大于1的情况。
两种差错控制策略的收发过程比较:5 系统实施5.1程序的主要流程图5.2主要过程关于发送端网络层数据流量的模拟:为了使协议模拟尽量简化,事先做两个假设:假设1:发送方的网络层总有数据需要发送;假设2:接收方没有反向流量,因此不能捎带确认,每次等待辅助定时器超时之后发送一个单独的确认帧(ACK或NAK)。
计算机网络课程设计书计算机网络课程设计说明书(封面)学院名称:计算机与信息工程学院班级名称:网络工程一班学生姓名:学号: 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)接收方程序流程图:3-2接受方程序流程图3.2 功能实现(1)发送方程序:本程序设有四个变量:一是窗口大小变量,二是第一帧序列号变量,三是最近发送的帧变量,最后一个是最近收到的确认帧变量。
swpstate1.head=NULL; //变量初始值为空swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(structsendq_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)当接收完一个数据帧时,我们可以选择终止下面的继续接收,也可以选择继续接收。
如果继续接收,那么程序跳到判断循环,继续判断是否接收下一个数据帧,原理与上面相当。