篇首语:回退N步(GBN)和选择重传(SR)是解决流水线的差错恢复的两种基本方法。
本篇我们再来看看SR。
首先我们要知道序号空间这个概念,这对于我们后面理解窗口长度的选择意义非凡。在一次传输中,分组数也许很大,我们不可能给每个分组一个唯一一个编号,所以只能选择一个序号空间,令分组数进行取模操作。比如分组数为7,我们取序号空间为 0 1 2 ,则分组编号为 0 1 2 0 1 2 0
现在来看SR,通过前面的学习,我们了解了GBN的基础上,也知道了GBN协议可能会将失序的分组丢掉,而这部分失序的分组也许没有必要被重新传输。而选择排序(SR),顾名思义,就是通过让发送方仅重传哪些它怀疑在接收方出错(丢失或受损)的分组而避免了不必要的重传。
为了达到这一目的,我们首先仍需要利用窗口来限制流水线中的分组数。
现在我们来讲述传输过程,我们将各个分组编号,设窗口大小为N。发送方一次传输N个分组过去,当接收方正确接受到其中任意一个分组,接收方都会返回一个ACK。这时候接收方会判断这个分组是否按序,并将目前按序的所有分组提交给上一层,否则,进行缓存。而发送方接受到ACK后,也会查看ACK对应序号是否按序(== base ?),按序则窗口滑动,否则窗口不滑动并进行等待。一旦等待超时(可能是分组丢失或ACK丢失引起的)就将触发重传。
在接收方缓存的失序分组将被缓存知道所有的丢失分组(即序号更小的分组)都被接受为止,然后才将这一批分组按序交付给上一层。需要注意,当SR正确接收到一个分组,无论目前拥有与否,都要返回一个ACK,否则发送方窗口将无法滑动。而同时与GBN不同的是,每个在被发送的分组都有自己的逻辑定时器。
最后我们来说说,为什么之前要提到序号空间。实际上,我们窗口大小的选择不是随意的,序号空间的大小是有限的,而我们窗口长度必须小于等于序号空间的一半。
以上就是SR的运行基本原理。
我们可以看到,使用选择重传,我们可以避免重复传送那些接收方已经正确接受的分组,但代价是接收方要具有相当容量的缓存空间,而这在许多情况下是不够经济的。
这里同样建议大家看看一个java小程序,来实操一下SR的过程.