假设你有 10mbps 的速度。那么为什么当你从互联网上下载东西时,你的速度不会固定在 10mbps,而是在你下载的时候会在 2-9mbps 之间变化呢?为什么互联网速度会这样?例如,GPU 和 CPU 等硬件组件以固定数量全速运行,那么为什么网络速度不能以同样的方式运行呢?
假设你有 10mbps 的速度。那么为什么当你从互联网上下载东西时,你的速度不会固定在 10mbps,而是在你下载的时候会在 2-9mbps 之间变化呢?为什么互联网速度会这样?例如,GPU 和 CPU 等硬件组件以固定数量全速运行,那么为什么网络速度不能以同样的方式运行呢?
您与本地 ISP 之间的连接大多以固定的连接速度工作。主要问题是您正在与互联网上的其他人竞争访问资源。
您在本地网络上的以太网连接将以固定的 100Mbps 或 1gbps 速度传输,与本地网络上的另一台机器之间的传输将以该速度进行。如果速度下降,那么很可能是由于当时一台或两台机器试图做其他事情,或者在驱动器上寻找其他东西,或者 CPU 在其他地方忙。在大部分空闲的机器上,您将获得几乎全速的批量传输。传输的小文件达到延迟限制,您可以传输小块数据的速度快于它们在任一端的处理(查找、读取、写入等)。
互联网也有类似的问题,但你也在与其他用户竞争。他们都有来自服务器的需求,他们都使用相同的管道在不同的时间内传输不同数量的数据。
您的 ISP 与使用不同 ISP 的邻居的服务器路径可能不同,他们通过 Internet 的路径可能更快或更有效。你去其他地方的道路可能比他们的更好。路径可能会不断变化。互联网更像是一个实时变化的网络,它可以检测瓶颈、绕过漏洞和丢失、寻找当前的最佳路线,并且只保证数据将到达终点,而不是如何到达终点。
速度随着需求、路线和环境的变化而变化。一旦数据离开您的路由器或调制解调器,您就无法控制数据。
Wifi 会受到很多环境噪音的影响,例如婴儿监视器、耳机、其他 wifi 网络等,它的速度可能声称很高,但从一瞬间到下一瞬间可能有些不可预测。
您的本地连接的最大速度为 10 Mb/s。
但是连接另一端的数据源呢?这可能比您的连接更快或更慢。
如果速度较慢,则无法以 10 Mb/s 的速度向您提供数据。
(请记住,世界范围内许多类型的 Internet 连接都是不对称的。对于大多数用户而言,下载比上传要快得多。)
除此之外,整个互联网也存在瓶颈,超出您(或您的 ISP)的控制范围。
因此,您的 ISP 可以为您提供最大速度,但您的实际速度取决于更多的因素,并且通常会低于您的理论最大值。
我碰巧有一个相对较快的 Docsis 电缆连接,下行速度为 500 Mb/s,上行链路速度为 40 Mb/s。您已经可以看出,虽然理论上我可以以 500 Mb/s 的速度下载,但我只能以 40 Mb/s 的速度上传。因此,如果我向我的邻居发送一些东西(也在与同一个 ISP 的这种连接上,因此受到任何其他东西的干扰最小)他只会以 40 Mb/s 的速度接收它,因为我无法提供比这更快的速度。
事实上:尽管理论上我可以以 500 Mb/s 的速度下载,但我很少能获得超过 300 Mb/s 的速度。我必须为此努力工作,同时使用多台计算机同时下载各种东西。这主要是因为互联网上提供下载的各种服务都有自己的上传速度限制。
其中一些限制取决于硬件/ISP 的最终目的。其他的则由软件控制,因为他们不希望单个客户快速下载而占用他们所有可用的上传带宽,从而为其他客户留下任何东西。因此,他们将客户可用的上传限制在合理的最大值。
这取决于几个因素。在某些情况下,您会看到相当静态的速度,例如,我在家中通过 ADSL 下载了非常稳定的(如果很糟糕)8 Mbps,而当我在工作中复制文件时,我通常会看到大约 980 Mbps 的几乎平坦的图表。
某些连接类型具有固定速率,例如以太网连接协商 1 Gbps 一次并坚持使用它。但是,其他连接类型(例如通过无线电、电力线或其他“不太可靠”的媒体运行的连接类型)会根据环境自动调整其链接速率,例如信号强度、数据包丢失和/或损坏的数据包。
因此,如果您使用的是 Wi-Fi,则链接速率会随着人们四处走动并吸收您的信号而迅速下降;即使在稳定的条件下,它仍然不会保持静止,因为您的设备偶尔会探测更高的速率,确定它们不好,然后返回。(有关广泛使用的示例,请参见“Minstrel”算法。)这同样适用于 LTE 和其他“无线 ISP”连接。
许多连接被超额订阅。例如,在办公室中,即使您个人拥有一个 1 Gbps 以太网端口,它也可能会进入一个交换机,然后该交换机只为整个办公室共享一个 1 Gbps 上行链路。因此,如果您的邻居也开始大量下载,这将导致您的下载速度突然减半,因为你们两个必须共享一个千兆链接。同样,在 FTTH 中,您可能有 50 个邻居都在通过超额订阅的上行链路下载游戏或观看 4K Netflix——他们每个人都获得了总可用速度的一部分。随着他们的使用变化(例如视频流停止),其他所有人可用的比例也会发生变化。
任何时候都可能发生同样的情况——可能是服务器试图通过其上行链路压缩 200 次下载,也可能是两个 ISP 之间的连接在一天中的这个时间变得拥挤。因此,如果数百名客户通过同一个 10 Gbps 连接下载相同的内容,他们都会看到随着连接的来来去去速度不同,每个用户获得的链接比例也在不断变化。
通过 TCP 进行的下载使用拥塞控制算法来确保发送方不只是用数据淹没网络,而是以接收方可以接受的速率发送数据。大多数常用算法会在看到丢包后降低传输速率,然后再缓慢提升。一些服务器可能使用过时或失调的算法,该算法反应过度并大大降低了传输速度。
(有时会发生相反的情况,拥塞控制算法没有做出正确反应,例如“如果检测到丢包, BBR[v1]不会后退。但在这种情况下,丢包是由拥塞引起的。由于 BBR[v1] 有没有办法区分拥塞相关的丢包和非拥塞相关的丢包,(B)点实际上是交叉的,这会导致大量的丢包” )
正如已故参议员史蒂文斯所说,互联网是一系列管道。
“有 10 部电影流过那个互联网,你自己的个人互联网会发生什么?前几天我收到了……周五早上 10 点,我的工作人员发送了一个互联网。我昨天收到了[星期二]。为什么?因为它与互联网上所有这些商业上的事情纠缠在一起。[...]他们想通过互联网传递大量信息。再说一次,互联网不是你随便丢弃的东西什么东西。这不是一辆大卡车。它是一系列管子。如果你不明白,这些管子可以装满,如果它们装满了,当你把你的信息放进去时,它就会排成一行。任何将大量材料、大量材料放入该管的人都会延迟。” https://en.wikipedia.org/wiki/Series_of_tubes
虽然这个演讲在当时被无情地嘲笑,但这不是一个糟糕的比喻。
如果我们考虑一下关于超级碗半场表演中市政污水不堪重负的古老神话,它甚至会有所帮助。
您正在争夺稀缺资源。如果其他人同时竞争,延迟就会增加。如果传输的数据多于管子可以处理的数据,则必须备份。
在一个非常简单的示例中,我们有一个路由器和一根电缆。如果您是唯一访问该网络的人,路由器将尽可能快地路由您的数据包——利用电缆的整个带宽。但是当你的室友登录做他的“研究”时,现在你正在共享那根电缆,而路由器只会在 50% 的时间内为你提供电缆,将其余时间分配给你的室友。你的表观速度减半。
构成互联网的链接通常以固定的数据速率运行。但是你和你连接的任何机器之间的所有链接(可能除了第一个和最后一个)都在成百上千或数百万其他用户之间共享,他们都有自己想做的事情互联网。所有这些其他用户的秒到秒行为是不可预测的,有时数据包到达的速度超过给定链路的处理速度,并且必须排队或丢弃,这会影响端到端连接的速度。
就像交通一样——道路的宽度没有改变,你的汽车的最高速度也没有改变,但是去某个地方需要多长时间仍然取决于有多少其他人试图使用你的道路方法。
一个问题是延迟和可靠性与批量传输相互作用。
虽然与汽车交通的类比在一定程度上具有直观意义,但汽车交通的不同之处在于,汽车不是在路由器之间以接近光速传输的数据包,这些数据包必须由相反方向的汽车确认,以便更多汽车可以被部署。
道路拥堵时也不会简单地丢弃汽车。例如,如果您无法并入某条高速公路,您不会被拉离道路并被送往废品场。
例如,传输速度可能下降的原因是某些数据包丢失,需要重新传输。有一个滑动窗口协议可以平滑其中一些效果。如果一个数据包很少丢失,并且滑动窗口向前推进,而重传则回填它,它可能不明显,但如果中断更频繁,那么重传会明显停止向前推进。
TCP 协议不是为最佳传输速度而设计的。设计是对冲的,以使其对网络“好”,并减少拥塞。TCP 中的算法为了网络的利益而牺牲了性能。
如果出现拥塞,导致数据包丢失和延迟,那么只需更加努力并将更多的数据包发送到空中就可以使单个连接的情况变得更好,但如果每个连接都开始这样做,那么拥塞将失控。
一种拥塞控制机制是窗口缩放。TCP 从一个小窗口开始(这不利于在具有高延迟的快速网络上获得吞吐量)。这被称为“慢启动”。在适当的条件下,TCP 窗口会扩大:变大,以便发送方可以发送更多的数据包和更多的字节,而不会收到对先前发送的材料的确认;数据传输变得更快。网络条件可以减少窗口缩放;基本上,TCP 协议必须看到可靠的性能:它发送的内容正在被接收和确认。如果网络出现故障,窗口可以再次缩小,吞吐量将下降,并在一段时间内保持缓慢,直到条件改善。
使用 Internet 有点像在 PC 上玩游戏。
当游戏,或者图形场景比较平静时,你会得到很高的FPS。当游戏开始忙于活动或复杂的图形和灯光效果时,您的 FPS 将会下降。根据事情变得多么激烈,以及你的设备有多便宜,你的 FPS 可能会大幅下降,以至于你得到非常糟糕的延迟,或者更糟糕的是,你可能会完全退出游戏。
这是一个非常相似的情况,所有正在处理和通过 Internet 传递的数据。没有什么是真正固定的,只是为您的服务水平设置了费率上限。这一切都是可变的,取决于任何特定时刻网络上发生的事情。