3

我有点不好意思承认我很难理解 TCP 的慢启动,这应该是一个非常简单的算法。考虑这种情况:

  • sender 有 CWND=4 并发送所有 4 个段
  • 接收者为每个接收到的段发送一个确认(它没有使用任何类型的延迟确认策略)
  • 4 个ack 快速到达发送方,在发送方的网络缓冲区中排队
    • sender 处理 ack 1,将 cwnd 增加到 5,并发送 5 个段
    • sender 处理 ack 2,将 cwnd 增加到 6,并发送 6 个段(总共发送:11)
    • sender 处理 ack 3,将 cwnd 增加到 7,并发送 7 个段(总共发送:18)
    • sender 处理 ack 4,将 cwnd 增加到 8,并发送 8 个段(总共发送:26)

因为确认在发送者的缓冲区中排队,所以发送者能够发送 26 个段,而只收到 4 个段的确认。这似乎与缓慢启动对已发送流量设置上限的意图相反。

我的推理哪里错了?

更新

[RFC 2581](https://www.rfc-editor.org/rfc/rfc2581) 定义 CWND 如下:

在任何给定时间,TCP 都不能发送序列号高于最高确认序列号与 cwnd 和 rwnd 最小值之和的数据。

这证实了@jman 的解释。

4

1 回答 1

3

cwnd表示未确认的段。因此,当接收到第一个 ACK​​ 时,cwnd堆栈会5发送2更多段,因为已经有3未确认的段在飞行中。

您的示例应为:

  • 发件人处理 ack 1,将 cwnd 增加到 5,并再发送 2 个段(总共发送:6)
  • sender 处理 ack 2,将 cwnd 增加到 6,并再发送 2 个段(总共发送:8)
  • sender 处理 ack 3,将 cwnd 增加到 7,并再发送 2 个段(发送总数:10)
  • sender 处理 ack 4,将 cwnd 增加到 8,并再发送 2 个段(发送总数:12)
于 2013-07-29T17:51:45.937 回答