用户自
2001年3月17日星期六01:44:35(23.2年前)
上次看到的
2006年12月10日星期日21:33:36(17.5年前)
记录的数量
12 -查看Pogo的文章 (喂养)
水平/经验
1(新手)/176
一切的使命驱动
寒冷
专业
博洛尼亚酱
学校/公司
奥塔哥大学
格言
我想不出一句好的座右铭什么的,用乐透押韵
最近的书面记录
燕麦粥,微波方式
向Pogo发送私人信息

他们说最大的诡计是魔鬼曾经被拉过让人们相信他不存在。但我认为这是不对的。我认为他最大的诡计是让人们相信他是上帝。

以下是家庭作业:

回退n帧

Go-Back-N协议是几种滑动窗口协议之一。A滑动-窗口协议本质上是停止等待协议和无限制协议之间的折衷。停止等待协议一次只允许发送一个帧。在收到确认之前,不能发送新帧。另一方面,无限制协议允许发送方传递其想要的所有内容,并假设接收方能够毫无问题地接收所有内容。对于Sliding-Window协议,采取了一个中间立场:发送方将其发送的帧存储在本地缓冲区中,如果在预期时间内没有收到确认,则重新发送它们。当确认到达时,发送方的缓冲区被清空,包括确认的帧。也就是说,如果接收方确认了帧m,并且发送方在缓冲区中存储了帧k、l、m、n和o,那么它假设接收方一直获得帧到m,因此它会从其缓冲区中清除k、l和m。滑动窗口协议的两个标准版本是Go-Back-N,以及选择性重复。Go-Back-N被认为是二者中比较简单的一种,因为它只接受按顺序排列的帧,而忽略所有其他帧。这是我在本次任务中实现的协议。

我的Go-Back-N实现完全包含在数据链路层中。链接列表定义窗口。这简化了算法的几个方面:我不必保留窗口大小的记录,因为列表本身维护这样的记录。窗口中的第一个位置就是列表中的第一项,清除缓冲区只是按照插入顺序删除条目。我还定义了三个内部类:TimedFrame、AckTimerTask和FrameTimerTask。调用timertask是为了将它们与用于调度这两个内部类的计时器分开。

AckTimerTask是一个简单的类,它在运行时通过在事件队列。

除了事件在运行时放入队列,通知数据链路帧计时器已过期。一个帧时间与发送的每个数据帧相关联。TimedFrame是一个较大的类。除了许多方法外,此内部类还包含所提供Frame类的实例。构造函数采用与Frame构造函数相同的参数。构造完成后,TimedFrame会创建一个新Frame、一个新Timer和一个新的FrameTimerTask。然后,如果没有及时取消FrameTimerTask,它将使用Timer来调度它的执行。TimedFrame除了基本的访问器之外,还包含停止或重新启动计时器的方法。stopTimer()方法调用FrameTimerTask和Timer的cancel()方法。restart()方法像stopTimer()一样停止这两个计时器,然后构造新的计时器,最后使用新的Timer来调度新的FrameTimerTask。

协议本身是一个无限循环。在每次传递期间,数据链接层都会查看六个单独事件中的一个事件队列。这些事件包括:1) 来自用户的数据包,窗口未达到最大大小。在这种情况下,使用数据包作为数据构建新帧。帧是最后一个帧模最大帧号之上的第一个帧(在这个实现中,没有帧的编号超过5,所以如果最后发送的帧是第五个帧,那么新帧的编号为0),并且包含一个与通过物理层接收的最后一个帧数相等的确认号。然后发送该帧,确认计时器停止,因为确认与该帧一起承载。

2) 来自用户的数据包,但窗口已达到最大大小。在这种情况下,数据包被忽略,事件被放回队列。这样缓冲区就不会溢出,数据包也不会丢失。

3) 确认计时器已过期。如果最近没有发送任何帧,则会发生这种情况,因此另一端没有任何帧得到确认。为了处理这个问题,构造了一个特殊的帧,它不包含任何数据,只包含一个确认号。该帧放在物理层上,确认计时器停止。

4) 帧计时器已过期。当一个帧已经发送,但没有收到确认时,就会发生这种情况。因为缓冲区只包含未完成的帧,所以整个窗口都是通过物理层发送的。然而,帧被修改了:背驮的确认不是构建帧时使用的确认。相反,每一个旧帧都用当前的确认号发送。最后,每个帧的帧计时器都会重新启动,这样它们就不会被忘记。

5) 框架通过物理层到达,但框架已损坏。当帧到达时,它的CRC被寻址。如果此检查失败,则框架损坏,并构建并发送NAK框架。

6) 帧通过物理层到达,CRC成功。现在可能会发生很多事情,但首先总是清除缓冲区。到达的帧总是有一个确认号。查询此编号,并删除缓冲区中的每一帧,从最旧的帧到与ack-number具有相同帧编号的帧(包括该帧),并停止其帧定时器。接下来检查框架类型。任何帧都可以是四种类型之一:Ack、Nak、顺序数据和顺序数据。如果是ack帧,则不需要进一步的操作。如果是Nak-frame,这意味着已经发送的数据有问题,正确的反应是重新发送仍在缓冲区中的所有数据。如果框架包含顺序数据,即框架包含数据,并且框架编号是预期的编号,则框架中包含的数据包将传递给用户。预期的帧数按最大帧数的模递增,如果确认计时器尚未激活,则会重新启动它。最后,如果该帧是一个数据帧,但它没有按顺序排列,那么它将被忽略,并通过物理层传递一个Nak-frame。