【问题标题】:Does TCP scale to fast networks?TCP 是否可以扩展到快速网络?
【发布时间】:2014-05-24 17:28:54
【问题描述】:

似乎最大 TCP 接收窗口大小为 1GB(使用缩放时)。因此,仍然可以用一个连接填充 100Gb 管道的最大 RTT 是 40ms(因为 2 * 40E-3 * 100E9 / 8 = 1GB)。这会将这种通信速度限制在 IRO 10000 公里的距离内。

另一个扩展问题似乎是 32 位序列号无法防止延迟超过 400 毫秒的重复数据包(因为它们在该时间量内回绕)。它们还将窗口大小限制为 2GB(因为它们需要在发送者和接收者窗口之间拆分)。

三个问题:

我知道 TCP 时间戳可以帮助解决序列号问题,但我想知道这是否是一个恰好有帮助但实际上是为其他目的而设计的功能。另外,我不明白时间戳实现了什么,这不能简单地通过增加用于序列号的位数来实现。

我不明白为什么最大接收窗口只有 1GB,而不是 2GB,而当前的标头可能很容易实现。

最后,我想知道 TCP 是否已经可以很好地扩展,可以在即将推出的那种链接上使用。

非常感谢。

【问题讨论】:

  • 这只是可能是这里的主题,不确定。如果您没有得到答案或此处已关闭为题外话,您可以考虑Network Engineering
  • +1 但我要说这无关紧要的原因是因为您在谈论一个 TCP 连接。我不确定您是否可以期望任何单个应用程序使 10Gb+ 管道饱和。不过我肯定是错的。

标签: tcp


【解决方案1】:

您所说的 TCP 功能是在 1990 年代初期的 RFC 1323 中指定的。 RFC 中的讨论文本证明了您遇到的限制:

  • 序列号出现在TCP segment header 的中间,如果没有不兼容的更改,就无法延长。
  • 使用时间戳允许协议同时测量往返时间并防止包装序列号。增大序列号不会提供有关往返时间的任何信息。
  • 您需要时间戳才能准确测量往返时间。在没有时间戳的情况下测量往返时间是一个采样问题,如果每个窗口出现超过 1 个错误,采样就会由于混叠而无法解决。
  • 1 GB 的接收窗口是可以在整个连接中保持同步的最大窗口。 RFC 对其进行了解释以及可以做到的程度:
TCP determines if a data segment is "old" or "new" by testing
whether its sequence number is within 2**31 bytes of the left edge
of the window, and if it is not, discarding the data as "old".  To
insure that new data is never mistakenly considered old and vice-
versa, the left edge of the sender's window has to be at most
2**31 away from the right edge of the receiver's window.
Similarly with the sender's right edge and receiver's left edge.
Since the right and left edges of either the sender's or
receiver's window differ by the window size, and since the sender
and receiver windows can be out of phase by at most the window
size, the above constraints imply that 2 * the max window size
must be less than 2**31, or

   max window < 2**30

正如前面提到的Jonathon,这些限制是针对每个 TCP 连接的。很难想到单个应用程序可以达到单个 TCP 连接的限制的情况,更难想到应用程序无法在需要时打开其他连接的情况。

【讨论】:

  • 非常感谢。我不明白为什么 RTT 测量需要这种级别的支持。在发送数据包时启动计时器并在接收到确认时停止它并不困难,而且 TCP 已经这样做了?另外,我仍然不明白 2^31 限制来自哪里(我不怀疑只使用其中一半的必要性)。显然,使用所有 2^32 seq 数字可以减少对重复延迟数据包的保护,但这并不是说使用一半是根本性的改进吗?我相信一旦技术可用,我们就会找到扩展很重要的示例:-) 再次感谢。
  • 第 10 页上详细介绍了为什么需要 RTT 时间戳。 RFC 1323 的第 11-12 节,它基本上是一本小型网络教科书,我希望我能在那堂课上读到 :)。您描述的 ACK 采样方法在 80 年代后期进行了尝试,发现在不可靠的网络上产生无用的估计。
  • 我已经编辑了答案以从 RFC 中提取该信息。
  • WA:谢谢。我的回答已经基于整个摘录。我得到的是,当窗口大小达到 2^30 时,旧数据包的检测已经不可靠。我没有看到它是如何从根本上变得更糟,窗口大小为 2^31。所以我看不出将大小任意限制为 2^30 有何帮助。我确实看到发送/接收窗口大小加起来不能超过 2^32。但在我看来,如果使用时间戳,那么没有理由不让 Windows 2^31 大吗?非常感谢您参考 RFC 的第 11 页,我会阅读全文。
  • 不会变得更糟;问题是,就像扩展序列号一样,它需要不兼容地更改 TCP 的定义,然后在每个连接上协商一个 TCP 版本。这导致了 TLS 中的 a great deal of pain。 RFC 1323 的作者非常努力确保他们实施的任何扩展都不会导致旧实施误解新实施发送的数据包。
猜你喜欢
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多