tracker是指運行於服務器上的一個程序,這個程序能夠追蹤到底有多少人同時在下載同一個文件。客戶端連上tracker服務器,就會獲得一個下載人員的名單,根據這個,BT會自動連上別人的機器進行下載。它是提供bt的服務器。把文件用bt發佈出來的人需要知道該使用哪個服務器來爲要發佈的文件提供tracker。由於不指定服務器,BitTorrent採用BT文件來確定下載源。
tracker服務器是BT下載中必須的角色。一個BTclient在下載開始以及下載進行的過程中,要不停的與tracker服務器進行通信,以報告自己的信息,並獲取其它下載client的信息。這種通信是通過http協議進行的,又被稱爲trackerHTTP協議,它的過程是這樣的: client向tracker發一個HTTP的GET請求,並把它自己的信息放在GET的參數中;這個請求的大致意思是:我是xxx(一個唯一的id),我想下載yyy文件,我的ip是aaa,我用的端口是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() 保存下載信息。這樣,一旦服務器再次投入運行,可以恢復當前的狀態。