我最近一直在研究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个重复的话会发生什么?
答案 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。然后重置超时计时器。