Networking 了解TCP';这是一个缓慢的开始

Networking 了解TCP';这是一个缓慢的开始,networking,tcp,Networking,Tcp,我有点不好意思承认,我很难理解TCP的慢启动,这应该是一个非常简单的算法。考虑这种情况: 发送方的CWND=4并发送所有4段 接收机为每个接收段发送一个ack(它不使用任何类型的延迟ack策略) 4个ACK快速到达发送方,并在发送方的网络缓冲区中排队 发送方处理ack 1,将cwnd增加到5,并发送5段 发送方处理ack 2,将cwnd增加到6,并发送6段(发送总数:11) 发送方处理ack 3,将cwnd增加到7,并发送7段(发送总数:18) 发送方处理ack 4,将cwnd增加到8,并发

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

  • 发送方的CWND=4并发送所有4段
  • 接收机为每个接收段发送一个ack(它不使用任何类型的延迟ack策略)
  • 4个ACK快速到达发送方,并在发送方的网络缓冲区中排队
    • 发送方处理ack 1,将cwnd增加到5,并发送5段
    • 发送方处理ack 2,将cwnd增加到6,并发送6段(发送总数:11)
    • 发送方处理ack 3,将cwnd增加到7,并发送7段(发送总数:18)
    • 发送方处理ack 4,将cwnd增加到8,并发送8段(发送总数:26)
由于ack在发送方的缓冲区中排队,发送方能够发送26个段,而只收到了4个段的ack。这似乎与缓慢开始设置发送流量上限的意图相反

我的推理哪里错了

更新 将CWND定义如下:

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


这证实了@jman的解释。

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

你的例子应该是:

  • 发送方处理ack 1,将cwnd增加到5,并再发送2段(发送总数:6)
  • 发送方处理ack 2,将cwnd增加到6,并再发送2段(发送总数:8)
  • 发送方处理ack 3,将cwnd增加到7,并再发送2段(发送总数:10)
  • 发送方处理ack 4,将cwnd增加到8,并再发送2段(发送总数:12)

我已经考虑过这种解释。但是,这意味着“实际”窗口仍停留在两个段上。那似乎不对。你能详细说明一下吗?“窗口”是飞行中未确认的数据包数。随着接收到的每一个ACK(
cwnd
)都在增长。我同意拥塞窗口实际上呈指数增长。然而,在实践中,发送方每次只能发送两个段的小突发。ACK确实很快到达。这个问题似乎是离题的,因为它是关于计算机科学,而不是计算机编程。