Tracker--追蹤者

tracker是指運行於服務器上的一個程序,這個程序能夠追蹤到底有多少人同時在下載同一個文件。客戶端連上tracker服務器,就會獲得一個下載人員的名單,根據這個,BT會自動連上別人的機器進行下載。它是提供bt的服務器。把文件用bt發佈出來的人需要知道該使用哪個服務器來爲要發佈的文件提供tracker。由於不指定服務器,BitTorrent採用BT文件來確定下載源。  

tracker服務器是BT下載中必須的角色。一個BTclient在下載開始以及下載進行的過程中,要不停的與tracker服務器進行通信,以報告自己的信息,並獲取其它下載client的信息。這種通信是通過http協議進行的,又被稱爲trackerHTTP協議,它的過程是這樣的:  clienttracker發一個HTTPGET請求,並把它自己的信息放在GET的參數中;這個請求的大致意思是:我是xxx(一個唯一的id),我想下載yyy文件,我的ipaaa,我用的端口是bbb。。。  

tracker對所有下載者的信息進行維護,當它收到一個請求後,首先把對方的信息記錄下來(如果已經記錄在案,那麼就檢查是否需要更新),然後將一部分(並非全部,根據設置的參數已經下載者的請求)參與下載同一個文件(一個tracker服務器可能同時維護多個文件的下載)的下載者的信息返回給對方。  

Client在收到tracker的響應後,就能獲取其它下載者的信息,那麼它就可以根據這些信息,與其它下載者建立連接,從它們那裏下載文件片斷。

要建立一個 tracker服務器,只要運行 bttrack.py 程序就行了,它最少需要一個參數,就是 –dfile,這個參數指定了保存下載信息的文件。Bttrack.py 調用 track.py 中的 track()函數。因此,我們跟蹤到 track.py 中去看track() 函數。

Track.py:track()   這個函數首先對命令行的參數進行檢查;然後將這些參數保存到 config 字典中。在BT中所有的工具程序,都有類似的處理方式。

接下來的代碼:   

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() 保存下載信息。這樣,一旦服務器再次投入運行,可以恢復當前的狀態。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章