BT客戶端原始碼分析之一 總述

2021-04-28 07:46:54 字數 1920 閱讀 5012

概述:相對於 tracker 伺服器來說,bt客戶端要複雜的多,bram cohen 花了一年 full time 的時間來完成 bt,我估計其中大部分時間是用在 bt 客戶端的實現和除錯上了。

由 於 bt 客戶端涉及的**比較多,我不能再象分析 tracker 伺服器那樣,走上來就深入到細節之中去,那樣的話,我寫的暈暈糊糊,大家看起來也不知所云。所以第一篇文章先來談談客戶端的功能、相關協議,以及客戶端的 總體架構和相關的類的層次結構。這樣,從整體上把握之後,大家在自己分析**的過程中,就能做到胸有成竹。

客戶端的功能:

類層次結構:

bt 客戶端涉及的模擬較多,我首先大致描述一下這些類的功能,然後給出它們的乙個層次結構。

1、rawserver:負責實現網路伺服器

2、rerequester:負責和 tracker 通訊。它呼叫 rawserver::add_task() ,向 rawserver 新增自己的任務函式 rerequester::c()。

3、encoder:一種 handler類(在分析 tracker 伺服器時候提到),負責處理與其它peers建立連線和以及對讀取的資料按照bt對等協議進行分析。

encoder 類在encrypter.py中,該檔案中,還有乙個 connection 類,而在 connecter.py 檔案中,也有乙個 connection 類,這兩個同名的 connection 類有些蹊蹺,為了區分,我把它們重新命名為 e-connection 和 c-connection。

3.1、e-connection:負責 tcp 層次上的連線工作

這兩個 connection 是有區別的,這是因為bt對等協議需要在兩個層次上建立連線。首先是 tcp 層次上的連線,也就是經過 tcp 的三次握手之後,建立連線,這個連線由 e-connection 來管理。在 encoder:: external_connection_made() 函式中可以看到,一旦有外部連線到來,則建立乙個 e-connection 類。

3.2、c-connection:管理對等協議層次上的連線。

在 tcp 連線之上,是 bt對等協議的連線,它需要經過bt對等協議的兩次「握手」,握手的細節大家去看bt對等協議。過程是這樣的:

為了便於述說,我們假設乙個bt客戶端為 a,另乙個客戶端為 x。

如 果是x主動向a發起連線,那麼在tcp連線建立之後,a立刻利用這個連線向x傳送bt對等協議的「握手」訊息。同樣,x在連線一旦建立之後,向 a傳送bt對等協議的「握手」訊息。a一旦接收到x的「握手」訊息,那麼它就認為「握手」成功,建立了bt對等協議層次上的連線。我把它叫做「對等連線 」。a 傳送了乙個訊息,同時接收了乙個訊息,所以這個握手過程是兩次「握手」。

同樣,對x 來說,因為連線是它主動發起的,所以它在傳送完「握手」訊息之後,就等待a的「握手」訊息,如果收到,那麼它也認為「對等連線」建立了。

一旦「對等連線」建立之後,雙方就可以通過這個連線傳遞訊息了。

也就是說,不管是x主動向a發起的連線,還是 a 主動向 x發起的連線,一旦建立之後,它們的效果是一樣的。這個同我們平時做 c/s結構的網路開發是有區別的。

我們可以看到在 e-connection的初始化函式中,會主動連線的另一方傳送「握手」訊息,在 e-connection::data_came_in() 中,會首先對對方的「握手」訊息進行處理。這正是我上面所描述的情形。

在 e-connection::read_peer_id() 中,是對「握手」訊息的最後一項 peer id進行處理,一旦正確無誤,那麼就認為「對等連線」完成,

self.encoder.connecter.connection_made(self)

在 connecter::connection_made() 函式中,就建立了管理「對等連線」的 c-connectinon類。所以,更高一層的「對等連線」是由 c-connection 來管理的。

類層次結構,我用縮進來表示一種包含關係。

先寫這些吧,有什麼我再補充進來。

BT客戶端原始碼分析之一 總述

概述 相對於 tracker 伺服器來說,bt客戶端要複雜的多,bram cohen 花了一年 full time 的時間來完成 bt,我估計其中大部分時間是用在 bt 客戶端的實現和除錯上了。由 於 bt 客戶端涉及的 比較多,我不能再象分析 tracker 伺服器那樣,走上來就深入到細節之中去,...

BT客戶端原始碼分析之八 BT對等連線的建立過程

客戶端主動發起連線 encrypter.py 上一節的最後,我們看到呼叫 encoder start connection 來向其它 peer 發起連線。所以,從這裡開始看起。客戶端被動接受外來連線 客戶端在與 tracker 通訊的時候,已經把自己的 ip 和監聽的 port 報告給了 track...

客戶端提交mr job原始碼流程分析

job job.getinstance獲得job物件 job.set 新增configuration等配置引數 job.waitforcomplete 原始碼內部實則呼叫submit 方法 之後jobsubmiter中有個成員cluster cluster中又有個成員proxy 物件,幫助提交到ya...