滑动窗口的仿真协议
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. 接收方接收数据包,并发送确认信息给发送方。
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. 实验总结本次实验通过编写模拟程序,深入理解了滑动窗口协议的工作原理及其在数据传输中的应用。
滑动窗口协议通过窗口的滑动机制,实现了对数据传输过程的控制和管理,从而保证了数据的可靠性和传输效率。
滑动窗口协议

实验目的
实现滑动窗口协议中的1bit滑动窗口协议,提供系统调用接口函 数
实验原理
滑动窗口协议(Sliding Window Protocol),属于TCP协议 的一种应用,用于网络数据传输时的流量控制,以避免拥塞 的发生。该协议允许发送方在停止并等待确认前发送多个数 据分组。由于发送方不必每发一个分组就停下来等待确认, 因此该协议可以加速数据的传输,提高网络吞吐量。
帧丢失测试
帧丢失测试—发送端
帧丢失测试—接收端
发送及接收过程
同帧校验和错误类似,帧丢失错误同样会引发接收端回送 nak否定应答消息。不同的是,nak否定应答帧是在丢失帧 的下一帧收到后发出的。如图5所示,由于传输过程中2号帧 丢失,接收端在收到1号帧后,接下来收到了3号帧,这时, 接收端知道由于某种原因2号帧丢失了,于是立即发送了2号 帧的否定应答帧。在发送端收到该nak2帧后,也马上重传了 该帧,nak机制同样加快了对丢失帧的重传操作。
程序没有模拟信道发生随机错误的情况,如果需要读者可以使用伪随机 函数自己添加这部分模拟代码。
帧校验错测试
在做新的测试前,首先将发送端和接收端进行重置,即两端 都先停止再重新开始,然后再做后续测试(如果需要,停止 后可以修改相关参数)。
帧校验错测试—发送端
帧校验错测试—接收端
发送及接收过程
通过手工设置2号帧的校验和错误来模拟信道传输中的误码 情况。可以看到接收方在收到2号错误帧后马上向发送方回 送了一个nak2的否定应答帧,发送方在收到nak2后也立即 重传了该帧,因此nak机制加速了错误帧的重传过程(否则 如果接收方直接丢弃的话,就只能等到发送方2号帧的重发 定时器超时后进行重传)
发送程序界面,同样有4个功能区
- 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)接收方程序流程图: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)当接收完一个数据帧时,我们可以选择终止下面的继续接收,也可以选择继续接收。
如果继续接收,那么程序跳到判断循环,继续判断是否接收下一个数据帧,原理与上面相当。