原理:
把一些多线程的下载技术(例如flashget、网络蚂蚁所用到的),改进为一种数据缓冲技术,应用在文件、媒体等数据传输上。HTTP支持通过Range域来指定开始传输一个资源数据的起始位置。
实验测试:
在宿舍用CMCC的WLAN从www.xiaoxia.org下载一个13MB的文件,
单线程传输平均速度:14kB/s
8个线程传输平均速度:134kB/s
测试发现8个线程的平均传输速度比1个线程的平均传输速度要快,这是为什么呢?
继续测试发现,单个线程传输的时候,速度可能会慢慢减小,所以最后只剩下可怜的14kB/s的平均速度了。而在我实现的网络加速程序里,每个连接的生命时长大概只有10几秒钟,所以它们的速度可以保持很好。
上图的示例是播放一个youku上的高清视频。原来单个连接速度为55kB/s,看高清视频有时候会卡一下。开启网络加速后,使用8个连接同时传输 数据,最终平均速度为386kB/s,其中包含了创建连接等待响应的时间,以及一开始计算速度,估计数据缓冲块大小的时间在内。而实际当8个连接同时传输 的时候,瞬时速度超过了400kB/s。
但是,实现起来跟多线程下载工具实现在细节上有所不同。因为你需要支持网络流媒体的实时播放,所以你至少需要使用一个缓冲池来存放多线程下载的数据。流媒体是顺序播放的,所以传输位置必须是顺序的,而不能够随机定位一个连接传输数据的位置。
例如下图所示,在缓冲到资源数据的任何一个位置(例如末尾的时候),必须保证前面的数据已经全部获取。
总结
这种通过创建多路连接来突破传输速度而实现的网络加速方法,不需要借助额外的网络服务器,实现起来也很简单,只需要在客户端或者浏览器上进行改进。 例如,可以开发一个桌面代理软件来实现本地代理加速,也可以开发一个浏览器插件,又或者可以修改一个Chrome或者Mozzila浏览器内核,发布一个 自己的高速浏览器!
注意,此方法不能突破用户网络带宽的限制。
本文所用加速工具源代码及Win32可执行文件下载:
httpspeeder
包含文件:
│ httpSpeeder.exe │ pthreadGC2.dll │ readme.txt │ └─src config.cpp config.h contentbuffer.cpp contentbuffer.h cppthread.cpp cppthread.h filelog.cpp filelog.h httpconnection.cpp httpconnection.h httpmessage.cpp httpmessage.h httprequest.cpp httprequest.h httpresponse.cpp httpresponse.h httpserver.cpp httpserver.h httpshrimp.cpp httpshrimp.h httpsocket.cpp httpsocket.h httpSpeeder.mk httpSpeeder.project main.cpp
另外,补充一下,用电信专线下载同样大小的文件,
单线程:
8线程:
这下子又没有8倍提速是因为受到xiaoxia.org的服务器输出带宽的限制,不能再提高了!
来源:http://xiaoxia.org/2011/04/02/using-multi-thread-transmission-principle-to-realize-the-network-acceleration/