了解TCP的慢启动

时间:2013-07-29 17:44:30

标签: networking tcp

我觉得有点尴尬承认我无法理解TCP的慢启动,这应该是一个非常简单的算法。请考虑以下情况:

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

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

我的推理在哪里错了?

更新

RFC 2581定义CWND如下:

  

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

这证实了@ jman的解释。

1 个答案:

答案 0 :(得分:2)

cwnd代表未确认的细分受众群。因此,当收到第一个ACK时,cwnd变为5,并且堆栈会发送2个更多的段,因为已经有3个未确认的段已经存在。

您的示例应为:

  • 发件人处理确认1,将cwnd增加到5,再发送2个段(总发送数:6)
  • 发件人处理确认2,将cwnd增加到6,再发送2个段(总发送数:8)
  • 发件人处理确认3,将cwnd增加到7,再发送2个段(总发送数:10)
  • 发件人处理确认4,将cwnd增加到8,再发送2个段(总发送数:12)