如何利用BT协议构建一个简单的CDN网络

种子下载源需部署到公网服务器上,部署在内网服务器上没见成功下载过。

一、 服务器上部署tracker服务 tracker服务器建议采用OpenTracker(据说可以在生产环境下使用)。OpenTracker/BitTorrent3.4.2/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

  1. 安装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下载更新服务。

  1. 数据库 电影信息表 包含电影名、评分、上映日期、类型、导演、主演、片长、国家地区、简介、文件名、入库时间、torrent文件下载地址、FTP下载地址、上架状态、海报图等信息; 客户端点播次数和付费次数应能更新进电影信息数据库,以用于优化分发; vod服务器信息表 数字id,机器码,是否分发,
  2. 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方法进行修改。