流水线式 RDT 协议
stop-and-wait 协议中,每发送一个包发送方就阻塞,等待 ACK 后(瓶颈是 RTT)才能做出行动。流水线式 RDT 协议(pipelined RDT protocol)令发送方每次发送 $n$ 个包,这就能获得 $n$ 倍的利用率(utilization)提升。
- 利用率:发送方实际把比特推到信道中的时间(传输时延)占总时间的比例
流水线式 RDT 协议要求:
- 序号(sequence number)的范围变大,用于区分一次性发送的不同包
- 发送方与接收方均需要实现缓冲(buffer)储存多个包
- 新的处理丢包,高延迟包,位错误的机制:接下来介绍的回退 N 帧协议与选择重传协议
回退 N 帧协议
回退 N 帧协议(Go-Back-N Protocol, GBN)是一种滑动窗口(sliding window)协议。
滑动窗口大小为 $N$,序号占 $k$ 位,则 $N\leq 2^k$。

[0, base-1]:已发送并收到 ACK 的包的序号[base, nextseqsum-1]:已发送但并未收到 ACK 的包的序号[nextseqsum, base+N-1]:可用于待发送的包的序号
发送方维护两个指针 base = 1 与 nextseqsum = 1:
- 上一层调用
rdt_send():若窗口未满,使用nextseqsum创建新包并发送,令nextseqsum++;若窗口已满(nextseqsum = base+N),把数据退还给上一层(或其他缓存机制) - 收到 ACK
n:GBN 中的 ACK 是累计确认(cumulative acknowledgement),意味着接收方成功接收了所有序号不超过 n 的包 ,令base = chkmax(n+1),nextseqsum = chkmax(n+1) - 超时:计时器追踪包
base(最早的已发送但并未收到 ACK 的包 ,因此当base = nextseqsum时计时器闲置),若超时,重传[base, nextseqsum-1]中的所有包后重启计时器;若收到 ACK 使得base移动,重启计时器。
接收方维护一个指针 expectedseqnum = 1:
- 收到包
n:若n = expectedseqnum并且校验成功,那么交付数据,令expectedseqnum++,向发送方发送 ACKn;否则(无论是n != expectedseqnum还是校验失败)丢弃包n,向发送方发送 ACKexpectedseqnum-1(最近一次按序接受的包)
接收方只看单调递增的 expectedseqnum,它会丢弃任何失序(out-of-order)的包。假如说当前 expectedseqnum = n 但收到了包 n+1,即使知道这个包是一定会被接受的,GBN 仍然将其丢弃。这样做的好处是接收方的逻辑简洁,坏处是重传次数多。
选择重传协议
选择重传协议(Selective Repeat Protocol, SR)是 GBN 的按需重传版本。即,发送方只重传那些它「认为」需要重传的数据包。
发送方与接收方均维护长度为 $N$ 的滑动窗口与序号的映射,双方根据 ACK 信号的收发进行同步(synchronization)。

发送方:
- 上一层调用
rdt_send():同 GBN - 收到 ACK
n:若n在窗口内([send_base, send_base+N-1]),将n标记为 ACKed(已确认);若n = send_base,向前移动send_base至当前尚未 ACKed 的最小序号处 - 超时:为减少重传次数,每个包都拥有各自的计时器(可以用一个硬件计时器模拟多个逻辑计时器);超时后重传并重置计时器,收到 ACK 后停止计时器
接收方:
- 收到窗口内(
[rcv_base, rcv_base+N-1])的包n并成功校验:向发送方发送 ACKn,将其缓存并标记。若从基序号开始有一段连续的标记为已缓存的包([rcv_base, rcv_base+k]),则按顺序一并交付,并向前移动rcv_base至当前尚未被缓存的最小序号处(rcv_base+k+1) - [*] 收到前一个窗口(
[rcv_base-N, rcv_base-1])的包n并成功校验:向发送方发送 ACKn - 其余情况:忽略收到的包
[*] 的原因:考虑初始状态下发送方与接收方的窗口同步,均是 [k, k+N-1]
- 发送方发送包
[k, k+N-1] - 接收方均正确接收,逐一 ACK,窗口移动至
[k+N, k+2N-1] - ACK
k丢失,因此发送方的窗口仍然卡在[k, k+N-1] - 发送方包
k的计时器超时,触发重传 - 此时
k属于接收方前一个窗口内的包,但仍需要回复 ACKk使得发送方的窗口正确同步
SR 中窗口大小 $N$ 与序号空间大小 $M=2^k$ 的关系:序号必须唯一标识窗口内的所有不同包以避免两个包模 $M$ 映射到同一序号。发送方与接收方的窗口完全错开时最多会有 $2N$ 个不同的数据包(见上),因此 $M\geq 2N$。
- GBN:发送方 $N$ 个包,接收方 $1$ 个包(
expectedseqnum),因此 $M\geq N+1$ - 交替比特:发送方 $1$ 个包,接收方 $1$ 个包,因此 $M\geq 2$