1.视频加速器的原理
视频加速器能够提供对HTTP浏览器从HTTP服务器获取.flv,.mp4等类型的流媒体内容进行实时加速,其下载原理类似于典型的 BT下载,由Tracker服务器+客户端构成,当一个HTTP Agent向HTTP服务器请求.flv,.mp4类型的数据时,视频加速器能够定位该资源,并向Tracker服务器发送节点请求,实际的下载分为两部分,这两部分同时进行:一部分为从HTTP服务器的下载;一部分走P2P网络,从拥有此资源的其它节点处下载。其实我们完全可以将成熟的P2SP的下载技术和框架应用于此。
那么剩下一个问题:视频加速器如何截获HTTP浏览器的资源请求并将从P2P网络接受到的数据又回传给它呢?我的第一个念头就是 :BHO.经过分析,我发现他们使用了自动代理配置技术Proxy Auto-Config,简称PAC, 结合注册表和WinInet库的使用,很好的解决了上面的问题。通过动态修改注册表:
- [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion
- \Internet Settings\Connections]
- DefaultConnectionSettings
- SavedLegacySettings
-
- [HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion
- \Internet Settings\Connections]
- DefaultConnectionSettings
- SavedLegacySettings
将代理服务器设置为:
- Use automatic configuration script
- Adress=http:
通过WinInet API:InternetSetOption OPTION=INTERNET_OPTION_SETTINGS_CHANGED来实现代理服务器的实时改动。
这样我们通过PAC文件中FindProxyForURL的实现,就可以实现截获HTTP浏览器的资源请求;同时,由于我们采用的是HTTP Proxy技术来实现于HTTP浏览器的交互,这样将P2P网络中接收到的数据经过HTTP协议封装再传给HTTP浏览器即可。
2.一个视频加速器的PAC文件
以下是一个某视频加速器的PAC文件,主要实现了对本机地址和LAN地址进行直通,对URL开头为http://并且内容为.flv和.mp4的文件获取进行代理加速。
- function FindProxyForURL(url,host){
- if(host == "localhost" || host == "127.0.0.1")
- {
- return "DIRECT";
- }
- var private_re = /^http:\/\/((lisbon)|(0\.0\.0\.0)|(127\.\d+\.\d+\.\d+)|(10
- \.\d+\.\d+\.\d+)|(172\.(1[6789]|2[0-9]|3[01])\.\d+\.\d+)|(169\.254\.\d+\.\d+)
- |(192\.168\.\d+\.\d+)|(22[3-9]\.\d+\.\d+\.\d+)|(2[3-5][0-9]\.\d+\.\d+\.\d+))+/ig
- if(private_re.test(url) || url.substring(0,7) != "http://")
- {
- return "DIRECT";
- }
- var pattern = /[^\/&]+(\.flv|\.mp4)+(\?|$)/ig;
- if(pattern.test(url))
- {
- return "PROXY localhost:9000";
- }
- else
- {
- return "DIRECT";
- }
- }
(cr0_3) |