预备知识:可靠数据传输协议
首先回顾一下rdt3.0协议,在rdt3.0中虽然实现了可靠数据传输,但它的性能问题在于它是一个停等协议,一个简单的解决办法是让它不以停等的方式运行,允许发送方发送多个分组而无须等待确认。
该技术称为流水线技术,相应也会带来一些问题。
- 必须增加序号范围(rdt3.0中序号只有0和1),因为每个输送中的分组必须有一个唯一的序号。
- 发送端和接收端不得不缓存多个分组,因为必须保证交付给上层应用的数据是正确有序的。
- 协议必须能够处理分组丢失、损坏和延时过大的问题。两种解决方式分别为回退N步和选择重传。
本文讲述回退N步(GBN)协议,也称作滑动窗口协议。
每个要发送的分组都需要被分配一个序号,下图是发送端维护的序号空间图示。
其中黄色区段和蓝色区段长度加和是一个固定的值,称为窗口长度。如果你理解了流量控制和拥塞控制就不难理解为什么要限制已发送但未被确认的分组数量。
我们知道,分组的序号是承载在运输层协议首部字段里的,该字段的长度是固定的,那么序号的范围即序号空间也就是有限的,因此窗口无法一直向前推进,所以序号的运算需要使用模运算,对空间长度取余。即序号空间可以看做一个环。
GBN协议发送方的行为
- 当收到上层应用的数据,发送方检查是否有可用序号,有则会产生一个分组发送,并更新相应变量。无则将数据返还上层应用,或缓存数据,或要求上层仅当有可用序号才发送等等。
- 当收到序号n的ACK时,由于GBN协议采用累积确认,故所有序号小于等于n的分组已全部被正确接收,因此窗口会向前推进。
- 当超时事件发生(rdt3.0中的定时器机制),发送方会重传所有已发送但未被确认的分组,这也就是回退N步的含义。
GBN协议接收方的行为
- 接收到一个正确且有序的分组,发送一个ACK。
- 除了上面的其他所有情况,丢弃该分组,并为最近的正确且有序接收的分组重新发送ACK。
关于GBN协议接收方的第二条行为,你或许会问,如果接收方接收到了一个正确但失序的分组,假设它的序号是n+1,此时接收方缺少序号为n的分组。为什么不将n+1号分组缓存起来,等待n号分组接收成功,再将它们一起交付给上层应用?
注意发送方的第三条行为,如果发送方在超时时间内未收到n号分组的ACK,会重传所有已发送但未被确认的分组,其中就包括n+1号分组,因此接收方直接丢弃n+1号分组即可。
在GBN协议中,发送方必须维护序号空间的三个分界点,但是接收方需要维护的唯一信息就是下一个按序接收的分组的序号。
GBN协议虽然避免了停等协议中的信道利用率问题,但GBN协议本身也有一些情况存在着性能问题,单个分组的差错就能引起GBN重传大量分组,随着信道差错率的增加,流水线可能会被这些不必要重传的分组所充斥。这个问题将会在选择重传(SR)协议中得到解决。