我正在开发 TCP 实现,但在相关 RFC(793、1122、5681、6298)中找不到对此的说明。当重传定时器超时时,重传已发送但尚未确认的第一个段,并将CWND设置为一个段。然后应该使用slow-start,对于每个新的ACK,它会将CWND增加一个段。
问题是其他已经发送的段是否被有效地重新排队以进行传输,就好像它们从未被发送过一样。特别地,假设收到了一个 ACK,它充分增加了 CWND 以允许发送剩余的已发送段之一,但不确认它。这样的段应该现在传输,还是只在下一次重传计时器到期时传输?
例子:
- 第一次发送以下段(由它们的序列号表示):1000、2000、3000、4000。CWND(拥塞窗口)和 SND_WND(接收器窗口)都足够大,可以发送这些段。
- 重传定时器在收到任何 ACK 之前到期。段 1000 被重传。慢启动开始,因此 CWND 减少到 1000 (=MSS)。
- 收到 ACK num 2000,确认第一个但不确认任何其他段。根据慢启动算法,CWND 增加到 2000。
- 此时,CWND 允许传输段 2000 和 3000。现在传输段 2000 和 3000,还是需要重新传输计时器的另一个到期才能传输段 2000?