天天看點

架構 BitTorrent BT伺服器

BitTorrent介紹:

傳統的檔案下載下傳服務都是基于用戶端/伺服器模型,被下載下傳的檔案放在伺服器上,使用者登入伺服器,将該檔案下載下傳到本地。在檔案下載下傳的過程中,被傳輸檔案的來源和目的端并不對等,伺服器隻是單向地将檔案傳送給用戶端。

  這種傳統軟體下載下傳模式的缺點是顯而易見的,整個系統的瓶頸位于伺服器。由于受到伺服器處理能力、網際網路接傳入連結路帶寬等多種環境的制約,當下載下傳量非常大時,伺服器往往不堪重負。而使用者下載下傳完畢後就和伺服器沒有任何聯系,其它使用者也無法從以前使用者下載下傳的版本得到任何幫助。

  随着網際網路技術的不斷發展,P2P(Peer To Peer,點到點)技術逐漸成為檔案交換和下載下傳的成熟技術。P2P技術将網際網路“自由、平等、互助、共享”的精神發揚光大。

  最早的P2P技術是音樂交換軟體Napster,目前最流行的P2P檔案交換技術則是BT(BitTorrent,比特流)。

  BT是BitTorrent(比特流)的簡稱,BT的特點是使用者下載下傳的同時,也在為其它使用者提供上傳,是以不會像FTP/HTTP伺服器那樣随着使用者數的增加而導緻下載下傳速度降低。恰恰相反,對于BT下載下傳而言,下載下傳的人越多速度越快。

傳統檔案下載下傳:

架構 BitTorrent BT伺服器

傳統的檔案共享服務,如FTP、HTTP等工作原理如上圖所示。這種方式随着使用者數的增多,對帶寬的要求也随之增多,使用者過多就會造成瓶頸,是以很多下載下傳網都有并發使用者數的限制及下載下傳速度的限制等。

BT下載下傳:

架構 BitTorrent 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

[plain] view plaincopy

  1. # cd /usr/local/src/tarbag/
  2. # wget http://downloads.activestate.com/ActivePython/releases/2.7.0.2/ActivePython-2.7.0.2-linux-x86_64.tar.gz
  3. # tar -zxvf ActivePython-2.7.0.2-linux-x86_64.tar.gz -C ../software/
  4. # cd ../software/ActivePython-2.7.0.2-linux-x86_64/
  5. # ./install.sh
  6. Enter directory in which to install ActivePython. Leave blank and press 'Enter' to use the default [/opt/ActivePython-2.7].
  7. Install directory: /usr/local/python
  8. ()
  9. Installing ActivePython to '/usr/local/python'...
  10. Relocating dir-dependent files...
  11. Pre-compiling .py files in the standard library...
  12. ActivePython has been successfully installed to:
  13. /usr/local/python
  14. # ls /usr/local/python/
  15. bin doc include lib share

再把python的路徑寫入PATH

[plain] view plaincopy

  1. # env |grep PATH
  2. 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

[plain] view plaincopy

  1. #cd /usr/local/src/tarbag/
  2. #wget http://download.bittorrent.com/dl/archive/BitTorrent-3.9.1.tar.gz
  3. #tar -zxvf BitTorrent-3.9.1.tar.gz -C ../software
  4. #cd ../software/BitTorrent-3.9.1
  5. #python setup.py install //(安裝)

安裝完後bt的所有工具都在/usr/local/python/bin/下面

[plain] view plaincopy

  1. # ls /usr/local/python/bin/bt*
  2. /usr/local/python/bin/btdownloadcurses.py /usr/local/python/bin/btlaunchmany.py /usr/local/python/bin/btrename.py
  3. /usr/local/python/bin/btdownloadgui.py /usr/local/python/bin/btmaketorrentgui.py /usr/local/python/bin/btshowmetainfo.py
  4. /usr/local/python/bin/btdownloadheadless.py /usr/local/python/bin/btmaketorrent.py /usr/local/python/bin/bttest.py
  5. /usr/local/python/bin/btlaunchmanycurses.py /usr/local/python/bin/btreannounce.py /usr/local/python/bin/bttrack.py

3.啟動BT服務

第一步,BT系統的核心是Tracker,是以架設一台BT伺服器的第一步就是要啟動一個Tracker:

[plain] view plaincopy

  1. #/usr/local/python/bin/python2.7 /usr/local/python/bin/bttrack.py --port 6969 --dfile /vat/log/bttrack.log&
  2. # ps -ef |grep python
架構 BitTorrent BT伺服器

[plain] view plaincopy

  1. # netstat -lntp |grep 6969
架構 BitTorrent BT伺服器

啟動成功後.可以通過web檢視一些關于種子的資訊.

架構 BitTorrent BT伺服器

因為現在隻啟動了tracker服務.還沒有種子.是以 not tracking any files yet...

第二步,需要對希望提供下載下傳的檔案制作“種子”,btmakemetafile.py可以對檔案也可以對目錄制作“種子”。

[plain] view plaincopy

  1. #/usr/local/python/bin/btmaketorrent.py http://localhost:6969/announce /www/btftp/檔案名
  2. #/usr/local/python/bin/btmaketorrent.py http://localhost:6969/annouce /www/目錄名
  3. 例子:
  4. #/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,添加如下内容:

[plain] view plaincopy

  1. AddType application/x-bittorrent .torrent

然後重新啟動Web伺服器,并将剛剛制作的“種子”放置在Web伺服器的提供下載下傳的目錄中,讓使用者可以通路。

最後一步,啟動一個Downloader(最原始的共享源),使以後的使用者可以獲得最初的拷貝:

[plain] view plaincopy

  1. # 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則更适合于背景運作程式。

btlaunchmanycurses.py需要圖形界面.還需要給下載下傳頻道負責人伺服器的權限.是以我們使用btlaunchmany.py背景運作程式.

用法如下:

[plain] view plaincopy

  1. #/usr/local/python/bin/btlaunchmany.py --data_dir /源目錄 --torrent_dir /種子目錄

啟動後.btlaunchmany.py使用6881端口.預設每隔120秒到種子目錄探測一次.

架構 BitTorrent BT伺服器

下載下傳測試:

架構 BitTorrent BT伺服器
架構 BitTorrent BT伺服器

現在這個種子已經做好.并且已經釋出可以下載下傳.

架構 BitTorrent BT伺服器

以下是我以前公司使用的BT的一些相關内容,留個底下:

伺服器IP:220.*.*.*

[plain] view plaincopy

  1. [[email protected] www]# ls
  2. btftp btseed download wget

btftp:源目錄

btseed:釋出的種子目錄(Web提供下載下傳的工作目錄)

download:從官網下載下傳資源存放的目錄

wget:上傳wget.txt、 上傳資源的目錄

[plain] view plaincopy

  1. [[email protected] wget]# ls
  2. error.txt ftp wget.txt

ftp目錄是挂載btftp

相關腳本:

[plain] view plaincopy

  1. btstart.sh: 啟動BT服務/btlaunchmany.py背景程序
  2. #functions:Start BT server --20101022---
  3. #!/bin/bash
  4. cd /usr/bin;python bttrack.py --port 6969 --dfile /var/log/bttrack.log > /dev/null 2>&1 &
  5. /usr/bin/btlaunchmany.py --data_dir /www/btftp/ --torrent_dir /www/btseed/ > /dev/null 2>&1 &

需要注意,提供使用者通路的“種子” * .torrent應該跟原始檔案存放在同一個目錄下,也就是Web伺服器提供下載下傳的目錄裡除了*.torrnet檔案還應該存有原始檔案或到原始檔案的連結(硬連結,軟連結經測試無法提供下載下傳),否則Downloader會自動拷貝一份源檔案到“種子”所在目錄下。

[plain] view plaincopy

  1. btseed.sh: 制作種子
  2. #functions:Make torrent and mv torrent! ---20101021---
  3. basedir=/www/btftp/
  4. seeddir=/www/btseed/
  5. ftp=`ls $basedir | grep -v index.html | grep -v resume | grep -v metainfl > /tmp/1.txt`
  6. number=`cat /tmp/1.txt |wc -l`
  7. for (( i=1; i<=$number; i=i+1 ))
  8. do
  9. file=`sed -n "$i"p /tmp/1.txt`
  10. if [ ! -f "$seeddir$file.torrent" ] ;then
  11. btmaketorrent.py http://220.162.237.140:6969/announce $basedir$file
  12. ln $basedir$file $seeddir
  13. mv $basedir$file.torrent $seeddir
  14. fi
  15. done

[plain] view plaincopy

  1. btwget.sh: 從官方網站下載下傳資源
  2. #author:hushuangfeng
  3. #function:Wget files and mv to /www/btftp ---20100430---
  4. #!/bin/bash
  5. export [" -f 1 /www/wget/wget.txt > /tmp/wget.txt
  6. number=`cat /tmp/wget.txt |wc -l`
  7. for (( i=1; i<=$number; i=i+1 ))
  8. do
  9. file=`cat /tmp/wget.txt | awk -F / '{print $NF}' | sed -n "$i"p`
  10. url=`sed -n "$i"p /tmp/wget.txt`
  11. if [ ! -f /www/btftp/$file ] ;then
  12. wget -P /www/download $url > /dev/null 2>/www/wget/error.txt && mv /www/download/$file /www/btftp
  13. fi
  14. echo " " > /www/wget/wget.txt && rm -rf /tmp/wget.txt
  15. done

[plain] view plaincopy

  1. #cat /etc/rc.local
  2. /usr/local/scripts/btstart.sh
  3. # crontab -l
  4. */30 * * * * /usr/local/scripts/btseed.sh
  5. 00 1 * * * /usr/local/scripts/btwget.sh

轉載自:http://blog.csdn.net/deccmtd/article/details/5432495