计算机网络-为什么回退N协议、选择重传协议需要使用2^n-1

基础

在阅读此文之前请务必确保您已经了解回退N协议、选择重传协议的整体思路。

解析

不妨假设使用了2^n作为窗口。这里n取3.
按照我们的假设发送方“一组”信息一共有8个(2^3=8)。发送方这些信息的编号:0-7。
当sender发送了0号后,接收方返回ACK1(也即:0号信息我收到了,请你发送1号信息吧!)。结果由于传输原因,这个ACK1丢失了!
注意此时sender还在继续发送(因为没有超时):
sender又发送1号,接收方这次返回ACK2(也即:1号信息我收到了,请你发送2号信息吧!)。结果这个ACK2丢失了!
sender又发送2号,接收方这次返回ACK3(也即:2号信息我收到了,请你发送3号信息吧!)。结果这个ACK3丢失了!
……
直到当发送方发送完第7号数据。
此时,接收方返回ACK0(也即:7号信息我收到了,请你发送0号信息吧!)。你没猜错。结果这个ACK0也丢失了!

注意,此时作为接收方而言,它认为,自己已经接收到了上述所有的信息0-7号;而且他认为自己接下来要处理的是新的一组的第0号(也即总的而言,第8号)数据。

但是对于发送方,由于已经超时(time out)了。所以它认为:我没有收到任何ACK(因为跟据我们的假设这些ACK全部丢失了)。所以我要重发0号-7号数据。

那么当发送方发送了0号数据后,此时接收方自然地将已经接收过一遍的数据作为了新的一组数据。这显然重复接收了!是不对的.

这是为什么呢?先别着急,我们再看一个例子。-

假设这次我们采用了2^n-1.我们再次假设n=3 也即我们的发送窗口大小只有7位。编号为:0-6。

一切照旧。
当sender发送了0号后,接收方返回ACK1(也即:0号信息我收到了,请你发送1号信息吧!)。结果由于传输原因,这个ACK1丢失了!
注意此时sender还在继续发送(因为没有超时):
sender又发送1号,接收方这次返回ACK2(也即:1号信息我收到了,请你发送2号信息吧!)。结果这个ACK2丢失了!
sender又发送2号,接收方这次返回ACK3(也即:2号信息我收到了,请你发送3号信息吧!)。结果这个ACK3丢失了!
……
直到当发送方发送完第6号数据。
此时,接收方返回ACK7(也即:6号信息我收到了,请你发送7号信息吧!)。你又没猜错。结果这个ACK7也丢失了!

注意,此时作为接收方而言,它认为,自己已经接收到了上述所有的信息0-6号;而且他认为自己接下来要处理的是第7号数据。

但是对于发送方,它会先去判断,我是不是收到了ACK7(2^3-1),如果我收到了,我就发送下一组。如果我没收到,那么我就重发。

对比前后,发送方的思路。后者更加聪明了。而聪明的原因在于:前者的ACK8自然的指向了发送方下一组应该发的位置(这意味着,这个信息是唯一而且准确的:我就是要第0位数据。但是同样的序号却对应着不同的数据)。而后者却指向了一个“空”出来的位置此时的第八位的数据是没有数据的,也即给了可以进行判断的余地!而判断的标准就是ACK7有没有收到更形象的: 原来的那一组信息和新的一组信息是不一样的。但是在前者的机制下,他们有着相同的序号。而后者就没有该问题了!

这样读完,或许你还没有完全理解。那么请仔细观察两个例子。并且不断揣摩,不一会你就会明白了。

猜你喜欢

转载自blog.csdn.net/ooffrankdura/article/details/79858712