BitTorrent介绍:
传统的文件下载服务都是基于客户端/服务器模型,被下载的文件放在服务器上,用户登录服务器,将该文件下载到本地。在文件下载的过程中,被传输文件的来源和目的端并不对等,服务器只是单向地将文件传送给客户端。
这种传统软件下载模式的缺点是显而易见的,整个系统的瓶颈位于服务器。由于受到服务器处理能力、互联网接入链路带宽等多种环境的制约,当下载量非常大时,服务器往往不堪重负。而用户下载完毕后就和服务器没有任何联系,其它用户也无法从以前用户下载的版本得到任何帮助。
随着互联网技术的不断发展,P2P(Peer To Peer,点到点)技术逐渐成为文件交换和下载的成熟技术。P2P技术将互联网“自由、平等、互助、共享”的精神发扬光大。
最早的P2P技术是音乐交换软件Napster,目前最流行的P2P文件交换技术则是BT(BitTorrent,比特流)。
BT是BitTorrent(比特流)的简称,BT的特点是用户下载的同时,也在为其它用户提供上传,所以不会像FTP/HTTP服务器那样随着用户数的增加而导致下载速度降低。恰恰相反,对于BT下载而言,下载的人越多速度越快。
传统文件下载:
传统的文件共享服务,如FTP、HTTP等工作原理如上图所示。这种方式随着用户数的增多,对带宽的要求也随之增多,用户过多就会造成瓶颈,所以很多下载网都有并发用户数的限制及下载速度的限制等。
BT下载:
BT下载首先在第一个共享端(或称为Downloader)把一个文件分成N个部分,A用户可以从Downloader上随机下载第M个部分,B用户可以在Downloader服务器随机下载第K个部分。而A用户的BT客户端下载程序会根据情况从B用户下载第K个部分,同样的,B用户也可以从A用户下载第M个部分,通过这种方式减轻服务器端负荷,加快用户的下载速度。
例如,C用户直接从服务器下载,速度可能只有几Kbps,而从A、B用户处下载,速度将快很多。用户在下载的同时,也在上传文件,在享受别人提供下载服务的同时,每个用户也同时在上载并贡献自己的带宽,所以造成使用BT下载服务的人越多,大家的速度就越快。BT下载的优越性就在这里体现.
从构建BT服务器的角度来看,整个BT系统由四个部分组成:
1.BT客户端
BT客户端是安装在用户PC机上的客户端软件,目前有很多BT客户端可用,如迅雷.BitComet
2.BT“种子”文件
BT“种子”文件是一个名为.torrent的文件,它是由第一个发布共享文件者根据源文件制作出来的源文件的指纹信息。“种子”文件很小,一般在几十KB到几百KB之间,其中包含文件所在的BT端地址信息及目标文件的校验码。当BT用户获得“种子”后,直接在BT客户端软件中运行“种子”文件,BT软件将根据“种子”文件包含的信息,自动查找到该文件所有可用的下载源,并进行下载。
3.Tracker
使用BT服务不需要指定服务器,虽然在BT服务里面仍然有服务器的概念,但使用BT服务的人并不需要关心服务器在哪里。BT服务器称为Tracker,准确地说,Tracker是指运行于服务器上的一个程序,这个程序能够追踪到底有多少人同时在下载同一个文件。BT客户端连接上Tracker服务器,就会获得一个下载人员的名单,根据这个名单,BT客户端会自动连接网络中其它节点进行下载。
4.种子
BT服务把提供完整文件的用户节点称为“种子”(Seed),正在下载的用户称为客户(Client)。某一个文件现在有多少“种子”、多少“客户”是可以看到的。只要有一个“种子”就可以放心地下载。当然,种子越多、客户越多的文件下载的速度会越快。
如果发现“种子”数为0,那么就不需要去尝试了。当某个用户下载完成后,如没有选择关闭,其它人就可以从该用户处继续下载文件。所以当下载的人多起来,通常做“种子”的人也会随之增加,下载速度也会加快。
安装:
1.下载BT
BitTorrent是一个开源免费软件,它使用Python语言编写。这意味着BitTorrent具有出色的跨平台特性。用户不仅可以在Windows中使用BT,也可以方便地在Linux/Unix平台下使用。 下载地址:http://download.bittorrent.com/dl/archive/BitTorrent-3.9.1.tar.gz
2.安装BT
在安装BitTorrent以前,首先要确保系统已经安装有Python:
安装Python
# cd /usr/local/src/tarbag/ # wget http://downloads.activestate.com/ActivePython/releases/2.7.0.2/ActivePython-2.7.0.2-linux-x86_64.tar.gz # tar -zxvf ActivePython-2.7.0.2-linux-x86_64.tar.gz -C ../software/ # cd ../software/ActivePython-2.7.0.2-linux-x86_64/ # ./install.sh Enter directory in which to install ActivePython. Leave blank and press 'Enter' to use the default [/opt/ActivePython-2.7]. Install directory: /usr/local/python () Installing ActivePython to '/usr/local/python'... Relocating dir-dependent files... Pre-compiling .py files in the standard library... ActivePython has been successfully installed to: /usr/local/python # ls /usr/local/python/ bin doc include lib share再把python的路径写入PATH
# env |grep PATH PATH=/usr/lib64/qt.3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/python/bin安装BT Tracker
#cd /usr/local/src/tarbag/ #wget http://download.bittorrent.com/dl/archive/BitTorrent-3.9.1.tar.gz #tar -zxvf BitTorrent-3.9.1.tar.gz -C ../software #cd ../software/BitTorrent-3.9.1 #python setup.py install //(安装)安装完后bt的所有工具都在/usr/local/python/bin/下面
# ls /usr/local/python/bin/bt* /usr/local/python/bin/btdownloadcurses.py /usr/local/python/bin/btlaunchmany.py /usr/local/python/bin/btrename.py /usr/local/python/bin/btdownloadgui.py /usr/local/python/bin/btmaketorrentgui.py /usr/local/python/bin/btshowmetainfo.py /usr/local/python/bin/btdownloadheadless.py /usr/local/python/bin/btmaketorrent.py /usr/local/python/bin/bttest.py /usr/local/python/bin/btlaunchmanycurses.py /usr/local/python/bin/btreannounce.py /usr/local/python/bin/bttrack.py3.启动BT服务
#/usr/local/python/bin/python2.7 /usr/local/python/bin/bttrack.py --port 6969 --dfile /vat/log/bttrack.log& # ps -ef |grep python
# netstat -lntp |grep 6969
启动成功后.可以通过web查看一些关于种子的信息.
因为现在只启动了tracker服务.还没有种子.所以 not tracking any files yet...
第二步,需要对希望提供下载的文件制作“种子”,btmakemetafile.py可以对文件也可以对目录制作“种子”。
#/usr/local/python/bin/btmaketorrent.py http://localhost:6969/announce /www/btftp/文件名 #/usr/local/python/bin/btmaketorrent.py http://localhost:6969/annouce /www/目录名 例子: #/usr/local/python/bin/btmaketorrent.py http://localhost:6969/announce /www/btftp/zlib-1.2.3.tar.gz
该命令对/www/btftp/zlib-1.2.3.tar.gz文件制作“种子”,“种子”名为zlib-1.2.3.tar.gz.torrent.
第三步,需要配置Web服务器,将.torrent文件和application/x-bittorrent相关联。编辑Apache的配置文件httpd.conf,添加如下内容:
AddType application/x-bittorrent .torrent
然后重新启动Web服务器,并将刚刚制作的“种子”放置在Web服务器的提供下载的目录中,让用户可以访问。
最后一步,启动一个Downloader(最原始的共享源),使以后的用户可以获得最初的拷贝:
# btdownloadheadless.py /www/btseed/zlib-1.2.3.tar.gz.torrent --save_as /www/btftp/zlib-1.2.3.tar.gz
作为BT服务器.目标是共享更多的文件给用户下载,如果对于每个“种子”都要启动一个Downloader,不但非常烦琐,可能还会大大影响服务器效率。
为了解决这个问题,BitTorrent提供了另外两个Downloader程序btlaunchmany.py和btlaunchmanycurses.py。这两个程序会定时检查指定目录,对其中的所有“种子”启动Downloader,并根据目录内容增加和删除Downloader。
btlaunchmanycurses.py是一个图形控制台界面,而btlaunchmany.py则更适合于后台运行程序。#/usr/local/python/bin/btlaunchmany.py --data_dir /源目录 --torrent_dir /种子目录启动后.btlaunchmany.py使用6881端口. 默认每隔120秒到种子目录探测一次.
下载测试:
现在这个种子已经做好.并且已经发布可以下载.
以下是我以前公司使用的BT的一些相关内容,留个底下:
服务器IP:220.*.*.*
[root@www www]# ls btftp btseed download wget
btftp:源目录
btseed:发布的种子目录(Web提供下载的工作目录)
download:从官网下载资源存放的目录
wget:上传wget.txt、 上传资源的目录
[root@www wget]# ls error.txt ftp wget.txt
ftp目录是挂载btftp
相关脚本:
btstart.sh: 启动BT服务/btlaunchmany.py后台进程 #functions:Start BT server --20101022--- #!/bin/bash cd /usr/bin;python bttrack.py --port 6969 --dfile /var/log/bttrack.log > /dev/null 2>&1 & /usr/bin/btlaunchmany.py --data_dir /www/btftp/ --torrent_dir /www/btseed/ > /dev/null 2>&1 &
需要注意,提供用户访问的“种子” * .torrent应该跟原始文件存放在同一个目录下,也就是Web服务器提供下载的目录里除了*.torrnet文件还应该存有原始文件或到原始文件的链接(硬链接,软链接经测试无法提供下载),否则Downloader会自动拷贝一份源文件到“种子”所在目录下。
btseed.sh: 制作种子 #functions:Make torrent and mv torrent! ---20101021--- basedir=/www/btftp/ seeddir=/www/btseed/ ftp=`ls $basedir | grep -v index.html | grep -v resume | grep -v metainfl > /tmp/1.txt` number=`cat /tmp/1.txt |wc -l` for (( i=1; i<=$number; i=i+1 )) do file=`sed -n "$i"p /tmp/1.txt` if [ ! -f "$seeddir$file.torrent" ] ;then btmaketorrent.py http://220.162.237.140:6969/announce $basedir$file ln $basedir$file $seeddir mv $basedir$file.torrent $seeddir fi done
btwget.sh: 从官方网站下载资源 #author:hushuangfeng #function:Wget files and mv to /www/btftp ---20100430--- #!/bin/bash export LANG=zh_CN.UTF-8 cut -d "[" -f 1 /www/wget/wget.txt > /tmp/wget.txt number=`cat /tmp/wget.txt |wc -l` for (( i=1; i<=$number; i=i+1 )) do file=`cat /tmp/wget.txt | awk -F / '{print $NF}' | sed -n "$i"p` url=`sed -n "$i"p /tmp/wget.txt` if [ ! -f /www/btftp/$file ] ;then wget -P /www/download $url > /dev/null 2>/www/wget/error.txt && mv /www/download/$file /www/btftp fi echo " " > /www/wget/wget.txt && rm -rf /tmp/wget.txt done
#cat /etc/rc.local /usr/local/scripts/btstart.sh # crontab -l */30 * * * * /usr/local/scripts/btseed.sh 00 1 * * * /usr/local/scripts/btwget.sh