如何利用BT协议构建一个简单的CDN网络
种子下载源需部署到公网服务器上,部署在内网服务器上没见成功下载过。
一、 服务器上部署tracker服务 tracker服务器建议采用OpenTracker(据说可以在生产环境下使用)。OpenTracker/BitTorrent5.0.9/BitTornado任选其一,建议OpenTracker
系统环境:
python2.7
(一) 关闭防火墙或设置允许 systemctl status firewalld systemctl stop firewalld
(二) OpenTracker yum install epel-release yum -y groupinstall “Development Tools” yum -y install openssl-devel zlib-devel
先编译libowfat: cd libowfat make
然后再编译opentracker: cd .. cd opentracker make
如果编译中出现__builtin_bswap16相关的错误,则 vi libowfat/uint16.h 加入 static inline unsigned short __builtin_bswap16(unsigned short a) { return (a<<8)|(a>>8); }
完成之后,我们将二进制文件移动到/usr/bin: cp opentracker /usr/bin
/usr/bin/opentracker -p 1337 -P 1337
制作种子的时候,我们添加Tracker服务器时,可以这么写: http://你的服务器公网IP:1337/announce
或者: udp://你的服务器公网IP:1337/announce
当然也可以同时添加http和udp,这个不受影响。注意:udp的兼容性不好,旧的bt客户端不支持,如BitTorrent3.4.2
OpenTracker还有一个自带的统计功能: http://你的服务器公网IP:1337/stats
更详细的统计信息访问: http://你的服务器公网IP:1337/statsmode=everything
(三) BitTorrent3.4.2 参考:https://blog.csdn.net/deccmtd/article/details/5432495
1、安装bittorrent BitTorrentg下载 tar zxvf BitTorrent-3.4.2.tar.gz cd BitTorrent-3.4.2 python setup.py install
2、启动Tracker服务 ./bttrack.py –port 6969 –dfile dstate >>/var/log/bttrack.log #表示打开6969并记录log
3、制作BT发布文件
(四) BitTorrent5.0.9
yum install python-devel python-crypto pyOpenSSL zope
安装python-pip https://pypi.org/project/pip/#files
升级pyopenssl
pip install pyopenssl –user –upgrade 安装python-setuptools yum install python-setuptools
https://pypi.org/project/setuptools/
python setup.py install 安装python-twisted yum install python-twisted (在centos6.5上可以,在centos7上不行)
https://pypi.org/project/Twisted/#files
安装BitTorrent5.0.9 python setup.py install
启动tracker服务 /usr/bin/bittorrent-tracker –port 6969 –dfile dstate
(五) 服务器上部署安装BitTornado http://www.bittornado.com/官网,2004年3月发布初始版本,2006年发布0.3.18后未见更新。github上有别的持续更新,但测试中发现有问题 https://github.com/effigies/BitTornado
- 安装python3 wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
tar xvf Python-3.6.2.tar.xz cd Python-3.6.2 ./configure –prefix=/usr/local/python3 make && make install
ln -s /usr/local/python3/bin/python3 /usr/bin/python3 ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 二、 制作种子文件.torrent 简单通过bitComet或uTorrent制作种子后,将种子提供给他人,并不能正常下载。通过在服务器上启动种子源下载,才见有下载进度。制作种子可以使用BitComet、btmakemetafile.py等均可。
(一) BitTorrent3.4.2 ./btmakemetafile.py /home/media/chaoshikongtongju.mp4 http://www.yourdomain.com:1337/announce #btmakemetafile.py 目录或者文件 track服务器地址和端口 (二) BitTorrent-5.0.9 某个文件: /usr/bin/maketorrent-console http://192.168.0.7:1337/announce /home/media/sample.mp4 某个目录: /usr/bin/maketorrent-console http://192.168.0.7:1337/announce /home/media/sample
三、 在服务器上启动种子下载源
(一) BitTorrent3.4.2
启动原始下载服务(seed) nohup ./btdownloadheadless.py –max_allow_in 20 –max_upload_rate 500 –minport 6888 –maxport 6888 /home/media/chaoshikongtongju.mp4.torrent –saveas /home/media/chaoshikongtongju.mp4 >/dev/null &
–saveas 后面是下载后保存的文件名(同源文件名路径,这样这个任务即等同完成了下载后的提供源数据的下载任务)
/data/www/client/myfile.exe.torrent 发布文件的位置 /data/www/client/myfile.exe 实际位置 –maxallow 20 指这个种子最多可以接受20个连接 –maxupload_rate 500 指这个种子最大的可以接受下载的带宽 500 KB(byte)/s,这样可以控制下载带宽。 –minport 6888 –maxport 6888 最大最小监听端口,这样写就是说种子只监听6888端口,这样方便在防火墙上开端口。
作为BT服务器.目标是共享更多的文件给用户下载,如果对于每个“种子”都要启动一个Downloader,不但非常烦琐,可能还会大大影响服务器效率。
为了解决这个问题,BitTorrent提供了另外两个Downloader程序btlaunchmany.py和btlaunchmanycurses.py。这两个程序会定时检查指定目录,对其中的所有“种子”启动Downloader,并根据目录内容增加和删除Downloader。 btlaunchmanycurses.py是一个图形控制台界面,而btlaunchmany.py则更适合于后台运行程序。 btlaunchmanycurses.py需要图形界面.还需要给下载频道负责人服务器的权限.所以我们使用btlaunchmany.py后台运行程序. 用法如下:
#/usr/bin/btlaunchmany.py –data_dir /源目录 –torrent_dir /种子目录
启动后.btlaunchmany.py使用6881端口.默认每隔120秒到种子目录探测一次.
(二) BitTorrent-5.0.9 ./bittorrent-console.py /home/media/chaoshikongtongju.mp4.torrent –save_as /home/media/chaoshikongtongju.mp4
/usr/bin/launchmany-console /home/media
四、 在http上部署torrent文件下载源 需要配置Web服务器,将.torrent文件和application/x-bittorrent相关联。编辑Apache的配置文件httpd.conf,添加如下内容:
AddType application/x-bittorrent .torrent
然后重新启动Web服务器,并将刚刚制作的“种子”放置在Web服务器的提供下载的目录中,让用户可以访问
五、 linux上部署bt客户端
yum install python-devel cmake
cd boost. ./bootstrap.sh ./b2 ./b2 install
cd /tmp/libtorrent-rasterbar-1.1.10 ./configure make && make install
cd examples cmake . make
./client_test 文件.torrent
即可看到下载过程。
六、 Windows上的bt客户端
BitComet会出现一直无法下载的问题,估计因为被官方诟病后,禁止其连接有关。 使用μTorrent正常。
七、 利用bt构建点播节目分发系统 节目分发服务器采用centos、ubuntu等大规模应用安装的系统,方便部署。 基于内网的服务器采用iso封装的形式,安装系统更简便。
(一) 节目分发服务 MovieSource 1. 上传方式/节目入库 一部电影一个目录,目录下包含海报图片,一个或多个电影文件(连续剧); 电影文件上传采用SFTP方式、上传完毕后,通过http触发一键入库,入库同时生成torrent文件。入库的电影默认以主文件名做为电影名,(电影名、入库时间、电影文件名、torrent)其他信息为空,需完善后才能上架。初期可通过phpMyAdmin来操作。 2. Bt Server 使用launchmany-console.py对某一目录下所有torrent文件进行监视,提供bt下载更新服务。
- 数据库 电影信息表 包含电影名、评分、上映日期、类型、导演、主演、片长、国家地区、简介、文件名、入库时间、torrent文件下载地址、FTP下载地址、上架状态、海报图等信息; 客户端点播次数和付费次数应能更新进电影信息数据库,以用于优化分发; vod服务器信息表 数字id,机器码,是否分发,
Http Server 提供电影信息查询接口,用于更新电影
为避免电影资源被非法盗用,此查询接口需要加认证,避免非法用户和同一帐号同时登陆,应保证一个帐号只能在一台机器上使用。 电影优先更新热播电影Top100、付费率高电影、新入库电影,以加快分发效率;
(二) 管理服务器 VodManager 对所有内网点播服务器进行管理 设置点播服务器在云朵上对应的组织号 接收订单回调
(三) 内网点播服务器 VodServer MovieUpdate 连接MovieSource,执行Login,认证通过则获取到待更新的节目列表,将节目数据保存到本地数据库中。
MovieDownload 读取本地数据库中的待更新节目数据,启动下载任务,将电影下载到本地硬盘中,下载完成后,将相应的节目记录上架。 电影更新程序,默认设置2台“节目分发服务器”地址 可指定将电影更新到哪个目录下。
HTTP服务:给点播终端apk提供电影点播服务、及节目清单查询接口。 供apk查询电影节目列表的数据接口 最简的登陆管理后台,可控制下架哪个节目;(可选)
BT分发服务 是否打开种子下载源服务,在云端可开关。 使用launchmany-console.py对某一目录下所有torrent文件进行监视,提供bt下载更新服务。
FRP服务 连接管理服务器VodManager
八、 为BT增加认证 由于bt客户端在下载torrent文件后,会连接tracker服务器获取相关信息,因此可通过修改libtorrent客户端和opentracker代码,在http的url中加入相关认证
对libtorrent客户端的修改主要在src\http_tracker_connection.cpp中, 对opentracker的修改应该在ot_http.c中http_handle_announce方法
对BitTorrent-5.0.9的种子源服务(也是opentracker的客户端之一)的BitTorrent\Rerequester.py的def _announce方法进行修改。