滑动窗口的仿真协议
滑动窗口的仿真协议

滑动窗口的仿真协议协议名称:滑动窗口的仿真协议一、引言本协议旨在定义滑动窗口的仿真协议,用于模拟网络通信中滑动窗口协议的行为和性能。
滑动窗口协议是一种流行的数据传输协议,用于实现可靠的数据传输。
通过仿真滑动窗口协议,我们可以评估协议的性能,并进行性能优化。
二、背景滑动窗口协议是一种基于窗口机制的数据传输协议,常用于计算机网络中。
其核心思想是发送方和接收方通过维护一个窗口来实现流量控制和错误恢复。
滑动窗口协议具有高效、可靠和灵活等特点,因此被广泛应用于各种网络通信场景。
三、目的本协议的目的是定义滑动窗口的仿真协议,用于模拟滑动窗口协议的行为和性能。
通过仿真,我们可以评估滑动窗口协议在不同条件下的性能表现,包括吞吐量、延迟、丢包率等指标。
同时,我们可以通过仿真结果来优化滑动窗口协议的设计和参数配置。
四、协议内容1. 协议参与方:- 发送方:模拟数据发送方,负责发送数据包并维护滑动窗口。
- 接收方:模拟数据接收方,负责接收数据包并发送确认信息。
- 网络模拟器:模拟网络环境,包括延迟、丢包等特性。
2. 协议流程:a. 发送方将数据包划分为多个固定大小的数据块,并按序号进行编号。
b. 发送方维护一个发送窗口,窗口大小为W,初始时窗口为空。
c. 发送方按顺序发送窗口内的数据包,同时启动定时器。
d. 接收方接收数据包,并发送确认信息。
e. 发送方收到确认信息后,将对应的数据包从发送窗口中移除,并滑动窗口。
f. 若发送方未收到确认信息,定时器超时,发送方重新发送窗口内的数据包。
g. 若接收方未收到期望的数据包,发送方重新发送该数据包。
h. 协议持续运行,直到所有数据包都被正确接收或达到最大重传次数。
3. 参数配置:- 数据包大小:定义数据包的大小,影响传输效率和网络利用率。
- 窗口大小:定义发送窗口的大小,影响流量控制和吞吐量。
- 超时时间:定义定时器的超时时间,影响错误恢复和延迟。
- 最大重传次数:定义最大重传次数,用于控制错误恢复的次数。
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. 实验总结本次实验通过编写模拟程序,深入理解了滑动窗口协议的工作原理及其在数据传输中的应用。
滑动窗口协议通过窗口的滑动机制,实现了对数据传输过程的控制和管理,从而保证了数据的可靠性和传输效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)当接收完一个数据帧时,我们可以选择终止下面的继续接收,也可以选择继续接收。