过多的延迟会影响吞吐量吗

我不知道这个问题是否在这里主题,所以请不要redirect我。

试图了解TCP是如何工作的,我已经使用ns-3模拟器模拟了一个点到点链路。 在设置链路的带宽为5 Mbps,适当的错误率和延迟到5毫秒,我得到了一个原始的大约4.9 Mbps的。 但是,增加到50 Mbps的链路后,我只能得到16 Mbps。 而且,将延迟减less到1ms需要吞吐量约为40 Mbps。

有人可以解释这个巨大的差异?

编辑:我明白如何带宽和延迟是不同的。 我只是想知道,如果我的模拟器是越野车,或者这是从TCP预计。

简而言之:是的,太多的延迟会降低你的总带宽 ,而且在串行连接上效果更明显 – 即:在接收到前一次传输的ACK之前,不能传输更多数据的连接。

只有当这两个值相距很远时,例如具有非常“宽”但高延迟的链路(或反之亦然 – 非常低的延迟但非常“窄”的链路)时,延迟/带宽相关性才成为问题。

让我举一个例子,使用一个简单的例子,在一个WAN连接上有32个字节的ping,大约有50ms的延迟(100ms RTT)。 有了这样的连接,最多可以发送10x 32b的ping,总共320b / s只能在每个方向! ping洪水显然不等待对方确认,或洪水不存在,这并不奇怪。

如果你不能降低延迟,你怎么解决这个问题呢? 主要采用两种方式:

  • 发送更大的数据包(例如:使用1400字节大小的ping);
  • 在等待确认之前发送更多的数据包。

TCP使用这两种系统:build立stream连接后(例如:启动下载),它将数据包大小增加到最大值(MSS-最大段大小)和发送数据包的数量,而不等待任何确认/ ack – 又名TCP窗口缩放 。 在创build能够dynamic调整TCP窗口缩放的networking堆栈上花费了大量的工作,所以现在很less需要手动调整。 但是,有时networking驱动程序和/或一个奇怪的angular落案例可能会阻止正确的缩放,导致带宽减less。

没有本地实现窗口缩放(即:IP和UDP)的协议对于带宽问题更加明智,并且通常需要来自更高级应用(在可能的情况下)或特定系统调整(例如,增加最大分组大小,被称为MTU)。

显然,广域网连接由于其内在的更高延迟而更容易出现问题。 但是,即使非常快速的本地连接也会受到影响。

例如:

  • 在10 Gb / s的以太网上,ping RTT在0.05 ms范围内,我最初只能达到总可用带宽的30-40%。 将接口MTU增加到9000字节(从标准1500字节起)完全解决了问题;
  • 在千兆以太网连接上,Athereos接口驱动程序以一种阻止TCP窗口“打开”到其最大值的方式与Linuxnetworking堆栈进行交互,从而降低了性能。 手动设置TCP窗口解决了问题。

太长的评论,但不是一个完整的答案,但延迟可以影响吞吐量(带宽是一个固定的属性):

您的TCPnetworking堆栈需要将所有传输的数据包的副本保留在内存中,直到收到接收方确认收到数据包为止,这样数据包就可以在数据包丢失的情况下被重新传输。

该缓冲区的最小尺寸是一个简单的乘法:

<throughput> * <roundtrip time> = <retransmit buffer size> 

即为了支持千兆位网卡的最大吞吐量,在您的局域网中往返时间(=延迟)为0.2毫秒,所需的重新发送缓冲区为:

  (1Gigabit/s = 10^9 bit/s) * 0.0002 s = 200000 bits = 25 Kb 

数额相当小。 更实际的2毫秒的广域网延迟,你将需要250 Kb。

除非networking驱动程序dynamic调整分配给TCP重新传输缓冲区大小的内存量,否则无论networking中的可用带宽如何,该缓冲区都会有效地成为系统所能承受的吞吐量的限制因素:

 <max throughput> = <retransmit buffer size> / <roundtrip time> 

任何延迟的增加都会降低系统的有效吞吐量。

现在想象一下,对于高延迟,高带宽连接(例如具有典型500毫秒延迟的卫星上行链路)设置相同的250 Kb缓冲区的低延迟局域网/广域网,您的吞吐量将受限于:

 250 Kb / 0,5 s = 2 000 000 / 0,5 = 4 Mbit/s 

而不是卫星互联网连接实际可以支持的1 Gbit带宽(根据维基百科 )

带宽=容量

延迟=延迟

想象一下,我有一个500加仑的游泳池,而且我有一个1加仑的水桶和一个5加仑的水桶来盛水。 我需要1分钟的时间从我的供水系统到泳池。 如果我只用1加仑的水桶填满泳池,那么我就需要做500次旅行,总共需要500分钟的时间把水从池塘里供到水池里。 如果我只用5加仑的水桶来填满泳池,那么我只需要进行100次旅行,总共花费100分钟的时间将水从池塘里供到水池里。

走到池的时间(等待时间)不会影响每个桶(带宽)可携带多less水,反之,桶的大小(带宽)不会改变走到池(延迟)。

最终的结果是,使用5加仑桶比使用1加仑桶时快5倍,因为5加仑桶更大,不是因为速度更快。