前段时间曾经和朋友一起搞过,多线程的文件传输,为什么用多线程呢,道理很简单就是为了提高文件的传输速度。后来因为一些原因,这个东西没有能完成,我也就放下了。闲来无事,重新思考一下以前的模型,我以前曾经担心过的东西似乎还是有些道理的。用多线的方式来进行文件传输真的能够有效的提高文件传输速度么?
咋看来,现在的一些下载工具Flashget,Netants和Linux下面的d4x, prozilla,还有自己的写的下载工具(myget),不都是通过多线程来加速文件的下载的么,那么用多线程进行文件传输,也应该能够提高速度的。且慢,隐约中觉得这样草率的下结论是不妥的,应该有些隐含条件没能充分的考虑进去。
文件在网络是以ip包的方式传递的,并且源与目的地址之间的路径基本上是固定的,如果用多线程进行文件传输,那么在ip层的效果就是单位时间内的发出的包短时间内增多了,但是,由于流量控制的结果,单位时间内传递的包的数量应该会下降,并稳定在一个基本恒定的值,两点之间的速度瓶颈还是限制了包的传递速度,所以这种想通过多线程并行文件传输来提高文件传输速度的方案是徒劳的,白白增加了文件传输控制的复杂性。
那么难道说所谓的多线程下载工具都是“骗人的”?
我们不妨将速度瓶颈按所在位置分为以下三种:
- 瓶颈在用户端,比如说用户使用小猫拨号上网,速度最大只能为(56kbps)。
- 瓶颈在路径中,比如说两个子网之间互连的线路限制了速度。
- 瓶颈在服务器端,其实这个也可以分为两种情况:(1)服务器限制了每个连接的速度。(2)服务器所连网络的带宽较小。
对于情况1,我们除了更换更大的带宽,比如说采用ADSL拨号上网,似乎应该没有更好的办法。如果你有充足的money,用宽带直连,或者是申请一条专线,更好!
对于情况2,如果所需文件只有通过那个瓶颈线路外没有其他的方法可以得到,我们也只有认命了。但是,事实的情况是,网络也是为每个连接公平的分配流量(这个连接可能不是用户到服务器的直接连接,可能是和瓶颈路由器相连的几个路由器之间的连接),那么我们就有可能通过不同的路由来实现下载加速,比如通过其他的网络节点来代理取得文件的其他部分。如果这个文件不是唯一的,那么我们也可以通过向其他服务器来请求其他部分来获得下载加速。
对于情况3,如果服务器只限制了每个连接的速度,而不是限制了每个ip的速度,并且也没有限制每个ip的连接数,那么我们完全可以通过多线程来实现下载的加速,这种速度的提升通常也是和线程数成正比的。至于服务器所连网络的带宽较小的情况和情况2就很相像了,提速方法也类似。
现在所有的文件传输的加速方法应该也无外乎以上讨论的几种:
- 通过向服务器发起多个连接来加速:flashget, prozilla, d4x, myget, netants.
- 通过多镜像来加速:prozilla, d4x.
- 通过多路由合作下载:迅雷,bt.
当然,实际实现起来并没有原理这样简单,还要涉及到很多细节方面的问题,比如如何校验文件的完整性,如何估测路径的损耗,如何动态调节路径的安排,云云... ...
阅读(1542) | 评论(0) | 转发(0) |