滑动窗口算法原理.doc_第1页
滑动窗口算法原理.doc_第2页
滑动窗口算法原理.doc_第3页
滑动窗口算法原理.doc_第4页
滑动窗口算法原理.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1. 滑动窗口算法 -滑动窗口算法工作过程如下。首先,发送方为每1帧赋一个序号(sequence number),记作S e q N u m 。现在,让我们忽略S e q N u m是由有限大小的头部字段实现的事实,而假设它能无限增大。发送方维护3个变量:发送窗口大小(send window size),记作S W S ,给出发送方能够发 送但未确认的帧数的上界; L A R 表示最近收到的确认帧( last acknowledgement re c e i v e d)的序号;L F S 表示最近发送的帧(last frame sent)的序号,发送方还维持如下的不变式:LAR-LFRRWS 当一个确认到达时,发送方向右移动L A R,从而允许发送方发送另一帧。同时,发送方为所发的每个帧设置一个定时器,如果定时器在A C K到达之前超时,则重发此帧。注意:发送方必须存储最多S W S个帧,因为在它们得到确认之前必须准备重发。接收方维护下面3个变量:接收窗口大小(receive window size),记为RW S,给出接收方所能接收的无序帧数目的上界; L A F表示可接收帧(l a rgest acceptable frame)的序号;L F R表示最近收到的帧(last frame re c e i v e d)的序号。接收方也维持如下不变式:LFS-LARSWS 当一个具有顺序号S e q N u m的帧到达时,接收方采取如下行动:如果S e q N u mL F R或S e q N u m L A F,那么帧不在接收窗口内,于是被丢弃;如果L F RSe q N u mL A F,那么帧在接收窗口内,于是被接收。现在接收方需要决定是否发送一个A C K。设S e q N u m To A C K表示未被确认帧的最大序号,则序号小于或等于S e q N u m To A c k的帧都已收到。即使已经收到更高序号的分组,接收方仍确认S e q N u m To A c k的接收。这种确认被称为是累积的(c u m u l a t i v e)。然后它设置L F R = S e q N u m To A c k,并调整L A F = L F R + RW S。例如,假设L F R= 5(即,上次接收方发送的A C K是为了确认顺序号5的),并且RWS = 4。这意味着L A F = 9。如果帧7和8到达,则存储它们,因为它们在接收窗口内。然而并不需要发送A C K,因为帧6还没有到达。帧7和8被称为是错序到达的。(从技术上讲,接收方可以在帧7和8到达时重发帧5的A C K。)如果帧6当时到达了(或许它在第一次丢失后又重发从而晚到,或许它只是被延迟了),接收方确认帧8,L F R置为8,L A F置为1 2。如果实际上帧6丢失了,则出现发送方超时,重发帧6。我们看到,当发生超时时,传输数据量减少,这是因为发送方在帧6确认之前不能向前移动窗口。这意味着分组丢失时,此方案将不再保证管道满载。注意:分组丢失时间越长,这个问题越严重。注意,在这个例子中,接收方可以在帧7刚一到达时就为帧6发送一个认帧N A K(negative acknowl edgment)。然而,由于发送方的超时机制足以发现这种情况,发送N A K反而为发送方增加了复杂性,因此不必这样做。正如我们已提到的,当帧7和8到达时为帧5发送一个额外的A C K是合理的;在某些情况下,发送方可以使用重复的A C K作为一个帧丢失的线索。这两种方法都允许早期的分组丢失检测,有助于改进性能。关于这个方案的另一个变种是使用选择确认(selective acknowledgements)。即,接收方能够准确地确认那些已收到的帧,而不只是确认按顺序收到最高序号的帧。因此,在上例中,接收方能够确认帧7、8的接收。如果给发送方更多的信息,就能使其较容易地保持管道满载,但增加了实现的复杂性。发送窗口大小是根据一段给定时间内链路上有多少待确认的帧来选择的;对于一个给定的延迟与带宽的乘积,S W S是容易计算的。另一方面,接收方可以将RW S设置为任何想要的值。通常的两种设置是:RW S= 1,表示接收方不存储任何错序到达的帧; RW S=S W S,表示接收方能够缓存发送方传输的任何帧。由于错序到达的帧的数目不可能超过S W S个,所以设置RWS S W S没有意义。2. 有限顺序号和滑动窗口 -现在我们再来讨论算法中做过的一个简化,即假设序号是可以无限增大的。当然,实际上是在一个有限的头部字段中说明一个帧的序号。例如,一个3比特字段意味着有8个可用序号0 7。因此序号必须可重用,或者说序号能回绕。这就带来了一个问题:要能够区别同一序号的不同次发送实例,这意味着可用序号的数目必须大于所允许的待确认帧的数目。例如,停止等待算法允许一次有1个待确认帧,并有2个不同的序号。假设序号空间中的序号数比待确认的帧数大1,即S W S M A a x S e q N u m -1 ,其中M a x Seq N u m 是可用序号数。这就够了吗?答案取决于RW S 。如果RW S = 1,那么MaxSeqNumSWS+1是足够了。如果RW S等于S W S,那么有一个只比发送窗口尺寸大1的M a x S e q N u m是不够的。为看清这一点,考虑有8个序号0 7的情况,并且S W S = RW S = 7。假设发送方传输帧0 6,并且接收方成功接收,但A C K丢失。接收方现在希望接收帧7,0 5,但发送方超时,然后发送帧0 6。不幸的是,接收方期待的是第二次的帧0 5,得到的却是第一次的帧0 5。这正是我们想避免的情况。结果是,当RW S = S W S时,发送窗口的大小不能大于可用序号数的一半,或更准确地说,SWS h d r)转化为能够安全放在消息前面的字节串( h b u f)。该例程(未给出)必须将头部中的每一个整数字段转化为网络字节顺序,并且去掉编译程序加入C语言结构中的任意填充。7 . 1节将详细讨论字节顺序的问题,但现在,假设该例程将多字整数中最高有效位放在最高地址字节就足够了。这个例程的另一个复杂性是使用s e m Wa i t 和s e n dW i n d o w N o t F u l l 信号量。S e n dWi n d o w N o t F u l l被初始化为发送方滑动窗口的大小S W S(未给出这一初始化)。发送方每传输一帧, s e m Wa i t操作将这个数减1,如果减小到0,则阻塞发送方进程。每收到一个A C K,在d e l i v e r S W P中调用s e m S i g n a l操作(见下面)将此数加1,从而激活正在等待的发送方进程。 在继续介绍S W P的接收方之前,需要调整一个看上去不一致的地方。一方面,我们说过,高层协议通过调用s e n d操作来请求低层协议的服务,所以我们就希望通过S W P发送消息的协议能够调用s e n d(S W P, p a c k e t)。另一方面,用来实现S W P的发送操作的过程叫做s e n d S W P,并且它的第一个参数是一个状态变量( S w p S t a t e)。结果怎样呢?答案是,操作系统提供了粘结代码将对s e n d的一般调用转化为对s e n d S W P的特定协议调用的粘结代码。这个粘结代码将s e n d的第一个参数(协议变量S W P)映射为一个指向s e n d S W P的函数指针和一个指向S W P工作时所需的协议状态的指针。我们之所以通过一般函数调用使高层协议间接调用特定协议函数,是因为我们想限制高层协议中对低层协议编码的信息量。这使得将来能够比较容易地改变协议图的配置。现在来看d e l i v e r操作的S W P的特定协议实现,它在过程d e l i v e r S W P中实现。这个例程实际上处理两种不同类型的输入消息:本结点已发出帧的A C K和到达这个结点的数据帧。在某种意义上,这个例程的ACK部分是与send SWP中所给算法的发送方相对应的。通过检验头部的F l a g s字段可以确定输入的消息是ACK还是一个数据帧。注意,这种特殊的实现不支持数据帧中捎带A C K。当输入帧是一个ACK时,delive rSWP仅仅在发送队列(send Q)中找到与此ACK相应的位置(slot),取消超时事件,并且释放保存在那一位置的帧。由于A C K可能是累积的,所以这项工作实际上是在一个循环中进行的。对于这种情况值得注意的另一个问题是子例程swp In Wind o w的调用。这个子例程在下面给出,它确保被确认帧的序号是在发送方当前希望收到的A C K的范围之内。当输入帧包含数据时, d e l i v e r S W P首先调用m s g S t r i p H d r和l o a d _ s w p _ h d r以便从帧中提取头部。例程l o a d _ s w p _ h d r对应着前面讨论的s t o r e _ s w p _ h d r,它将一个字节串转化为容纳S W P头部的C语言数据结构。然后d e l i v e r S W P调用s w p I n Wi n d o w以确保帧序号在期望的序号范围内。如果是这样,例程在已收到的连续的帧的集合上循环,并通过调用d e l i v e r H L P例程将它们传给上层协议。它也要向发送方发送累积的A C K,但却是通过在接收队列上循环来实现的(它没有使用本节前面给出的s e q N u m To A c k变量)。 最后,s w p I n Window 是一个简单的子例程,它检查一个给定的序号是否落在某个最大和最小顺序号之间。 4. 帧顺序和流量控制 -滑动窗口协议可能是计算机网络中最著名的算法。然而,关于该算法易产生混淆的是,它可以有三个不同的功能,第一个功能是本节的重点,即在不可靠链路上可靠地传输帧。(一般来说,该算法被用于在一个不可靠的网络上可靠地传输消息。)这是该算法的核心功能。滑动窗口算法的第二个功能是用于保持帧的传输顺序。这在接收方比较容易实现,因为每个帧有一个序号,接收方要保证已经向上层协议传递了所有序号比当前帧小的帧,才向上传送该当前帧。即,接收方缓存了(即没有传送)错序的帧。本节描述的滑动窗口算法确实保持了帧的顺序,尽管我们可以想象一个变异,即接收方没有等待更早传送的帧都到达就将帧传给下一个协议。我们可以提出的一个问题是:我们是否确实需要滑动窗口协议来保持帧的顺序,或者,这样的功能在链路层是否是不必要的。不幸的是,我们还没有看到足够多的网络体系结构来回答这个问题我们首先需要理解的是,点到点链路序列如何由交换机连接而形成一条端到端的路径。滑动窗口算法的第三个功能是,它有时支持流量控制(f l o w c o n t ro l),它是一种接收方能够控制发送方使其降低速度的反馈机制。这种机制用于抑制发送方发送速度过快,即抑制传输比接收方所能处理的更多的数据。这通常通过扩展滑动窗口协议完成,使接收方不仅确认收到的帧,而且通知发送方它还可接收多少帧。可接收的帧数对应着接收方空闲的缓冲区数。在按序传递的情况下,在将流量控制并入滑动窗口协议之前,我们应该确信流量控制在链路层是必要的。尚

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论