流量控制
Stop Wait
停等 (Stop-and-Wait) 是一种基础的自动重传请求 (ARQ) 协议。其基本思想是在发送每个数据帧后都停下来,等待接收方的确认。只有在收到确认后,发送方才会继续发送下一个帧。由于这种方法在任何时刻只允许一个帧在传输中,因此它被称为“停等”。
过程关键:
- 发送数据:发送方发送一个数据帧到接收方,并启动一个计时器等待确认。
- 等待确认:发送方在发送数据帧后处于等待状态,直到接收到确认或计时器到期。
- 确认的接收:接收方在收到数据帧后,检查其完整性(例如通过校验和)。如果数据帧正确,接收方会发送一个确认帧回到发送方。
- 计时器到期:如果发送方的计时器在收到确认之前到期,发送方会假设数据帧丢失或确认丢失,并重新发送数据帧。然后再次启动计时器。
GBN
在 回退N帧(GBN, Go Back N)协议中,发送方可以连续发送多个帧,而不需要等待每个帧的确认。但是,发送方需要为每个帧维护一个计时器。如果一个帧的计时器到期而没有收到确认,发送方会重新发送该帧及其之后发送的所有帧。
过程关键:
- 窗口大小:在GBN中,若帧序号的比特数为 $n$,则发送窗口的最大值为 $2^n - 1$,接受窗口的大小为 $1$。
- 发送过程:发送方连续发送窗口内的帧,每发送一个帧,都会为其启动一个计时器。
- 接收过程:接收方只接收期望的帧序号。如果接收到的帧是期望的,它会发送一个确认。如果接收到的帧不是期望的(可能是由于前面的帧丢失),它会丢弃该帧并重新发送对上一个正确接收的帧的确认。
- 超时和重传: 发送方通常只为 最早发送但未确认的帧(窗口内的第一个未确认帧)设置一个单一的超时定时器。 如果计时器到期,该帧及其之后发送的所有帧都会被重传。重传的原因是,如果一个帧丢失,后续的帧虽然可能已经到达接收方,但由于接收方的窗口大小为1,它们会被丢弃。
- 滑动窗口:当发送方收到一个帧的确认,它知道该帧及其之前的所有帧都已正确接收。于是,它会将窗口向前滑动,从而可以发送新的帧。
通过GBN, SR交互演示你可以更好理解GBN、SR的过程。
SR
选择性重传(SR,Selective Repeat)是另一种自动重传请求 (ARQ) 协议,它旨在解决 Go-Back-N 协议在高误码率环境下的效率问题。与 Go-Back-N 不同,Selective Repeat 只重传那些确实丢失的帧,而不是所有之后的帧。这使得 SR 在高误码率环境下比 GBN 更为高效。
过程关键:
- 窗口大小:在SR中,一般发送窗口和接受窗口大小一致,若帧序号的比特数为 $n$,则窗口大小最大为 $2^{n-1}$。
- 发送过程:发送方连续发送窗口内的帧,并为每个发送的帧启动一个计时器。
- 接收过程:接收方接收所有在其窗口范围内的帧,并为正确接收的每个帧发送确认。接收到的帧可能是乱序的,但接收方可以缓存这些乱序的帧,直到可以按正确的顺序将其传递给上层。
- 超时和重传:如果发送方的某个帧的计时器到期,只有这个特定的帧会被重传,而不是所有的帧。这是 SR 与 GBN 的主要区别。
- 滑动窗口:发送方和接收方的窗口都是动态移动的。当发送方收到一个帧的确认时,它会尝试滑动其窗口以发送新的帧。同时,接收方在将帧按正确顺序传递给上层后,也会滑动其窗口。
- 处理冲突的确认:考虑到网络的延迟,发送方可能在超时并重传一个帧后才收到其早期版本的确认。为了处理这种情况,SR 协议需要具有识别和丢弃重复确认的机制。
对比
停等协议(Stop-and-Wait)、GBN(Go-Back-N)、SR(Selective Repeat)是计算机网络中用于可靠数据传输的三种流量控制和错误处理协议。它们的主要目标是确保在不可靠的通信信道上的数据传输的可靠性。
重点注意接收方和发送方的窗口大小范围。
特性 | 停等协议 | GBN 协议 | SR 协议 |
---|---|---|---|
发送方窗口大小范围(序号位数为n) | 1 | 最大为$2^n - 1$ | 最大为$2^{n-1}$ |
接收方窗口大小范围(序号位数为n) | 1 | $1$ | 与发送方窗口一致 |
发送方效率 | 低(每帧等待确认) | 高(并发发送多帧) | 高(并发发送多帧) |
接收方效率 | 高(无需缓存多帧) | 低(需要缓存多帧) | 高(需要缓存多帧) |
错误处理 | 重传单个丢失帧 | 重传从丢失帧开始的所有帧 | 重传单个丢失帧或乱序帧 |
带宽利用率 | 低 | 高(部分带宽利用) | 高(部分带宽利用) |
窗口大小限制
$$\text{发送窗口大小} + \text{接受窗口大小} \le 2^n$$
滑动窗口协议是计算机网络中用于控制传输层数据流的一种机制。在这种协议下,发送窗口和接收窗口的大小有一个重要的限制,即它们的和不能超过序列号空间的大小。序列号空间是由能够用于标识帧的序列号的总数确定的,这通常是由序列号的位数决定的。
对于一个使用了 $n$ 位序列号的协议,序列号的范围是从 $0$ 到 $2^n-1$ 。因此,整个序列号空间的大小是 $2^n$ ,这意味着理论上最多可以有 $2^n$ 个不同的帧在传输中被唯一区分。
这个限制的主要原因是防止所谓的“序列号回绕”(Sequence Number Wraparound)。如果发送窗口和接收窗口的大小之和大于序列号空间的大小,那么就可能发生一个新的帧使用了一个老的、已经被使用的序列号,但是该帧可能还在网络中传输或者被延迟。接收方将无法区分这是一个新的帧还是重复的帧。
链路利用率计算
假设信号传播时间为 $T_p$,一个数据帧的传输时间为 $T_d$,一个确认帧的传输时间为 $T_a$,发送窗口的最大值为 $N$,信号往返时间 $RTT = 2 \cdot T_p$。
在此情况下,信道利用率 $U$ = 发送数据的时间 / 从发送第一个帧的时间到收到第一个确认帧的时间:
$$U = \frac{N \cdot T_d}{RTT + T_d + T_a}$$
对于停等协议,信道利用率为
$$U = \frac{T_d}{RTT + T_d + T_a}$$
对于使用了滑动窗口的协议,一次性可以传输 $N$ 个数据帧,信道利用率为
$$U = \frac{N \cdot T_d}{RTT + T_d + T_a}$$
注意有些时候确认帧比较小,在这种情况下确认帧传输时间 $T_a$ 可以忽略。
此外,帧传输时间 $T_d$ = 帧大小 / 信道传输速率,信号传播时间 $T_p$ = 距离 / 信号传播速度。