滑动窗口协议——GBN

回退N步(GBN)

回退N步协议中,允许发送方发送多个分组而不需要等待确认,但它也 受限于在流水线中未确认的分组数不能超过某个最大允许数N.

image

如上图所示,显示了发送方看到的GBN协议的序号范围。将基序号(base)定义为最早的未确认分组的序号,将下一个序号(nextseqnum)定义为最小的未使用的序号(即下一个待发分组的序号),则将序号范围分为了4段。对应于已经发送并被确认的分组;段内的序号对用于已经发送但未被确认的序号;段内的序号能用于哪些要被立即发送的分组(如果有数据来自上层的话);最后,大于或等于的序号是不能使用的,知道当前流水线中未被确认的分组已得到确认为止。
根据上图,那些已经发送但未被确认的分组的许可或范围可以被看成是一个在序号范围内长度为N的窗口,随着协议的运行,该窗口在序号空间向前滑动。因此,N被称为 窗口长度,GBN协议也常被称为 滑动窗口协议。(为什么要限制这些被发送的,未被确认的分组数为N?为什么不允许这些分组为无限制的数目?这是因为流量控制是对发送发方的限制原因之一)。
在实践中,一个分组的序号承载在分组首部的一个固定长度字段中。如果分组序号字段的比特数为K比特,那么序号范围为.在一个有序的序号范围内,所有设计序号的运算必须使用模运算。
下面是基于ACK,无NAK的GBN协议发方和接收方的扩展FSM.
发送方
image

接收方

image

GBN发送方必须相应三种类型的事件:

  • 上层的调用:当上层调用rdt_send()时,发送方检查窗口是否已满。如果未满,则产生分组将其发送,并相应更新变量;如果已满,只将数据返回给上层,并隐式的指示窗口已满。(实际实现中,发送方可以缓存这些数据,或者使用同步机制,设置信号量,允许上层仅在窗口不满时调用);
  • 受到一个ACK(n),在GBN协议中,采用的是累积确认,表示接收方已经正确的即受到序号为n的以前包括n内的所有分组;
  • 超时事件。如果出现超时,发送方重传所有已发送但未被确认过的分组。

在GBN中,如果一个序号为n的分组被正确接收并且按序(即上次交付给上层到上层的数据是序号为n-1的分组),则接收方为分组n发送一个ACK,并将该分组中的数据交付到上层。在其他情况下,接收方丢弃该分组,并为最近按序接收的分组重新发送ACK.
下面是窗口长度为4个分组的GBN协议运行情况。


image

你可能感兴趣的:(滑动窗口协议——GBN)