引言
GBN协议的弊端
累计确认,从而导致某一帧错误后会批量重传。
可行的解决方案
可以只重传出错的帧,设置单个确认,同时加大接收窗口,设置接收缓存,缓存乱序到达的帧。这也就是选择重传协议SR。
SR中的滑动窗口
如图所示为SR中的发送窗口,假设此时3的确认帧已经收到:
可分为以下部分:
发送完被确认的:01
发送完等待确认的:24
目前可发送:5
不可发送的:其余的
再看接收方(假设此时5号帧没有收到):
希望收到还未收到:5号帧
收到且确认的:6号帧
等待接收的:70
SR发送方必须响应的事件
上层的调用
从上层收到数据后,SR发送方检查下一个可用于该帧的序号,如果序号位于发送窗口内,则发送数据帧;否则就像GBN一样,要么将数据缓存,要么返回给上层,之后再传输。
收到ACK
如果收到ACK,假如该帧序号在窗口内,则SR发送方将那个被确认的帧标记为已接收。如果该帧序号是窗口的下界(最左边第一个窗口对应的序号),则窗口向前移动到具有最小序号的未确认帧处。如果窗口移动了并且有序号在窗口内的未发送帧,则发送这些帧。
超时事件
每个帧都有自己的定时器,一个超时事件发生后只重传一个帧。
SR接收方要做的事
对于窗口内的帧,无条件接收
SR接收方将确认一个正确接收的帧而不管其是否按序。失序的帧将被缓存,并返回给发送方一个该帧的确认帧(收到谁确认谁),直到所有帧(即序号更小的帧)皆被收到为止,这时才可以将一批帧按序交付给上层,然后向前移动滑动窗口。
如果收到了窗口下界之前的帧,就返回一个ACK。其他情况,就忽略该帧。
运行中的SR
假设发送窗口和接收窗口都为4,发送方发送0帧,接收方收到0帧,并回复0帧确认,由于0帧是接收窗口下界,于是移动窗口使得窗口下界为第一个未被接收的帧(1号帧),同时把新加入帧(4号帧)的状态置为可接收状态:
发送方发送1帧,接收方收到1帧,并回复1帧确认,由于1帧是接收窗口下界,于是移动窗口使得窗口下界为第一个未被接收的帧(2号帧),同时把新加入帧(5号帧)的状态置为可接收状态:
发送方发送2帧,但是2帧丢失,接收方未收到2帧:
发送方发送3帧,接收方收到3帧,缓存三帧,发送ACK3:
发送方收到ACK0,由于窗口下限被确认,所以窗口右移一个,发送4帧,接收方收到4帧,缓存,发送ACK4:
发送方收到ACK1,由于窗口下界被确认,所以窗口右移1个,发送5帧,接收方接收5帧,缓存,发送ACK5:
发送方2帧超时未收到2帧确认,重新传2帧,这次接收方收到了,2-5帧交付(发送给上层网络层),发送ACK2:
发送方收到ACK3,但是无帧可发,等待,一直到ACK2到达,然后下界移至6.
滑动窗口长度
发送窗口最好等于接收窗口
大了会溢出,小了没意义
存在以下公式
,其中,分别是发送窗口和接收窗口大小,n是帧号的比特位数。