假设 1 Gbit/s 的站点 A 想要将数据包发送到 100 Mbit/s 的站点 B。有三台路由器,分别为 10 Mbit/s、1 Gbit/s 和 10 Mbit/s。数据包如何传送?
答案1
TCP流量控制由于速度不同,将会启动。
根据链路类型,在这种情况下可能影响 TCP 的另一件事是,如果 1 Gbit/s 路由器使用巨型帧,但这与路由器具有不同的 MTU 没有什么不同 - 数据包将被丢弃或碎片化。
答案2
简而言之,您将获得 10 Mbit/s 的吞吐量。
天真地,人们可能会认为 TCP 流量控制将启动,正如 LawrenceC 所述,这是一般来说正确答案。
然而,在您的具体例子中,事实并非如此。
连接到 1GbE 卡的 10 Mbit/s 路由器将协商 10 Mbit/s。中间 GbE 路由器和 B 侧的 10 Mbit/s 路由器也是如此。故事结束。
因此,网络适配器将只以该速率发送和接收,永远不会超过该速率。事实上,从您的角度来看,整个网络都是 10 Mbit/s。
中间 GbE 路由器可能以 1 Gbit/s 的速度与世界其他地方接收和转发数据包,但在您的特定路由上只能达到 10 Mbit/s。
假设网络拓扑为有些更复杂(互联网!),而且一些多个千兆路由器,以及一个或多个 10 Mbit/s 路由器某处介于两者之间。这个例子更有趣一些。
在这种情况下,您的计算机 A 将以 1 Gbit/s 的速度发送数据包,但我们知道只有 10 Mbit/s 可以通过(好吧,实际上不是,有替代路由,但我们先不考虑这一点)。这怎么可能呢?
在这种情况下,TCP 流量控制确实会启动。B 站将以 100 Mbit/s 的速度接收数据包,但这些数据包只是偶尔出现。您将以 1 Gbit/s 的速度发送数据包,但您必须定期暂停。这在您不知情的情况下在 TCP 层上起作用。
TCP 将尽可能快地发送一些数据包(并维持一个“窗口”),网卡将尽可能快地将它们放在线路上,然后 TCP 将等待确认消息的到来。如果确认消息确实到来,则一切正常,并且可以尽快发送更多内容。如果确认消息不要进来吧,有任何一个错误(不太可能)或数据包发送得太快。因此窗口大小会减小。一旦 ACK 再次到来,窗口会再次逐渐扩大。对此有不同的算法,而且它们相当复杂,但原则上就是这样。
现在...路由器接受有限数量的数据包,并根据其能力尽可能快地转发它们。但最终它们将不得不丢弃数据包。这不是错误,而是正常情况。
具有讽刺意味的是,大概是旧的 10 Mbit/s 路由器可能会排队大量数据包(因为曾几何时,人们的信念是“越多越好”,而现在人们知道情况恰恰相反,现代路由器的队列非常短)。
之所以认为数量越多越好,是因为如果路由器将大量数据包排队然后转发,发送方可能会认为数据包丢失(因为没有收到 ACK)并重新发送。这会导致接收方收到必须丢弃的重复数据包和导致路由器更加拥堵,火上浇油,所以现代路由器报废的很快。
现在,以旧的 10 Mbit/s 路由器为例某处在中间(速度未协商),很可能因此导致吞吐量大大低于 10 Mbit/s。您会收到重发和双重交付。这些对于应用程序来说都是不可见的,只是由于某些奇怪的原因速度变慢了。