【发布时间】:2010-10-06 19:18:09
【问题描述】:
最近一直在研究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 个完整数据包],而 flightSize == cwnd。然后在网络中发生丢包,发送方的重传计时器关闭。 New Reno 如何/何时重新传输未确认的数据?
这是我目前的理解/误解:
当定时器关闭时,cwnd 将被重置为 [1 full packet],最旧的发送但未确认的数据包将被重新发送,rto 将加倍,重传定时器将被重置。所以如果我们说定时器关闭时rto是1秒,它会更新为2秒,重传定时器会重新启动,等待时间为2秒。
这就是我感到困惑的原因:
在上述情况下,TCP 只会重新发送一个数据包。即使该数据包立即得到确认,TCP 也无法发送任何新数据,因为 cwnd 仍然小于 flightSize。那么它有什么作用呢?坐等到 2 秒重传计时器再次关闭,然后再重新发送另一个数据包?由于无法发送新数据,是否会强制重新发送旧数据?它是否重置了 flightSize,并重新考虑所有以前发送的数据未发送?
我已经阅读了我能找到的所有 RFC,以及各种关于 TCP 的指南和解释。我一定是在什么地方漏掉了什么……
澄清: 我正在考虑多次丢失,其中 TCP 不使用 SACK。
如果收到重复的确认,TCP 将在第 3 次重复确认时重新发送最旧的确认(快速重传),并在第 4 次重复确认之后发送新数据(快速恢复)。我的问题是如果 TCP 发送方收到少于 3 次重复确认会发生什么?
【问题讨论】:
-
我在你的标题上尽力了。它可能已关闭,但您的原件几乎没用。请随时对其进行进一步编辑以澄清。
标签: tcp