TCP如何使用cwnd处理超时?

时间:2009-02-11 00:36:45

标签: tcp

我最近一直在研究TCP拥塞控制,但有一个问题困扰着我......

如果我理解正确,除非cwnd(拥塞窗口)和rwnd(接收方窗口)允许,否则TCP不会发送新数据。换句话说:

if(flightSize < MIN(cwnd, rwnd))
{
    // Send some new data (if possible)
    // Taking into account other details that we don't need
    // to get into such as Nagle's algorithm, etc.
}

其中flightSize是已发送但尚未确认的数据量。

让我们假设TCP正在进行,发送数据,并在适当时增加cwnd。假设cwnd = [10 full packets],并且flightSize == cwnd。然后在网络中发生丢包,发送方的重传定时器熄灭。 New Reno如何/何时重新传输未确认的数据?

这是我目前的理解/误解:

当定时器熄灭时,cwnd将被重置为[1 full packet],最旧的已发送但未确认的数据包将被重新发送,rto将加倍,重发定时器将被重置。因此,如果我们说当计时器关闭时rto是1秒,它将更新为2秒,并且重传计时器将以2秒的等待时间再次启动。

这就是为什么我感到困惑:

在上述情况下,TCP将仅重新发送一个数据包。即使该数据包立即得到确认,TCP也无法发送任何新数据,因为cwnd仍然小于flightSize。那它是做什么的?坐下来等待2秒重传定时器在重新发送另一个数据包之前再次关闭?它是否强制重新发送旧数据,因为它无法发送新数据?它是否重置了flightSize,并重新考虑所有先前发送的数据是否未发送?

我已经阅读了所有可以找到的RFC,以及TCP的各种指南和解释。我一定错过了某个地方......


澄清: 我正在考虑多次丢失,其中TCP没有使用SACK。

如果收到重复的ack,TCP将重新发送第3个复制ack(fast retrasmit)上最旧的ack,并在第4个复制ack(快速恢复)之后发送新数据。我的问题是关于如果TCP发送者获得少于3个重复的话会发生什么?

2 个答案:

答案 0 :(得分:3)

我在“TCP / IP Illustrated,第2卷”一书中找到了答案,第25.11节,第842-844页:

  

[重传超时]下一个   发送序列号(snd_nxt)已设置   到最古老的未经确认的序列   号码(snd_una)。 ......通过移动   返回snd_nxt,[TCP可以开始   重新发送所有未确认的数据]。

换句话说,flightSize将被重置,因此可以继续发送数据(在慢启动模式下)。只是这些数据中的一些可能是之前已经发送过的数据。可能会出现累积确认,以防止重新发送所有数据。

答案 1 :(得分:0)

要求澄清:你在考虑单个数据包丢失吗?或窗口内有多重损失?

在单一丢失情况下,由于在丢失的数据包之后收到数据包,将收到重复的确认。我相信New Reno将传输后续数据包(“NEW data”)以响应重复的ack。然后重置超时计时器。