发送方给接收方发送数据分组,接收方收到后对其进行差错检测。若没有误码,则接收该数据分组,并给发送方发送确认分组,简称为ACK。发送方收到对所发送数据分组的确认分组后,才能发送下一个数据分组。若检测到误码,则丢弃该分组,并给发送方发送否认分组,简称为NAK,发送方收到对所发送数据分组的否认分组后,立刻重传该数据分组。发送方发送一个数据分组后,并不能立刻将该分组从缓存中删除,只有在收到针对该数据分组的确认分组后,才能将其从缓存中删除,并发送下一个分组。
若发送分组在传输的过程中丢失了,接收方收不到数据分组,就不会发送ACK或NAK,发送方就会一直处于等待接收方ACK或NAK的状态。
为解决该问题,可在发送方发送完一个数据分组时,启动一个超时计时器。若到了超时计时器所设置的重传时间而发送方仍收不到接收方的任何ACK或NAK,则重传原来的数据分组,即超时重传。
一般将重传时间设为略大于从发送方到接收方的平均往返时间。
既然发送方发送的数据分组可能丢失,那么接收方发送的确认或否认分组也就有可能丢失,从而造成发送方对之前所发送数据分组的超时重传。假设该重传的数据分组正确到达了接收方,则接收方如何判断该数据分组是否是一个重复的分组呢?
为避免分组重复这种错误,必须给每个数据分组带上序号。对于停止-等待协议,由于每发送一个数据分组就停止等待,只要保证每发送一个新的数据分组,其发送序号与上次发送的数据分组的序号不同就可以了,因此用一个比特来编号足够了。
接收方丢弃重复的数据分组,并给发送方发送针对该数据分组的确认分组,以免发送方对该数据分组的再次超时重传。发送方收到针对0号数据分组的确认分组,就可以发送下一个数据分组了,其序号为1。
既然数据分组需要编号,确认分组是否需要编号呢?发送方发送0号数据分组,接收方正确接收后给发送方发送确认分组。由于某些原因,该确认分组迟到了。这会导致发送方对0号数据分组的超时重传。在重传的0号数据分组的传输过程中,发送方收到了迟到的确认分组,于是发送1号数据分组。接收方收到重传的0号数据分组后,发现这是一个重复的数据分组,将其丢弃。并针对该数据分组,给发送方发送确认分组,以免发送方再次超时重传该数据分组。那么问题来了,发送方如何知道这是对0号数据分组的重复确认还是对1号数据分组的确认呢? 如果对确认分组也进行编号,就可以使发送方避免这种误判。
停止-等待协议的信道利用率
当往返时延RTT远大于数据帧发送时延时(如使用卫星链路), 信道利用率非常低。若出现重传,则对于传送有用的数据信息来说,信道利用率还要降低。为了克服停止-等待协议信道利用率很低的缺点,就产生了另外两种协议,即后退N帧协议GBN和选择重传协议SR。
发送窗口尺寸Wt的取值范围是1 < Wt <= 2^n - 1,其中,n是构成分组序号的比特数量。Wt = 1 停止-等待协议;Wt > 2^n - 1,接收方无法分辨新旧数据分组。
发送方可在未收到接收方确认分组的情况下,将序号落在发送窗口内的多个数据分组全部发送出去;发送方只有收到对以发送数据分组的确认时,发送窗口才能向前相应滑动;发送方收到多个重复确认时,可在重传计时器超时前尽早开始重传,由具体实现决定;发送方发送窗口内某个已发送的数据分组产生超时重发时,其后续在发送窗口内且已发送的数据分组也必须全部重传。
接收方的接收窗口尺寸Wr的取值范围是Wr = 1,因此接收方只能按序接收数据分组;接收方只接收序号落在接收窗口内且无误码的数据分组,并且将接收窗口向前滑动一个位置,与此同时给发送方发回相应的确认分组。为了减少开销,接收方不一定每收到一个按序到达且无误码的数据分组就给发送方发回一个确认分组,而是可以在连续收到好几个按序到达且无误码的数据分组后,才针对最后一个数据分组发送确认分组,称为累计确认;或者可以在自己有数据分组要发送时才对之前按序接收且无误码的数据分组进行捎带确认。接收方收到未按序到达的数据分组,除丢弃外,还要对最近按序接收的数据分组进行确认。
回退N帧协议的接收窗口尺寸Wr只能等于1,因此接收方只能按序接收正确到达的数据分组。一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃。这会造成发送方对这些数据分组的超时重传,这是对通信资源的极大浪费。
选择重传协议是指为了进一步提高性能,可设法只重传出现误码的数据分组。因此,接收窗口的尺寸应大于1,以便接收方先收下失序到达但无误码且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后再一并送给上层。
发送窗口尺寸Wr的取值范围为1 < Wt <= 2^(n - 1),其中,n是构成分组序号的比特数量。
发送方可在未收到接收方确认分组的情况下,将序号落在发送窗口内的多个数据分组全部发送出去;发送方只有按序收到对已发送数据分组的确认时,发送窗口才能向前相应滑动;若收到未按序到达的确认分组时,对其进行记录,以防止其相应数据分组的超时重发,但发送窗口不能向前滑动。
接收窗口尺寸Wr的取值范围是1 < Wr <= Wt
接收方可接收未按序到达但没有误码且序号落在接收窗口内的数据分组;为了使发送方仅重传出现差错的分组,接收方不能再采用累积确认,而需要对每个正确接收到的数据分组进行逐一确认。接收方只有在按序接收数据分组后,接收窗口才能向前相应滑动。
参考
B站:计算机网络微课堂