1、问题
- 有一组窗口大小的数据包正进行即时可靠传输
- 使用累计确认消息
- 每个包都有计时器
- 协议如何表现?
- 回退N步(Go-back-N):一个包丢失会导致整个窗口重传
- 选择性重传(Selective Repeat):一个包丢失仅仅会重传那一个包
2、回退N步
假设N = 4,即发送窗口大小为4,发送端一次发送了数据包1,2,3,4,在传输过程中包2丢失。接收端收到包1后,返回ACK 1给发送端。接收端收到ACK 1后,滑动窗口右移,发送数据包5。一段时间后,接收方还没收到ACK 2,计时器到点后,发送端重新发送整个窗口大小的包,此时发送窗口中包含的数据包为2,3,4,5,于是将这些包重新发送给接收端。
3、选择性重传
和上面一样,N = 4,数据包2丢失,发送端接收到ACK 1后滑动窗口移动,发送数据包5,等待ACK 2的计时器一段时间后计时结束,发送端重发包2。发送端收到返回的ACK 2,ACK 3, ACK 4后窗口移动,往后继续发送包6,7,8,9,等等。
4、为什么需要回退N步
在上面的例子中,明显看出选择性重传需要重新发送的数据包少于回退N步,那为什么仍然需要回退N步呢?
考虑极端一点的情况,发送的包3,4,5也在传输中丢失,选择性重传涉及到多个包的计时器和往返时间,如果网络状况糟糕,出现一连串的包都丢失的情况,那么选择性重传的效率就比较低了,在这种情况下回退N步会表现得更好。
5、例子
SW = 4,RW = 1,发送端发送数据包1,2,3,4,其中包2丢失。收到ACK 1后,发送端发送包5,由于没有收到包2,所以包5和包3、4都会被丢弃。包2的计时器触发后,重新发送包2。由于RW = 1,无法缓存更多的包,于是包3,4,5也要被重新发送。在这种情景下,应该选择回退N步,因为可以一次性发送包2,3,4,5。
例子2,SW = RW = 4,包2丢失,收到ACK 1后发送包5。由于RW = 4,所以包3,4,5可以被缓存,收到包2后,接收窗口填满,可以被接收方接收。在这种情景下,选择性重传会更好,因为避免了发送网络中已存在的数据包的副本而使得网络膨胀。