提问人:Josef 提问时间:9/18/2008 最后编辑:Mark BiekJosef 更新时间:3/23/2022 访问量:12436
下载加速器如何工作?
How do download accelerators work?
问:
我们要求所有下载请求都具有有效的登录名(非 http),并且我们为每个下载生成交易票。如果您要转到其中一个下载链接并尝试“重播”交易,我们会使用 HTTP 代码转发您以获取新的交易票。这对大多数用户来说都很好用。但是,有一小部分人正在使用下载加速器,这些加速器只是尝试多次重播交易票证。
因此,为了确定我们是否想要甚至是否可以支持下载加速器,我们正试图了解它们的工作原理。
与提供静态文件的 Web 服务器建立第二个、第三个甚至第四个并发连接如何加快下载过程?
加速器计划是做什么的?
答:
报价: 加速下载的最常见方法是打开 parllel 下载。许多服务器限制了一个连接的带宽,因此并行打开更多服务器会增加速率。这通过指定下载应开始的偏移量来工作,HTTP 和 FTP 都支持该偏移量。
当然,这种加速方式是相当“不合群”的。实现带宽限制是为了能够为更多数量的客户端提供服务,因此使用此技术可以降低能够下载的最大对等体数。这就是为什么许多服务器限制并行连接数量(由 IP 识别)的原因,例如,许多 FTP 服务器这样做,因此如果您下载文件并尝试使用浏览器继续浏览,您会遇到问题。从技术上讲,这是两个并联连接。
另一种提高下载速率的技术是点对点网络,其中使用不同的来源,例如在上传端受异步 DSL 限制的下载。
评论
我相信这个想法是许多服务器限制或在连接之间均匀分配带宽。通过拥有多个连接,您正在欺骗该系统并获得超过您“公平”份额的带宽。
这一切都与利特尔定律有关。具体来说,每个流向 Web 服务器都会看到一定数量的 TCP 延迟,因此只能携带这么多数据。增加 TCP 窗口大小和实现选择性确认等技巧会有所帮助,但实施得很差,通常会导致比解决的问题更多的问题。
拥有多个流意味着随着全局吞吐量的整体增加,每个流看到的延迟就不那么重要了。
即使使用单线程,下载加速器的另一个关键优势是,它通常比使用内置下载工具的 Web 浏览器更好。例如,如果 Web 浏览器决定死机,下载工具将继续。下载工具可能支持内置浏览器所不支持的暂停/恢复等功能。
大多数下载“加速器”实际上根本不会加速任何事情。他们擅长做的是拥塞网络流量,锤击您的服务器,并破坏您所看到的自定义脚本。基本上,它的工作原理是,它不是发出一个请求并从头到尾下载文件,而是发出四个请求......第一个从 0-25% 下载,第二个从 25-50% 下载,依此类推,它使它们同时出现。唯一有帮助的特殊情况是,如果他们的 ISP 或防火墙执行某种流量整形,使得单个下载速度被限制为低于其总下载速度。
就个人而言,如果它给您带来了任何麻烦,我会说只是通知不支持下载加速器,并让用户正常下载它们,或者仅使用单个线程。
一般来说,他们不会。
为了回答问题的实质内容,假设服务器基于每个连接对下载进行速率限制,因此同时下载多个块将使用户能够充分利用其末端可用的带宽。
您将在维基百科上获得有关下载加速器的更全面概述。
加速是多方面的
第一
托管/加速下载的一个实质性好处是,该工具会记住传输的开始/停止偏移量,并使用“部分”和“范围”标头来请求文件的一部分,而不是全部。
这意味着如果某些东西在事务中死亡(即:TCP超时),它只是从中断的地方重新连接,而不必从头开始。
因此,如果连接间歇性,则聚合传输时间将大大缩短。
第二
下载加速器喜欢使用相同的启动-范围-停止机制将单个传输分解为几个大小相等的较小段,并并行执行它们,这大大缩短了慢速网络上的传输时间。
有一种烦人的东西叫做带宽延迟乘积,其中两端的 TCP 缓冲区的大小与 ping 时间一起做一些数学操作,以获得实际体验的速度,这在实践中意味着无论所有临时连接有多少兆比特/秒,大 ping 时间都会限制您的速度。
但是,此限制似乎是“每个连接”,因此与单个服务器的多个 TCP 连接可以帮助减轻高延迟 ping 时间对性能的影响。
因此,住在附近的人不太可能需要进行分段转移,但居住在遥远地点的人更有可能从他们的分段中受益。
第三
在某些情况下,可以找到提供相同资源的多个服务器,有时单个 DNS 地址会循环到多个 IP 地址,或者服务器是某种镜像网络的一部分。下载管理器/加速器可以检测到这一点,并在多个服务器上应用分段传输技术,使下载器能够获得更多的集体带宽。
支持
支持第一种加速是我个人建议的“最低限度”支持。主要是因为它使用户的生活变得轻松,并且由于用户不必重复获取相同的内容,因此减少了您必须提供的聚合数据传输量。
为了方便这一点,它建议您计算他们已经转移了多少,并且在他们看起来“完成”之前不要过期票证(同时将流量绑定到使用票证的第一个 IP),或者给定的“合理”时间下载它已经过去了。即:在要求他们获得新票之前,给他们一个宽限期。
支持第二个和第三个会给你加分,用户通常至少希望它第二个,主要是因为国际客户不喜欢仅仅因为 ping 时间更长而被视为二等客户,而且它客观上不会消耗更多的带宽在任何意义上重要。最糟糕的情况是,它们可能会导致总吞吐量对服务的运行方式不利。
提供第一种好处而不允许第二种好处是相当直接的,只需限制单个票证的并发传输数量即可。
评论
我的理解是,下载加速器使用的一种方法是打开许多并行的 TCP 连接——每个 TCP 连接只能这么快,并且通常在服务器端受到限制。
TCP 的实现使得如果发生超时,则会增加超时期限。这在防止网络过载方面非常有效,但代价是单个 TCP 连接的速度。
下载加速器可以通过打开数十个 TCP 连接并删除速度慢到低于特定阈值的连接,然后打开新连接来替换慢速连接来解决这个问题。
虽然对单个用户有效,但我认为这通常是不好的礼仪。
您看到下载加速器尝试使用相同的交易票证重新进行身份验证 - 我建议忽略这些请求。
通常,下载加速器依赖于 。就像流媒体播放器一样,媒体播放器要求将一小块完整文件提供给服务器,然后下载并播放。现在的问题是,如果服务器限制,那么下载加速器将无法工作!配置服务器很容易,例如限制.partial content download - status code 206
partial-content-download
Nginx
partial-content-download
如何知道文件是否可以通过范围/部分下载?
答:检查标头值。如果它确实存在,那么你就可以开始了。Accept-Ranges:
如何在任何编程语言中实现这样的功能?
答:嗯,这很容易。只需启动一些线程/协程(在 I/O 或网络绑定系统中的进程上选择线程/协程)即可并行下载 N 个块。将部分文件保存在文件中的正确位置。从技术上讲,你已经完成了。通过保留一个全局变量来计算下载速度,并在一个线程完成下载块时增加它。不要忘记,当我们从多个线程写入全局资源时,请执行 A 和 .并且还保留了一个 unix 时间计数器。并像做数学一样downloaded_till_now=0
mutex
thread.acquire()
thread.release()
speed_in_bytes_per_sec = downloaded_till_now/(current_unix_time-start_unix_time)
评论