複製鏈接
請複製以下鏈接發送給好友

tracker

(bt中的系統)

鎖定
tracker是指運行於服務器上的一個程序,這個程序能夠追蹤到底有多少人同時在下載同一個文件。
外文名
tracker
所屬類型
bt中的系統
用    途
確定文件下載源

tracker系統簡介

BT中的Tracker
客户端連上tracker服務器,就會獲得一個下載人員的名單,根據這個,BT會自動連上別人的機器進行下載。它是提供bt的服務器。把文件用bt發佈出來的人需要知道該使用哪個服務器來為要發佈的文件提供tracker。由於不指定服務器,BitTorrent採用BT文件來確定下載源。
tracker服務器是BT下載中必須的角色。一個BTclient在下載開始以及下載進行的過程中,要不停的與tracker服務器進行通信,以報告自己的信息,並獲取其它下載client的信息。這種通信是通過HTTP協議進行的,又被稱為tracker HTTP協議,它的過程是這樣的:
client向tracker發一個HTTP的GET請求,並把它自己的信息放在GET的參數中;這個請求的大致意思是:我是xxx(一個唯一的id),我想下載yyy文件,我的ip是aaa,我用的端口是bbb。。。
tracker對所有下載者的信息進行維護,當它收到一個請求後,首先把對方的信息記錄下來(如果已經記錄在案,那麼就檢查是否需要更新),然後將一部分(並非全部,根據設置的參數已經下載者的請求)參與下載同一個文件(一個tracker服務器可能同時維護多個文件的下載)的下載者的信息返回給對方。
Client在收到tracker的響應後,就能獲取其它下載者的信息,那麼它就可以根據這些信息,與其它下載者建立連接,從它們那裏下載文件片斷。
tracker服務器架設
BitTorrent Tracker是一個高性能增強型BitTorrent服務器。BitTorrent Tracker同時支持HTTP和UDP的Tracker協議,採用高性能服務器技術, 支持多端口同時監聽,數據更新插件。BitTorrent Tracker通過了8萬個文件和80萬個在線用户的高強度測試。用户可根據需要自行改寫數據庫通信插件, 打造屬於自己的服務器, 配合服務器端腳本可實現一個功能完備的BT服務器。
架設好後,您的tracker服務器地址格式
外網ip:端口/announce
tracker tracker
一點渣圖解翻譯勿噴
tracker tracker
BitTorrent Tracker 的特點:
C++編寫,採用高性能網絡通信技術, 高效穩定。
配置簡單容易。
支持HTTP和UDP兩種連接模式, 與BitTorrent客户端完美配合。
可針對用户數量, 進行性能調節。
用瀏覽器進行遠程狀態監視。
支持自定義的數據庫插件, 並提供一個SDK開發示例。
BitTorrent Tracker 更新日誌:
[CORE] 修正了內存泄漏的錯誤
[CORE] 修正了不能在Windows2000操作系統下運行的錯誤
[CORE] 修正了長時間運行Session Table數過高的問題
[CORE] 使用新的多線程內核,提高了數據處理能力
[CORE] 改進了程序數據檢索機制
[GUI] 運行時每隔半小時在exe目錄裏的TrackerLaunchLog.txt文件中記錄程序運行狀態
[GUI] 配置對話框增強數據庫認證功能,分為數據庫中存在記錄和數據庫中通過驗證兩個級別
[CORE] db_fetch() 函數參數改進,可指定數據庫認證級別
[CORE] 改進了程序異常退出時的錯誤檢測機制,錯誤報告可以捕獲更多類型的程序運行時錯誤
[PLUGIN] db_fetch2() 函數參數改進,可從數據庫同時查詢新增及刪除的記錄
[PLUGIN] db_mysql 插件實現了 db_fetch() 和 db_fetch2() 函數的示例代碼
[PLUGIN] db_mssql 插件實現了 db_fetch2() 函數的示例代碼
[GUI] 添加了程序運行後自動啓動服務的選項
[GUI] 添加了更多的數據庫選項
[GUI] 在主界面和"config"對話框中加入了"help"鏈接
[GUI] 在"config"對話框中加入了監聽TCP/UDP端口的可選項
[GUI] 發生錯誤時顯示更詳細的提示信息
[CORE] 增加了連接請求驗證模式,只處理數據庫中存在的任務
[CORE] 修正了長時間運行引起的高CPU負載的問題
[CORE] 改進了數據庫操作
[CORE] 修正了錯誤報告中dmp文件不能被打包的問題
[CORE] 修正了一些可能導致運行時錯誤的問題
[PLUGIN] 增加了兩個數據讀取函數
client和tracker間通信協議細節
在“BT協議規範”中已經給出,這裏不再重複。下面我們具體分析 tracker服務器的實現細節。
從哪裏開始?
要建立一個 tracker服務器,只要運行 程序就行了,它最少需要一個參數,就是 –dfile,這個參數指定了保存下載信息的文件。Bttrack.p 調用 中的 track()函數。因此,我們跟蹤到 track.p 中去看track() 函數。
Track.p:track()
這個函數首先對命令行的參數進行檢查;然後將這些參數保存到 config 字典中。在BT中所有的工具程序,都有類似的處理方式。 [1] 
接下來的代碼:
r = RawServer(Event(), config['timeout_check_interval'], config['socket_timeout'])
t = Tracker(config, r)
r.bind(config['port'], config['bind'], True)
r.listen_forever(HTTPHandler(t.get, config['min_time_between_log_flushes']))
t.save_dfile()
首先是創建一個 RawServer 對象,這是一個服務器對象,它將實現一個網絡服務器的一些細節封裝起來。不僅tracker服務器用到了 RawServer,我們以後還可以看到,由於每個 client端也需要給其它 client 提供下載服務,因此也同時是一個服務器,client的實現中,也用到了RawServer,這樣,RawServer的代碼得到了重用。關於 RawServer的詳細實現,在後面的小節中進行分析。
接着是創建一個 Tracker對象。
然後讓RawServer綁定在指定的端口上(通過命令行傳遞進來)。
最後,調用 RawServer::listen_forever() 函數,使得服務器投入運行
最後,在服務器因某些原因結束運行以後,調用 Tracker::save_dfile() 保存下載信息。這樣,一旦服務器再次投入運行,可以恢復當前的狀態。

tracker系統相關

BT源碼的分佈
把BT的源碼展開之後,可以看到有一些python程序,還有一些説明文件等等,此外還有一個BitTorrent目錄。這些 python程序,實際是一些小工具,比如製作 metafile的、運行tracker服務器的、運行BT client端的 btdownloadheadless 等等。而這些程序中,用到的一些 python 類的實現,都放在子目錄 BitTorrent 下面。我們的分析工作,通常是從工具程序入手,而隨着分析的展開,則重點是看 BitTorrenet子目錄下的代碼。
在談到如何開發可維護的代碼的一篇文章中,其中提到的一條就是開發一些小工具以簡化工作,我想BT的這種源碼結構,也正是作者思想的一種體現吧 [2] 
python的應用
python和我們以前接觸的 c/c++ 不一樣的第一個地方就是它的函數在定義的時候,不用指定參數類型。既然這樣,那麼,在調用函數的時候,你可以傳遞任意類型的參數進來。例如這樣的函數:
def foo(arg):
print type(arg)
你可以這樣來調用:
a = 100
b = “hello world”
foo(a)
foo(b)
輸出結果是:
<type ‘int’>
<type ‘str’>
這是因為,第一次調用 foo()的時候,傳遞的是一個整數類型,而第二次調用的時候,傳遞的是一個字符串類型。
這種參數具有動態類型的特性,是 c/c++等傳統的語言是所不具備的。這也是 python 被稱為動態語言的一個原因吧。C++的高級特性模板,雖然也使得參數類型可以動態化,但使用起來,遠沒有python這麼簡單方便。
電子音樂中的Tracker
許多新遊戲不惜大量硬盤空間使用Wave或APE音樂格式,但在以前由於存儲空間很小,遊戲的音樂大多是都是模塊音樂。(一些對容量有苛刻要求的遊戲仍然使用這類格式)
除了在遊戲中, [3] 
參考資料