为什么我们让每个突发数据成为带宽和延迟乘积的 2 倍?

网络工程 带宽
2022-02-20 12:05:29

以下来自我的教科书:

如果我们需要以突发方式发送数据并在发送下一个突发之前等待每个突发的确认。为了使用链路的最大能力,我们需要使我们的突发大小是带宽和延迟乘积的 2 倍;我们需要填满全双工通道(两个方向)。发送方应发送(2 × 带宽 × 延迟)位的数据突发。然后,发送方等待接收方对部分突发的确认,然后再发送另一个突发。

我在这里有点困惑,假设我们的带宽为 1 bps。我们还假设链路的延迟为 5s。按照教科书的说法,我们需要发送每一个 10 位的突发。是不是说我们把每5个比特的数据做成一个消息,每次实际发送两个消息?

PS。下面是课本上的图片 在此处输入图像描述

我不明白为什么有些人说接收者需要5s才能接收到消息,在这个例子中,5位被认为是一条消息,接收者在5s之后接收到第一个bit,然后再需要5s才能接收到最后一位,所以总共需要 10 秒来接收整个 5 位,不是吗?此外,我们只能在收到接收者的确认之前发送另一条消息,所以如果我们发送 10 位(两条消息),这不违反确认的含义吗?

4个回答

你的教科书在解释这个概念方面做得很差。您可能会寻找其他来源。

您的示例效果不佳,因为序列化延迟非常大(传播延迟的 20%)。一个更可行的例子是假设带宽为 1kbps。现在序列化延迟可以忽略不计。

假设 TCP 窗口为 5kb。您开始发送数据。发送完整个窗口后,您必须停下来等到收到 ACK 以发送更多数据。接收方在 5 秒后收到数据,并发送一个 ACK​​。再过 5 秒后,您会收到 ACK,总共 10 秒(2 * 延迟)。因此,您最终需要等待 10 秒才能发送更多数据。即每 10 秒或 500bps 5kb。

如果您使窗口等于 2 * delay * BW 或 10kb,那么在您发送窗口的数据时,您已经从接收器收到了第一个 ACK​​。所以你可以继续发送更多数据。通过这种方式,您可以使用所有可用带宽,而不是发送少量数据并在其间等待。

你书中引用的文字在几个层面上都是错误的。下面是最容易解释的两个。不要相信来自此资源的信息。

  • 众所周知,在发送其他分段之前,您无需等待固定数量的飞行中传输得到确认。用 TCP 术语来说,这就是为什么我们有一个在没有拥塞的情况下增长的窗口。

  • 文本声称带宽*延迟倍数的原因2是全双工链路。这是错误的。为什么在不用于传输的方向上可用带宽来计算允许在传输中的未确认数据量?

发送方应发送(2 × 带宽 × 延迟)位的数据突发。然后,发送方等待接收方对部分突发的确认,然后再发送另一个突发。

看看这最后两句话。理解作者关于“(2 × 带宽 × 延迟)位”的意思的关键在于最后一句话。“然后,发送者等待接收者对部分突发的确认,然后再发送另一个突发。”

这是发生的事情的时间表。

  1. t=0,发送方开始发送,每秒 1 比特
  2. t=5,第一个比特开始到达接收器,即使接下来的 4 个比特紧随其后并且仍在传输中,如图所示。
  3. t=5,假设接收方可以立即响应并且根本不需要任何时间来确定是否正确接收到第一个比特,它会立即开始发送一个 ACK​​(比如,一个 1 比特的 ACK,如 1 表示成功, 0 表示失败)。
  4. t=5 到 t=10,回到发送方,它继续发送比特 6 到 10,即使它还没有收到来自接收方的 ACK。发送方这样做是因为“我们的突发大小是带宽和延迟乘积的 2 倍”,即 10 位。
  5. t=10,对于接收方在 t=5 发送的突发的开始部分,发送方从接收方接收到 ACK(假设反向延迟也是 5 秒) 。此时发送方刚刚发送完10s突发,所以该ACK的到来正好赶上发送方继续利用链路的最大能力并立即开始发送下一个突发,无需等待确认。

尽管这个插图有缺陷,但作者试图说明的一点是 ACK 需要时间才能返回给发送者,所以如果我们不希望这影响整体吞吐量,发送者需要发送即使一些较早发送的数据尚未得到确认,也会发送更多数据。

可能作者稍后可能会跟进窗口的概念,其中可能有多个突发尚未确认,但只要窗口未填充,发送方就会继续发送突发等;而且,在接收器为该突发发送ACK之前,接收器需要接收整个“突发”以验证它没有错误等更现实的假设。但作者可能正在建立这些概念。

数据包从源传送到目的地以及确认传送回源所用的时间是延迟或往返时间 RTT的两倍。

要在此期间利用连接的全部带宽,您需要发送RTT * 带宽数据 - 或2 * 延迟 * 带宽

如果您发送更多数据(假设发送方接口带宽高于路径带宽),则超出了网络容量。路径变得拥塞,一些数据将排队并且必须丢弃多余的数据。