我有点不好意思承认我很难理解 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 的解释。