![为什么吞吐速度是由吞吐较慢的终端系统决定的?](https://linux22.com/image/1542459/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%90%9E%E5%90%90%E9%80%9F%E5%BA%A6%E6%98%AF%E7%94%B1%E5%90%9E%E5%90%90%E8%BE%83%E6%85%A2%E7%9A%84%E7%BB%88%E7%AB%AF%E7%B3%BB%E7%BB%9F%E5%86%B3%E5%AE%9A%E7%9A%84%EF%BC%9F.png)
我一直在研究数据包传输的吞吐速度,但对从一个终端系统到另一个终端系统的总吞吐量感到困惑。例如:假设一台服务器正在通过路由器向客户端发送数据包。我的教科书计算机网络Kurose 和 Ross 的论文指出,吞吐速度较慢的端系统决定了整个文件传输的吞吐速度。这是为什么呢?
这两个吞吐速度加在一起难道不就是整个文件传输吞吐量吗?例如:服务器的吞吐量以 1 Mbps 的速度输出比特,而路由器的吞吐量以 2 Mbps 的速度输出比特。假设文件大小为 1000 万比特。从服务器到路由器,需要 10 秒才能到达服务器,然后需要大约 5 秒才能到达客户端,因此总吞吐量交互需要 15 秒。我是这样认为的,但按照教科书的逻辑,这需要 10 秒。为什么会这样?
答案1
想象一下,一排蚂蚁从一片叶子移动到它们的洞穴,但是它们需要爬过去的路上有一根棍子:
<Leaf> ------ <stick> ------ <hole>
一只蚂蚁需要 3 秒才能到达木棍(旅程的第 1 段),需要 10 秒才能爬过木棍(第 2 段),然后需要 2 秒才能从木棍移动到洞口(第 3 段)。第 1 段的总带宽为 3 只蚂蚁,木棍的带宽为 1 只蚂蚁,第 3 段的带宽为 3 只蚂蚁。
因此,蚂蚁 0 离开树叶,走向树枝。他爬过树枝,走到洞口。总时间 = 15 秒。
Ant1 比 ant0 晚 1 秒,并在 3 秒内穿越了 leg1。它到达了棍子,但是棍子的带宽已满,因为 Ant0 正在使用它。因此 Ant1 必须等待 9 秒才能开始越过棍子。当 Ant0 完成棍子后,Ant1 越过棍子并继续进入洞口。总耗时为 3 秒 + 9 秒(等待)+ 10 秒越过棍子 + 2 秒到达洞口 => 24 秒。
蚂蚁 2 比蚂蚁 1 晚 1 秒,需要 3 秒才能到达木棍。然后它需要等待蚂蚁 0 和蚂蚁 1 越过木棍才能穿过。总时间 = 3 秒 + 10 秒(等待蚂蚁 1)+ 8 秒(等待蚂蚁 0)+ 10 秒(越过木棍)+ 2 秒到达洞口 => 33 秒。
因此,如果我们要测量这条路径的吞吐量,它将是每秒 3/(15+24+33) => 0.0416 只蚂蚁。
假设我们将第一段的速度加快到 1 秒(快 3 倍)。最终得到 3/(13+22+31) => 每秒 0.454 只蚂蚁。对于一条腿的速度提高 3 倍来说,增加的幅度非常小。
假设我们将 leg3 的速度加快到 1 秒(快 2 倍)。最终结果是每秒 3/(12+21+30) => 0.0476 只蚂蚁。同样,影响很小。
然而,如果我们将第 2 腿的速度增加 2 倍至 5 秒,我们就会得到一个非常不同的数字 3/(7 + 11 + 17) => 每秒 0.085 只蚂蚁。
因此,增加其中一条较快支路的速度收效甚微,但将最慢组件的速率加倍却可以有效地使路径的吞吐量加倍。
那么你是否注意到,尽管 Leg3 具有足够的带宽和快速的传输速率,但这不会影响蚂蚁到达洞口的速率,因为蚂蚁进入 Leg3 的速率受到木棍的限制,因此 Leg3 上的大部分带宽都无法使用。你可以将其增加 100 倍,而不会对蚂蚁到达洞口的速率产生丝毫影响。在这种情况下,你唯一能改变方程式的就是增加蚂蚁穿过木棍的速率。其他一切都毫无意义。
答案2
速度最慢的一端将决定整体链接速度,因为它实际上无法更快地接收数据,否则将导致错误。
不要考虑所花的时间,而要考虑某物能听得多快。
可以这样说:一个人大声朗读一本书,但他说话很快,另一个人在听。听的人只能以较慢的速度理解,因此要么快速阅读者必须放慢速度到听者可以理解的速度,要么听者必须不停地说“等一下,你能重复一遍吗”。这决定了吞吐量。
您还犯了一个严重的错误,即假设路由器在传递要传输的数据块之前会保存整个数据块,虽然这确实发生在微小的数据块上,但这并不是整个系统的工作方式。
这里有两个吞吐量。发送方到路由器的吞吐量和从路由器到接收方的吞吐量。路由器在任何给定时刻仅保存少量数据,并且在重新传输之前不会存储整个大块数据,因此您实际上拥有系统中最慢的链路,从而限制了端到端链路可以工作的整体速度。