数据链路层滑动窗口协议的设计和实现样本

合集下载

滑动窗口

滑动窗口
从这里不难看出,后退n协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已 正确传送过的数据帧进行重传(仅因这些数据帧之前有一个数据帧出了错),这种做法又使传送效率降低。由此 可见,若传输信道的传输质量很差因而误码率较大时,连续测协议不一定优于停止等待协议。此协议中的发送窗 口的大小为k,接收窗口仍是1。
滑动窗口协议是用来改善吞吐量的一种技术,即容许发送方在接收任何应答之前传送附加的包。接收方告诉 发送方在某一时刻能送多少包(称窗口尺寸)。
TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。 发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据 包,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情 况是发送方可以发送一个1字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
应用场景
滑动窗口协议以基于分组的数据传输协议为特征。因此该协议适用于对按顺序传送分组的可靠性要求较高的 环境,例如在数据链路层(OSI模型)以及传输控制协议(TCP)中。
增强应答的链路层重传,在长线传输中,因软故障造成的消息传输错误占据了绝大部分,对于这些问题的解 决可以是系统的可靠性大大提高。这种机制,向通过实现简单、检突发错误能力高的CRC码的校验进行错误检查, 再由相应的滑动窗口协议实现重传恢复 。
在后退n协议中,接收方若发现错误帧就不再接收后续的帧,即使是正确到达的帧,这显然是一种浪费。另一 种效率更高的策略是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但 接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后, 就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。这种方法称为选择重发(SELECTICE REPEAT), 其工作过程如图所示。显然,选择重发减少了浪费,但要求接收方有足够大的缓冲区空间。

滑动窗口协议

滑动窗口协议

滑动窗口协议协议名称:滑动窗口协议一、引言滑动窗口协议是一种用于数据传输的协议,其主要目的是在发送方和接收方之间建立可靠的数据传输通道。

该协议通过使用滑动窗口的概念来实现数据的流控制和错误恢复。

二、协议背景随着网络通信的发展,数据传输的可靠性和效率成为了重要的问题。

传统的数据传输方式存在着丢包、重传等问题,因此需要一种更可靠、高效的协议来解决这些问题。

滑动窗口协议应运而生。

三、协议原理1. 数据分段:发送方将要传输的数据按照一定的大小进行分段,并为每个数据段分配一个序号。

2. 窗口大小:发送方和接收方都维护一个滑动窗口,窗口大小表示当前可以发送或接收的数据段的数量。

3. 发送方操作:a. 发送窗口:发送方将窗口内的数据段发送给接收方,并等待接收方的确认。

b. 接收确认:接收到接收方的确认后,发送方将窗口滑动,并发送下一个窗口内的数据段。

c. 超时重传:如果发送方在一定时间内未收到接收方的确认,将会重传窗口内的数据段。

4. 接收方操作:a. 接收窗口:接收方接收到发送方发送的数据段后,将其存储在接收窗口中,并发送确认给发送方。

b. 确认重复:如果接收方收到重复的数据段,将会发送上一次确认的序号给发送方。

c. 有序交付:接收方将有序交付给上层应用的数据段,即按照序号顺序将数据段交付给应用层。

四、协议流程1. 发送方将要传输的数据按照一定的大小进行分段,并为每个数据段分配一个序号。

2. 发送方维护一个发送窗口,将窗口内的数据段发送给接收方,并等待接收方的确认。

3. 接收方接收到发送方发送的数据段后,将其存储在接收窗口中,并发送确认给发送方。

4. 发送方收到接收方的确认后,将窗口滑动,并发送下一个窗口内的数据段。

5. 如果发送方在一定时间内未收到接收方的确认,将会重传窗口内的数据段。

6. 接收方如果收到重复的数据段,将会发送上一次确认的序号给发送方。

7. 接收方将有序交付给上层应用的数据段,即按照序号顺序将数据段交付给应用层。

计算机网络--滑动窗口实验报告

计算机网络--滑动窗口实验报告

计算机网络--滑动窗口实验报告计算机网络滑动窗口协议实验报告目录一、实验内容和实验环境描述(2)1.实验内容(2)2.实验目的(2)3.实验环境(2)二、协议设计(3)三、软件设计(4)Part A 选择重传协议1.数据结构(4)2.模块结构(6)3.算法流程(7)Part B gobackn协议 1.数据结构(8)2.模块结构(9)3.算法流程(10)四、实验结果分析(11)五、探究问题(13)六、实验总结与心得体会(14)一、实验内容和实验环境描述1.实验内容利用所学数据链路层原理,自己设计一个滑动窗口协议,在仿真环境下编程实现有噪音信道环境下两站点之间无差错双工通信。

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

2.实验目的通过该实验,进一步巩固和深刻理解数据链路层误码检测的CRC校验技术,以及滑动窗口的工作机理。

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

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

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

3.实验环境Windows10环境PC机Microsoft Visual Studio 2017集成开发环境二、协议设计本次试验主要设计数据链路层,实验中分别设计了gobackn协议与选择重传协议。

主要涉及到的层次结构是物理层、数据链路层、网络层。

物理层:为数据链路层提供的服务为8000bps,270ms传播延时,10?5误码率的字节流传输通道。

数据链路层利用接口函数send_frame()和 recv_frame()从物理层发送和接收一帧。

实验一:数据链路层滑动窗口协议的设计与实现

实验一:数据链路层滑动窗口协议的设计与实现

目录实验一:数据链路层滑动窗口协议的设计与实现 (3)1实验类别 (3)2实验内容和实验目的 (3)3实验学时 (3)4实验组人数 (3)5实验设备环境 (3)6教学要点与学习难点 (3)7实验步骤 (4)7.1 熟悉编程环境 (4)7.2 协议设计和程序总体设计 (4)7.3 编码和调试 (4)7.4 软件测试和性能评价 (4)7.5 实验报告及程序验收 (4)8编程环境 (5)8.1 程序的总体结构 (5)8.2 实验环境所提供的文件和编译运行方法 (6)8.3 日志 (7)8.4 协议运行环境的初始化 (8)8.5 与网络层模块的接口函数 (9)8.6 事件驱动函数及程序流程 (9)8.7 与物理层模块的接口函数 (11)8.8 CRC校验和的产生与验证 (11)8.9 定时器管理 (12)8.10 协议工作过程的跟踪和调试 (12)8.11 命令行选项 (13)8.12 错误信息 (14)9 正确性测试及性能测试 (15)10可研究与探索的问题 (15)10.1 CRC校验和的计算 (15)10.2 CRC校验能力 (16)10.3 协议软件的设计与测试 (16)10.4 协议改进 (16)10.5 对等协议实体之间的流量控制 (16)10.6 与标准协议的对比 (16)11实验报告要求 (17)11.1 实验内容和实验环境描述 (17)11.2 协议设计 (17)11.3 软件设计 (17)11.4 实验结果分析 (17)11.5 研究和探索的问题 (18)11.6 实验总结和心得体会 (18)11.7 源程序清单 (18)附录一源程序书写格式 (19)实验一:数据链路层滑动窗口协议的设计与实现1实验类别程序设计型2实验内容和实验目的利用所学数据链路层原理,自己设计一个滑动窗口协议并在仿真环境下编程实现有噪音信道环境下的可靠的双工通信。

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

滑动窗口协议的模拟

滑动窗口协议的模拟

计算机网络课程设计报告滑动窗口协议的模拟姓名:学号:专业:信息工程指导教师:2010年11月17日目录一.实验目的 (3)二.实验原理 (3)三.实验代码以及代码说明 (5)四.总结 (10)五.参考文献 (10)滑动窗口协议的模拟一.实验目的:《计算机网络》是一项实践教学内容。

通过本课程的学习使学生掌握计算机网络的的理论知识,然后通过实际动手实现课程设计的要求,使课堂所学能应用到实际应用当中,以此来巩固理论知识,提高解决问题,完成工程的能力。

二.实验原理:(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. 数据分割:发送方将待传输的数据流分割为多个数据包,每个数据包的大小由发送方自行定义。

2. 窗口设置:发送方和接收方都设置一个滑动窗口,用于控制数据传输的流量。

3. 序列号:每个数据包都有一个唯一的序列号,用于标识数据包的顺序。

4. 确认应答:接收方收到数据包后,发送确认应答给发送方,以确认数据包的接收情况。

5. 超时重传:如果发送方在规定时间内未收到确认应答,则会将该数据包重新发送。

三、协议过程1. 发送方:a) 初始化:发送方设置窗口的大小、超时时间,并将待发送的数据流分割为多个数据包。

b) 发送数据:发送方将窗口内的数据包发送给接收方,并开始计时。

c) 等待确认:发送方等待接收方的确认应答,如果在超时时间内未收到应答,则进行超时重传。

d) 窗口滑动:当接收方发送确认应答时,发送方将窗口向前滑动,并发送窗口内的下一个数据包。

e) 数据重传:如果发送方在超时时间内未收到确认应答,则会将窗口内的所有数据包进行重传。

2. 接收方:a) 初始化:接收方设置窗口的大小,并准备接收数据。

b) 接收数据:接收方接收发送方发送的数据包,并发送确认应答给发送方。

c) 确认应答:接收方发送确认应答给发送方,以告知发送方数据包的接收情况。

d) 窗口滑动:当接收方接收到连续的数据包时,窗口向前滑动,并将接收到的数据传递给上层应用。

e) 数据重复:如果接收方收到重复的数据包,则丢弃该数据包,并重新发送上次确认应答。

四、协议特点1. 可靠性:滑动窗口协议通过确认应答和超时重传机制,确保数据的可靠传输。

2. 流量控制:发送方和接收方通过设置窗口大小,实现了对数据传输的流量控制,避免了网络拥塞。

3. 效率:滑动窗口协议通过窗口滑动和数据分割,提高了网络传输的效率,减少了传输延迟。

滑动窗口协议

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

滑动窗口协议

滑动窗口协议

网络课第一次上机实验报告------滑动窗口协议实验内容在一个数据链路层的模拟实现环境中,用C(C++)语言实现下面三个数据链路层协议。

① 1 比特滑动窗口协议②回退N 帧滑动窗口协议③选择性重传协议实验过程对于MSG_TYPE_TIMEOUT 消息,pBuffer 指向数据的前四个字节为超时帧的序列号,以UINT32 类型存储;对于MSG_TYPE_SEND 和MSG_TYPE_RECEIVE 类型消息,pBuffer指向的数据的结构如以下代码中frame 结构的定义:其中,保存在发送队列和等待确认队列的bufferItem结构定义如下:● 1 比特滑动窗口协议通过switch语句对参数messageType进行判断,如果是MSG_TYPE_SEND,表示发送端需要发送帧,将要发送的帧通过结构体bufferItem(pframe指针)存入发送队列(myQueue)中,若发送窗口未满(即full为false),则打开一个窗口,并将调用SendFRAMEPacket函数将myQueue队首的帧发送并在myQueue中弹出,加入到waitToAck 队列中,否则,不做任何处理;若参数messageType是MSG_TYPE_RECEIVE,检查ACK 值后,将该ACK 对应的窗口关闭。

此时,如果发送队列不为空,则取出myQueue队首的帧,并调用SendFRAMEPacket 函数将帧发送并在myQueue中弹出,加入到waitToAck队列中,否则,置full为false,表示窗口未满;若参数messageType是MSG_TYPE_TIMEOUT,即告知某帧超时,在等待确认队列(waitToAck)中找出对应帧,并通过调用SendFRAMEPacket函数将该帧重发。

●回退N 帧滑动窗口协议基本过程同1 比特滑动窗口协议,通过switch语句对参数messageType进行判断,如果是MSG_TYPE_SEND,表示发送端需要发送帧,将要发送的帧通过结构体bufferItem (pframe指针)存入发送队列(myQueue)中,若发送窗口未满(即waitToAck的大小没有达到WINDOW_SIZE_BACK_N_FRAME),则打开一个窗口,并将调用SendFRAMEPacket 函数将myQueue队首的帧发送并在myQueue中弹出,同时加入到waitToAck队列的队首,即vector的begin位置,否则,不做任何处理;若参数messageType是MSG_TYPE_RECEIVE,通过循环在waitToAck中找到确认帧对应的发送帧序列号。

实验二 数据链路层协议分析

实验二  数据链路层协议分析

实验二以太网链路层帧格式分析一实验目的1、分析EthernetV2标准规定的MAC层帧结构,了解IEEE802.3 标准规定的MAC层帧结构和TCP/IP的主要协议和协议的层次结构。

2、掌握网络协议分析软件的基本使用方法。

3、掌握网络协议编辑软件的基本使用方法。

二实验内容1、学习网络协议编辑软件的各组成部分及其功能;2、学习网络协议分析软件的各组成部分及其功能;3、学会使用网络协议编辑软件编辑以太网数据包;4、理解 MAC 地址的作用;5、理解 MAC 首部中的 LLC—PDU 长度/类型字段的功能;6、学会观察并分析地址本中的 MAC 地址。

三实验环境四实验流程五实验原理在物理媒体上传输的数据难免受到各种不可靠因素的影响而产生差错,为了弥补物理层上的不足,为上层提供无差错的数据传输,就要能对数据进行检错和纠错。

数据链路的建立、拆除、对数据的检错,纠错是数据链路层的基本任务。

局域网(LAN)是在一个小的范围内,将分散的独立计算机系统互联起来,实现资源的共享和数据通信。

局域网的技术要素包括了体系结构和标准、传输媒体、拓扑结构、数据编码、媒体访问控制和逻辑链路控制等,其中主要的技术是传输媒体、拓扑结构和媒体访问控制方法。

局域网的主要的特点是:地理分布范围小、数据传输速率高、误码率低和协议简单等。

1、三个主要技术1) 传输媒体:双绞线、同轴电缆、光缆、无线。

2) 拓扑结构:总线型拓扑、星型拓扑和环型拓扑。

3) 媒体访问控制方法:载波监听多路访问/冲突检测(CSMA/CD)技术。

2、IEEE 802 标准的局域网参考模型IEEE 802 参考模型包括了 OSI/RM 最低两层(物理层和数据链路层)的功能,OSI/RM 的数据链路层功能,在局域网参考模型中被分成媒体访问控制MAC(Medium Access Control) 和逻辑链路控制LLC(Logical Link Control)两个子层。

由于局域网采用的媒体有多种,对应的媒体访问控制方法也有多种,为了使数据帧的传送独立于所采用的物理媒体和媒体访问控制方法,IEEE 802 标准特意把 LLC 独立出来形成单独子层,使 LLC 子层与媒体无关,仅让 MAC 子层依赖于物理媒体和媒体访问控制方法。

滑动窗口协议

滑动窗口协议

实验四滑动窗口协议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)。

信息与通信工程-2015000275-朱家磊滑动窗口协议分析

信息与通信工程-2015000275-朱家磊滑动窗口协议分析

A sends(0,1,A0)
A gets(0,0,B0) A sends(1,0,A1)
A gets(1,1,B1) A sends(0,1,A2)
A gets(0,0,B2) A sends(1,0,A3)
B gets(0,1,A0) B sends(0,0,B0)
B gets(1,0,A1) B sends(1,1,B1)
该策略对应接收窗口为1的情况,即只能按顺序接收帧,当发送进
程超时后,必须按顺序重传所有未被确认的帧,如图:
缺陷:
一旦数据帧丢失,在发送端意识到丢失(TimeOut)时,已 经有大量的数据帧到达接收端,被丢弃。这样如果错误率高 的话,这种方法会浪费很多带宽,但对内存需求不大。
第二种方法:称为选择重传协议(SR)(对应接收窗口大于1的情 况)
第三章(第四部分)
滑动窗口协议
数据链路层主要解决三个问题
成帧 校验,重发 流量控制 协议1,2,3属于单工通信且信道利用率很低,但在实 际中双工通信更加实用。
滑动窗口协议
协议4:1位滑动窗口协议 协议5:回退N协议 协议6:选择重传协议
滑动窗口协议的要点:
任何时刻发送进程都要维护一组帧序号,对应于 一组已经发送但尚未被确认的帧,这些帧称为落在 发送窗口内;
当管道化技术建立在不可靠的信道上时会有一些问题
比如,如果位于帧流中的某个帧丢失或损坏了,会发生 什么情况---在发送进程发现出错前,大量的后继帧 会到达接收方;当一个坏帧到达接收方时,显然会被接 收方丢弃,那么后面到来的帧如何处理?
用以下两种方法来处理上面的问题: 发送窗口>1,接收窗口=1 第一种方法:称为 go back n(回退n帧)方法 接收进程从出错帧起丢弃所有的后继帧,并且不通知发送进程。

网络实验091220033_lab01

网络实验091220033_lab01

《计算机网络协议开发》实验报告第一次实验:滑动窗口协议实验姓名:葛鑫学号:0912200332009 级计算机系一班邮箱:xingenju@时间:2012/2/26一、实验目的在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号帧。

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

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

滁州学院课程设计报告课程名称:计算机网络设计题目:滑动窗口协议仿真系别:计算机与信息工程学院专业:计算机科学与技术组别:第五组起止日期: 2011年11月24日~2011年12月7日指导教师:赵国柱计算机与信息工程学院二○一一年制课程设计任务书一. 引言二. 基本原理2.1 窗口机制2.2 1bit滑动窗口协议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协议。

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

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

滑动窗口协议实验报告

滑动窗口协议实验报告

滑动窗口协议实验报告篇一:实验二滑动窗口协议实验报告2<滑动窗口协议的模拟>项目设计报告作者:完成日期:签收人:签收日期:1 需求分析实验目的:加深对滑动窗口协议的理解实验任务:实现对于滑动窗口协议的模拟实验环境:PC机操作系统:Windows XP开发环境:Microsoft Visual C++ ,可以使用MFC类库问题重述界面要求:项目要求的所有功能应可视,要有简单的界面。

由一台PC(或线程)向另一台PC (或线程)发送数据包时,界面应显示出双方帧个数的变化,帧序号,发送和接受速度,暂停或重传提示等,界面中必须动态显示数据帧的发送和接受情况,包括在相应的窗口详细显示相应的ACK和其他收发数据帧后发出的消息,以表明模拟协议的正确运作过程。

在各种情况下,接受方和发送方窗口应实时显示帧的发送和接受情况,包括序号,时间戳,内容等。

以及窗口的填充和清空情况。

网络接口要求:两台机器或是一台机器中两个独立的线程模拟发送方与接受方,接收数据的端口初始应为监听状态。

发送方向接受方发起连接,成功后开始发送数据。

接受方要求:接受方应由固定大小的滑动窗口,并对收到信息缓存。

当发送方速度过快或帧丢失(超时),接受方应发送消息,要求暂停或是重传(停---等协议)。

接受方要求按序向网络层提交收到的帧。

发送方要求:发送方发送速度可以调节,并可以暂停或是重发。

发送方重传时可仅重传需要的帧。

可指定滑动窗口数目和要发送的帧的总数,停等的超时时间间隔以及发送类型(正常发送,错序发送,以及缺帧,丢帧的现象),发送速率等参数。

2 概要设计原理概述发送方和接受方都维持了一个窗口,窗口内部包含了那些可以接受的序列号。

发送方的窗口大小从0开始,以后可以增大到某一个预设的最大值。

由于发送方可能在将来的某个时刻重传未被确认的帧,所以它必须把已经送出去的帧保留一段时间,直到他知道接受方已经接受了这些帧。

当第n帧的确认到来时,第n-1,第n-2等也都被自动地确认了。

(完整word版)滑动窗口协议报告 (2)

(完整word版)滑动窗口协议报告 (2)

滑动窗口协议设计报告滑动窗口协议设计1、引言随着网络的不断壮大,用户数量、信息量的需求不断增加,网络负荷越来越重。

此时,我们迫切需要一种机制来控制网络的流量,减少网络拥堵的几率,提高传输的效率。

因此,一种名为滑动窗口的协议应运而生。

滑动窗口协议,是TCP使用的一种流量控制方法。

该协议允许发送方在停止并等待确认前可以连续发送多个分组。

由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。

经测试证明,该协议还能有效地解决TCP的高协议处理开销和UDP的低可靠性之间的矛盾。

2、实验目的基本原理2.1 窗口机制滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。

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

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

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

接受方为其窗口内的每一个序号保留了一个缓冲区。

与每个缓冲区相关联的还有一位,用来指明该缓冲区是满的还是空的。

3、实验原理TCP滑动窗口用来暂存两台计算机问要传送的数据分组。

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

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

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

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

随着新的确认到来,窗口不断向右滑动4、实验代码#include<stdio.h>#include <stdlib.h>#include <windows.h>//加这个头文件#include <windowsx.h>#include <iostream>#include <winsock.h>#include<conio.h>#include<time.h>#include <math.h>#define NULL 0#define MAX_LENGTH 2000#define RECEIVE_MAX_LENGTH 1500#define SEND_MAX_LENGTH 1500#define TIMEOUT 1#define WSA_WAIT_TIMEOUT -1#define MAXPOOL 100#define SLEEPMS 1000#define SOCKET_DISCONN 0#pragma comment(lib,"ws2_32.lib")#pragma warning(disable:4996)typedef enum { data = 1, ack, nak, tout } frame_kind; //帧类型CRITICAL_SECTION gCS;int socketClient;int ret;typedef struct frame_head{frame_kind kind; //帧类型unsigned int seq; //序列号unsigned int ack; //确认号unsigned char data[MAX_LENGTH]; //数据}Head;typedef struct frame{frame_head head; //帧头unsigned int size; //数据的大小} Frame;typedef struct framenode //队列节点类型{frame head_data;struct framenode *next;} Framenode;typedef struct{Framenode *front; //队头指针Framenode *rear; //队尾指针} LinkQueue;void InitLine(LinkQueue *q){q->front = q->rear =NULL;}int QueueEmpty(LinkQueue *q){return q->front == NULL && q->rear == NULL; }frame QueueFront(LinkQueue *q){if (QueueEmpty(q)){printf("队列为空!\n");Sleep(SLEEPMS);exit(0);}return q->front->head_data;}int QueueLen(LinkQueue *q){if (QueueEmpty(q)){return 0;}int num = 0;Framenode *p = q->front;while (p != NULL){num++;p = p->next;}return num;}void GetFrameFromHost(LinkQueue *q){if (QueueLen(q) >= MAXPOOL){printf("data %d 已准备好\n", q->front->head_data.head.seq);return;}Framenode *p = (Framenode *)malloc(sizeof(Framenode));memset(p->head_data.head.data, 0, MAX_LENGTH);srand((unsigned)time(NULL));p->head_data.size = rand() % MAX_LENGTH; // 帧大小随机生成memset(p->head_data.head.data, '1', p->head_data.size);p->head_data.head.ack = -1;p->head_data.head.kind = data;p->head_data.head.seq = 0;p->next = NULL;if (QueueEmpty(q))q->front = q->rear = p; // 首帧是待发送的帧else{p->head_data.head.seq = (q->rear->head_data.head.seq + 1) % MAXPOOL;q->rear->next = p;q->rear = p;}printf("从主机得到:data %d,放入缓存\n", p->head_data.head.seq);GetFrameFromHost(q); // 由于实验需要,假设主机有足够多的数据帧要发送}void DeLine(LinkQueue *q){Framenode *p = NULL;if (QueueEmpty(q)){printf("队列为空!\n");}else{p = q->front;q->front = p->next;if (q->rear == p) q->rear = NULL;printf("发送data %d, %d 成功!从缓存中删除\n", p->head_data.head.seq, p->head_data.size);free(p);p = NULL;}}void main(){printf("建立连接 ... \n");Begin:WORD wVersionRequested;DWORD WINAPI ReceiveFun(LPVOID pParam);WSADATA wsaData; //初始化socket库wVersionRequested = MAKEWORD(1, 1); //两个byte型合并成一个WORD型int err = WSAStartup(wVersionRequested, &wsaData);if (err != 0){Sleep(SLEEPMS);return;}if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){WSACleanup(); //中止Windows Sockets服务 WSAStartup()成对使用Sleep(SLEEPMS);return;}socketClient = socket(AF_INET, SOCK_STREAM, 0);//监听的套接字SOCKADDR_IN clientadd;clientadd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");clientadd.sin_family = AF_INET;clientadd.sin_port = htons(7001);//设置连接端的IP、端口if (SOCKET_ERROR ==connect(socketClient, (SOCKADDR*)&clientadd, sizeof(SOCKADDR))) //连接{WSACleanup();Sleep(SLEEPMS);goto Begin;}char getData[RECEIVE_MAX_LENGTH];memset(getData, 0, RECEIVE_MAX_LENGTH); //清零if (recv(socketClient, getData, RECEIVE_MAX_LENGTH, 0) == SOCKET_ERROR) //接受printf("接受连接提示信息出错!\n");}else{printf("%s\n", getData);}char sendData[SEND_MAX_LENGTH];memset(sendData, 0, SEND_MAX_LENGTH);strcpy(sendData, "你好接收方,我是发送方!");if (SOCKET_ERROR == send(socketClient, sendData, strlen(sendData) + 1, 0)) //发送{printf("发送连接提示信息出错!\n");WSACleanup();closesocket(socketClient);Sleep(SLEEPMS);return;}printf("按任意键继续!\n");while (!kbhit()) {}; //等待开始Sleep(SLEEPMS);printf("1bit滑动窗口协议:发送方,发送窗口=1\n");LinkQueue QueueQ;InitLine(&QueueQ);frame packetsend; //dataframe packetreceive; // ack,nakunsigned long tick = GetTickCount();int ret = 0;HANDLE hThread;while (1){GetFrameFromHost(&QueueQ); //从主机取数据帧memset(&packetsend, 0, sizeof(packetsend));Sleep(SLEEPMS);printf("\n");packetsend = QueueFront(&QueueQ); //取数据帧ret = send(socketClient, (char *)&packetsend, sizeof(packetsend), 0);//发送dataif (ret == SOCKET_ERROR){printf("发送数据出错!\n");continue;}printf("发送数据帧:data %d, %d\n", packetsend.head.seq, packetsend.size);const unsigned long timeOut = 5 * 1000; //设置超时计时器 5秒超时memset(&packetreceive, 0, sizeof(packetreceive));Sleep(SLEEPMS);printf("\n");InitializeCriticalSection(&gCS); // 初始化临界区hThread = CreateThread(NULL, 0, ReceiveFun, (LPVOID)&packetreceive, 0, NULL);int r = WaitForMultipleObjects(1, &hThread, TRUE, timeOut);DeleteCriticalSection(&gCS); //与InitializeCriticalSection(&gCS);成对使用if (ret == SOCKET_ERROR || ret == SOCKET_DISCONN){printf("接受出错!Press any key to continue\n");while (!kbhit()) {};continue;}if (r == WSA_WAIT_TIMEOUT) //判断超时{TerminateThread(hThread, 0); //终止线程printf("超时重传:data %d, %d\n", packetsend.head.seq, packetsend.size);}else if (packetsend.head.seq == packetreceive.head.ack){srand((unsigned)time(NULL));switch (rand() % 5) //假定产生随机结果,20%的概率超时{case 0:printf("接收方发送回复超时(ack丢失模拟):%d\n", packetsend.head.seq);printf("超时重传:data %d, %d\n", packetsend.head.seq, packetsend.size);break;default:if (packetreceive.head.kind == ack){printf("接受ack帧:ack %d\n", packetreceive.head.ack);DeLine(&QueueQ);}else if (packetreceive.head.kind == nak){printf("接受nak帧:nak %d\n", packetsend.head.seq);}break;}}else printf("帧序号出错: %d\n", packetreceive.head.ack);if (GetTickCount() - tick > 20 * TIMEOUT) //设置时间20秒{printf("持续时间20s. 按q退出,其他键继续\n");int kbc = getch();if (kbc == 'q' || kbc == 'Q')break;}}printf("按任意键退出!\n");while (!kbhit()) {};Sleep(SLEEPMS);printf("谢谢使用!\n");WSACleanup();closesocket(socketClient);Sleep(SLEEPMS);}DWORD WINAPI ReceiveFun(LPVOID pArg){EnterCriticalSection(&gCS);//进入critical sectionframe *packetreceive = (frame *)pArg;ret = recv(socketClient, (char *)packetreceive, sizeof(*packetreceive), 0);LeaveCriticalSection(&gCS); //线程用毕,离开critical sectionreturn ret;}#include<stdio.h>#include <stdlib.h>#include <windows.h>//加这个头文件#include <windowsx.h>#include <iostream>#include <winsock.h>#include<conio.h>#include<time.h>#include <math.h>#define NULL 0#define MAX_LENGTH 2000#define RECEIVE_MAX_LENGTH 1500#define SEND_MAX_LENGTH 1500#define TIMEOUT 1#define WSA_WAIT_TIMEOUT -1#define MAXPOOL 100#define SLEEPMS 1000#define SOCKET_DISCONN 0#pragma comment(lib,"ws2_32.lib")#pragma warning(disable:4996)typedef enum { data = 1, ack, nak, tout } frame_kind; //帧类型CRITICAL_SECTION gCS;int socketClient;int ret;typedef struct frame_head{frame_kind kind; //帧类型unsigned int seq; //序列号unsigned int ack; //确认号unsigned char data[MAX_LENGTH]; //数据}Head;typedef struct frame{frame_head head; //帧头unsigned int size; //数据的大小} Frame;typedef struct framenode //队列节点类型{frame head_data;struct framenode *next;} Framenode;typedef struct{Framenode *front; //队头指针Framenode *rear; //队尾指针} LinkQueue;void InitLine(LinkQueue *q){q->front = q->rear = NULL;}int QueueEmpty(LinkQueue *q){return q->front == NULL && q->rear == NULL; }frame QueueFront(LinkQueue *q){if (QueueEmpty(q)){printf("队列为空!\n");Sleep(SLEEPMS);exit(0);}return q->front->head_data;}int QueueLen(LinkQueue *q){if (QueueEmpty(q)){return 0;}int num = 0;Framenode *p = q->front;while (p != NULL){num++;p = p->next;}return num;}int GetFrameFromHost(LinkQueue *q){if (QueueLen(q) >= MAXPOOL){printf("准备接受:data %d \n", q->front->head_data.head.seq);return q->front->head_data.head.seq;}Framenode *p = (Framenode *)malloc(sizeof(Framenode));memset(p->head_data.head.data, 0, MAX_LENGTH);p->head_data.head.ack = -1;p->head_data.head.seq = 0;p->next = NULL;if (QueueEmpty(q))q->front = q->rear = p;else{p->head_data.head.seq = (q->rear->head_data.head.seq + 1) % MAXPOOL;q->rear->next = p;q->rear = p;}return GetFrameFromHost(q);}int DeLine(LinkQueue *q, frame *pf, unsigned int curw) //假设数据帧送往主机是足够快的{Framenode *p = NULL;if (curw == q->front->head_data.head.seq)p = q->front;elsep = q->rear;if (p->head_data.head.ack != -1) //假定数据已经提交主机{printf("向主机交付data %d, %d 成功!\n", p->head_data.head.ack, p->head_data.size);}memset(p->head_data.head.data, 0, MAX_LENGTH);memcpy(p->head_data.head.data, pf->head.data, pf->size);p->head_data.size = pf->size;p->head_data.head.ack = pf->head.seq; //保存发送帧序号}frame QueueAnswer(LinkQueue *q, unsigned int curw){if (curw == q->front->head_data.head.seq){return q->front->head_data;}else{return q->rear->head_data;}}void main(){Begin:WORD wVersionRequested;WSADATA wsaData; //初始化socket库wVersionRequested = MAKEWORD(1, 1); //两个byte型合并成一个WORD型int err = WSAStartup(wVersionRequested, &wsaData);//使用sockets之前要调用一次if (err != 0){Sleep(SLEEPMS);return;}if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){WSACleanup();//中止Windows Sockets服务 WSAStartup()成对使用Sleep(SLEEPMS);}SOCKET socksrv = socket(AF_INET, SOCK_STREAM, 0);//监听的套接字SOCKADDR_IN socketadd;socketadd.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //监听连接socketadd.sin_family = AF_INET;socketadd.sin_port = htons(7001); //设置端口if (SOCKET_ERROR == bind(socksrv, (SOCKADDR*)&socketadd, sizeof(SOCKADDR))) {printf("绑定出错!\n");WSACleanup();Sleep(SLEEPMS);return;}if (SOCKET_ERROR == listen(socksrv, 5)){printf("监听出错!");WSACleanup();Sleep(SLEEPMS);return;}SOCKADDR_IN sockclient;int len = sizeof(SOCKADDR);SOCKET sockconn = accept(socksrv, (SOCKADDR*)&sockclient, &len);//建立连接的套节字if (INVALID_SOCKET == sockconn){printf("建立连接出错!\n");WSACleanup();Sleep(SLEEPMS);}char sendData[SEND_MAX_LENGTH];memset(sendData, 0, SEND_MAX_LENGTH);sprintf(sendData, "%s", "你好发送方,我是接受方!");if (SOCKET_ERROR == send(sockconn, sendData, strlen(sendData) + 1, 0)){printf("发送连接提示信息出错!\n");WSACleanup();closesocket(sockconn);Sleep(SLEEPMS);return;}char getData[RECEIVE_MAX_LENGTH];memset(getData, 0, RECEIVE_MAX_LENGTH);recv(sockconn, getData, RECEIVE_MAX_LENGTH, 0);printf("%s\n", getData);printf("1bit滑动窗口协议:接收方,接收窗口=1\n");LinkQueue QueueQ;InitLine(&QueueQ);frame packetreceive; //dataframe packetsend; // ack,nakint curw = GetFrameFromHost(&QueueQ);//初始化接收窗口int ret = 0;while (1){memset(&packetreceive, 0, sizeof(packetreceive));Sleep(SLEEPMS);printf("\n");ret = recv(sockconn, (char *)&packetreceive, sizeof(packetreceive), 0);if (ret == SOCKET_ERROR || ret == SOCKET_DISCONN){if (ret == SOCKET_ERROR){printf("连接出错!自动连接!\n");continue;}else{printf("连接已断开,按q退出,其他键等待新的连接\n");int kbc = getch();if (kbc == 'q' || kbc == 'Q')break;else{WSACleanup();closesocket(sockconn);Sleep(SLEEPMS);goto Begin;}}}srand((unsigned)time(NULL));switch (rand() % 5) //假定产生随机结果,20%的概率校验错误或接收发送方超时{case 0:printf("接受数据帧:data %d, %d,校验错误,丢弃(数据帧出错模拟)\n", packetreceive.head.seq, packetreceive.size);memset(&packetsend, 0, sizeof(packetsend));memcpy(&packetsend, &packetreceive, sizeof(packetreceive));packetsend.head.ack = packetreceive.head.seq;packetsend.head.seq = curw;packetsend.head.kind = nak;printf("发送否认帧:nak %d\n", packetreceive.head.seq);break;case 1:packetsend.head.kind = tout;printf("发送方发送数据超时(数据帧丢失模拟):%d\n", packetreceive.head.seq);break;default:printf("接受数据帧:data %d, %d,校验正确\n", packetreceive.head.seq, packetreceive.size);if (packetreceive.head.seq == (QueueAnswer(&QueueQ, curw)).head.ack){printf("上一帧的重发,丢弃,直接发送确认帧:ack %d\n", packetreceive.head.seq);}else{printf("新的数据帧:data %d, %d,放入缓存\n", packetreceive.head.seq, packetreceive.size);curw = DeLine(&QueueQ, &packetreceive, curw); //将新帧保存待送往主机memset(&packetsend, 0, sizeof(packetsend));packetsend = QueueAnswer(&QueueQ, curw); //待发送的确认帧printf("发送确认帧:ack %d\n", packetreceive.head.seq);}packetsend.head.kind = ack;break;}if (packetsend.head.kind == tout) continue; //发送方使用多线程判断超时ret = send(sockconn, (char *)&packetsend, sizeof(packetsend), 0);if (ret == SOCKET_ERROR){printf("发送ack或nak出错!自动连接!\n");continue;}}printf("按任意键退出!\n");while (!kbhit()) {};Sleep(SLEEPMS);cprintf("谢谢使用!\n");WSACleanup();closesocket(sockconn);Sleep(SLEEPMS);}5、实验截图6、实验分析该滑动窗口协议模拟程序还有进一步完善的余地,例如可以对以下一些地方进行改进:(1)改模拟程序通过命令行来实行,缺少形象直观的界面,希望日后可以设计比较简单明了的界面来展示程序的主要模拟功能。

数据链路层滑动窗口协议的设计与实现

数据链路层滑动窗口协议的设计与实现

数据链路层滑动窗口协议的设计与实现1. 协议方信息在开始之前,我们先来看看这份协议的关键信息项。

嘿,咱们要确保每个人的信息都清晰明确,方便之后的沟通嘛!协议方一(发送方):姓名:______;联系方式:______;单位:______。

协议方二(接收方):姓名:______;联系方式:______;单位:______。

协议制定者:姓名:______;联系方式:______;单位:______。

2. 引言大家好呀!今天我们来聊聊一个有趣的话题,那就是“数据链路层滑动窗口协议”。

别担心,我会尽量把它讲得简单易懂,就像喝水一样轻松。

这个协议主要是为了让数据在网络中传输得更快、更稳,像滑动窗户一样灵活。

你准备好了吗?3. 协议背景滑动窗口协议最初是为了应对网络传输中的各种问题而提出的。

想象一下,假如你正在发送一封信,而信件在路上遇到了堵车,那你就得耐心等待。

这种情况在数据传输中也是一样的。

因此,滑动窗口协议应运而生,帮助我们更有效地利用带宽,减少等待时间。

4. 协议设计原则好,接下来我们来聊聊这个协议的设计原则。

我们希望做到以下几点:4.1 提高效率这就是我们追求的目标!通过滑动窗口,发送方可以同时发送多个数据包,而不用等每一个包都被确认。

这样,效率简直是翻倍,真是太爽了!4.2 确保可靠性不过,效率归效率,可靠性也不能丢!每个数据包的到达情况都需要被确认,以确保没有丢失。

想想,如果你发了一封信,但它被风吹走了,那多麻烦呀!4.3 动态调整这个协议还可以根据网络的情况动态调整窗口大小,灵活应对各种变化。

就像你在驾驶时,根据路况调整车速一样,聪明又实用。

5. 协议实现接下来是重头戏——协议的实现。

大家准备好了吗?咱们一步步来。

5.1 初始化在初始化阶段,发送方和接收方需要建立连接,确认各自的窗口大小。

这就像打个招呼,了解一下对方的情况。

可以设定一个初始的窗口大小,比如5个数据包。

5.2 数据传输然后,发送方开始传输数据。

滑动窗口协议实验SWP

滑动窗口协议实验SWP
分析:①初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方 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 号帧。此时接收窗口状态仍不变。
从这里不难看出,后退 n 协议一方面因连续发送数据帧而提高了效率,但另一方面,在 重传时又必须把原来已正确传送过的数据帧进行重传(仅因这些数据帧之前有一个数据帧 出了错),这种做法又使传送效率降低。由此可见,若传输信道的传输质量很差因而误码率 较大时,连续测协议不一定优于停止等待协议。此协议中的发送窗口的大小为 k,接收窗 口仍是 1。 (4).选择重传协议
(3).后退 n 协议 由于停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因
此又提出了后退 n 协议。后退 n 协议中,发送方在发完一个数据帧后,不停下来等待应答 帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也 可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的 超时时间内仍收到确认帧,就要重发相应的数据帧。如:当发送方发送了 N 个帧后,若发 现该 N 帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此 时发送方就不得不重新发送出错帧及其后的 N 帧。

第9讲 滑动窗口协议和HDLC

第9讲 滑动窗口协议和HDLC
解决策略 允许发送过程在阻塞之前发送多达w个帧,而不是1 帧。由于可以适当的选择w,发送过程就可以在等 待往返传输的时间内连续传输帧,而不至于填满窗 口。
退后N帧的工作原理
在发送完一个数据帧后,不是停下来等待确认帧,而 是可以连续再发送若干个数据帧。
如果这时收到了接收端发来的确认帧,那么还可以接 着发送数据帧。
0 1 REJ拒绝
否定确认帧,表示检测到传输错误,要求重传从序 号N(R)开始的所有帧。用于后退N帧协议。
1 0 RNR接收未就绪 小于序号N(R)的帧已全部正确收到,但还未准备好 接收下一帧,要求发送方停止发送。具有流量 控制作用。
1 1 SREJ选择拒绝 只重发序号为N(R)的帧,用于选择重传协议中。
HDLC包括流量控制和数据帧交换的维护功能 HDLC是一个面向位(把帧当作bit流,而不区分字节)
的协议,支持半双工和全双工通信。
2.2 三种类型的工作站
主站(主机站或控制站)
通过发送命令给其他站和根据它们的响应采取行动来管理数 据流
从站(目标站或客户站)
对来自主站的命令做出响应,不发送命令给其他站,能发送 数据给其他站。
无序号帧 1
位序号 1
N(S)
P/F
N(R)
0
S
P/F
N(R)
1
M
P/F
M
2345678
2.5 帧类型
信息帧用于传送数据,简称I帧,以控制字段的第1位 是0来标志,要传送的数据放在信息字段中。
N(S)表示当前发送的信息帧的序号,HDLC采用滑动 窗口协议,发送方最多可以连续发送7个帧。N(R)表示 该站所期望接收到的帧的序号,用于捎带确认,而不 必单独发送应答帧,在全双工传输中能够提高信道利 用率。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据链路层滑动窗口协议的设计和实现样本数据链路层滑动窗口协议的设计和实现本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

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

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

(1)实现有噪音信道环境下的无差错传输。

(2)运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。

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

实验环境Windows7环境PC,机,Microsoft VisualC++集成化开发环境二、协议设计协议的分层结构及层服务::包括物理层,数据链路层和网络层三层。

该实验主要设计数据链路层协议,为实现有噪声环境下高信道利用率传输,我们采用回本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

退n n帧(go backn)技术的协议。

发送方窗口大小为31;通过捎带确认来完成可靠的数据通信;出现信道误码导致收帧出错时,接受方丢弃所有后续帧,待定时器超时后发送方重发。

该层提供服务::从网络层接受要发送的数据包,将之分拆成数据帧;按一定的成帧方案完成分帧,加校验码,加ack等操作;进行适当的流量判断和拥塞控制;启动定时器将之传递给物理层。

数据帧经信道传送给接受方,接受方数据链路层执行与成帧相逆的操作;处理ack信息,终止定时器(或启动ack定时器,ack成帧传送);判断是否为欲接受数据,数据是否出错,提交给网络层。

退回N N步工作原理示意图::本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

实验所形成帧((成帧方案))::DATAFramen+=========+========+========+===============+======== +|KIND(1)|ACK(1)|SEQ(1)|DATA(240~256)|CRC(4)||+=========+========+========+===============+========+ ACK Frame+=========+========+========+|KIND(1)|ACK(1)|CRC(4)|+=========+========+========+NAKFrame+=========+========+========+|KIND(1)|ACK(1)|CRC(4)|+=========+========+========+本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

CRC校验和的多项式定义::本次实验采用的CRC校验方案为CRC--32,以太网校验和生成多项式相同。

生成多项式为::x x32+x26+x23+x22+x16+x12+x11+x10++xx88+x77+x55+x44+x22+x11+1校验和附加在数据帧,尾部,接受方用带校验和的数据来逻辑除以生成多项式,余数为零则数据无误码,反之有误码等待发送方重传。

可靠通信和误码控制方案::通过捎带确认来完成可靠的数据通信;出现信道误码导致收帧出错时,接受方丢弃所有后续帧,此时发送方长久接受不到确认信息,引发定时器超时后发送方重发;接受方无数据传送导致发送方无法收到捎带确认时,接受方确认定时器超时,构造一确认帧单独传送。

三、软件设计给出程序的数据结构,模块之间的调用关系和功能,程序流程。

本次实验我们对go--back--N N协议进行了编写,描述如下::本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

11..数据结构::typedefenum{false,true}boolean;//bloolean typetypedef unsigned char seq_nr;//sequence orack numberstypedef unsigned char packet[PKT_LEN];//用数组存放数据/*FRAME kind*/#define Data1#define Ack2#define Nak3static intphl_ready:://物理层状态next_frame_to_send;//M MAAX X__S SEEQ Q本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

>>11;u usse edd f fo orr oou uttb boou unnd d本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

s sttr reea amm,a annd di inni itti ia an niiz zee本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

n neex xtt ffr raam mee ggo oiin ngg oou utt本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

ack_expected;//oldest frameas yetunacknowledged,and initianni izene本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

xt ackexpected inboundframe_expected;//next frame expected on本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

inbound stream,and initializenumber offrameex本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

pected inboundbuffer[MAX_SEQ+1];//bu ffersfor theoutbound streamnbuffered;//output bufferscurrently inuse,and initt iallyno packetsare bufferedbufferLen[MAX_SEQ+1]//bufferLen存储每个r buffer中数据的有效长度typedefstruc t{//帧结构unsigned charkind;seq_nrack;seq_nrseq;packetinfo;本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

unsigned charcrc[4];}frame;;22..模块结构::给出程序中所设计的子程序。

完成的功能,子程序每个参数的意义。

A)static booleanbetween(seq_nra,seq_nrb,seq_nr c)//判断b b是否是在aa、c c之间的帧B)staticvoidput_frame(unsignedchar*frame,intlen)//c crc编码并向物理层发送C)send_data(unsignedcharkind,seq_nrframe_nr,seq_nrframe_exp ected,packet buffer[],intdlen[])//生成帧D)int main()//主函数,分为五个事件(1)NETWORK_LAYER_READY,事件发生后从网络层读数据,成帧;若当前物理层可用,发送。

(2)PHYSICAL_LAYER_READY,事件发生后,若。

有未发送的帧,发送,否则置物理层状态为可用。

本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

(3)DATA_INING,事件发生后,来了arg个字节的数据,每接受一个数据,判断是否为帧尾;若为帧尾,提取一帧,去掉填充,进行校验;若校验结果正确,处理ack,然后处理数据。

接受完arg个字节,跳出。

(4)ACK_TIMEOUT,事件发生后,产生一个不含数据的ack帧,等待直到物理层有效,发送。

(5)DATA_TIMEOUT,事件发生后,重发ack_expected和next_frame_to_send。

之间的帧。

33..算法流程::画出流程图,描述算法的主要流程。

本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

四、实验结果分析(1)描述你所实现的协议软件是否实现了误码信道环境中无差错传输功能此协议软件实现了误码信道环境中无差错传输功能本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

(2)程序的健壮性在较低误码率的信道条件下,该程序运行平稳,未出现任何差错,健壮性良好,在高误码率的信道条件下,程序运行有时会出现中断,但大多数时候均运行超过二十分钟以上,故本程序健壮性良好,但仍有值得改进之处。

(3)协议参数的选取::滑动窗口的大小为77,重传定时器的时限,ACK搭载定时器的时限为300。

在在n go_back_n协议中(假设接受方一直有数据发送,即无k ack 定时器超时现象),滑动窗口的大小M,信道传输时延a,发送速率c c,帧大小ff在满足如下关系时信道利用率(M*(f/c)/[2a+2(f/c)])接近100%:M>=[2a+2*(f/c)]/(f/c);;由于实际数据传送很可能在某段时间类接受方无数据反送,涉及及k ack帧单独传送问题,故一般信道利用率不可能达到100%,但M M的选择至少要满足公式。

至于防止M M过大的问题,可通过实际测试的结果分析来得到合适的M M。

值。

滑动窗口大小的选择直接本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。

文档如有不当之处,请联系本人或网站删除。

涉及到信道利用率和数据拥塞的问题;若太小,会导致信道空闲,利用率很低;若太大,数据发送过快,会造成接受方数据链路层来不及处理,数据物理层及信道发生拥塞现象导致数据丢失,出错率增大,重传率高。

相关文档
最新文档