计算机网络-为什么回退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有没有收到更形象的: 原来的那一组信息和新的一组信息是不一样的。但是在前者的机制下,他们有着相同的序号。而后者就没有该问题了!

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

修正

评论区有人指出例子的总结存在问题:(感谢指正

例子举的很好,但是总结不太对。 使用2^n-1窗口进行发送时,出现如例子所陈述错误,对于新帧旧帧的判断是由接收方进行,判断的余地是留给接收方的。 由于超时,发送方会不断重传,但a0-a6和接收方所需要的a7始终无法匹配,接收方会不断重复返回ack要求发送a7,直到发送方正确收到此ack,能够确认a0-a6已经成功发送,移动窗口,并发送a7为止。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值