1??????
介紹
1.1
??????????????????????
目的和范圍
電騾是基于電驢協(xié)議的流行的文件共享程序。本報(bào)告描述電騾的網(wǎng)絡(luò)行為,并解釋需要理解協(xié)議的基本技術(shù)。本報(bào)告提供一個(gè)完整電騾網(wǎng)絡(luò)協(xié)議規(guī)范,包含一個(gè)附錄,其中提供信息格式。本文檔中的信息是基于開源的電騾客戶端。下面介紹的目介紹通用的背景,方便讀者理解本文檔,在
[3]
中可以找到其他的電騾信息源。
1.2
??????????????????????
概述
電騾網(wǎng)絡(luò)是由幾百個(gè)電騾服務(wù)器和上百萬的電騾客戶端
[1]
組成??蛻舳藨?yīng)該連接到服務(wù)器而獲得網(wǎng)絡(luò)服務(wù),只要客戶端在系統(tǒng)中,服務(wù)器連接一直打開。服務(wù)器執(zhí)行集中式的索引服務(wù)(和在
Napster
的一樣),它不會和其他服務(wù)器通訊。
每個(gè)電騾客戶端預(yù)配置一個(gè)服務(wù)器鏈表和本地文件系統(tǒng)中的共享文件列表??蛻舳说卿浀骄W(wǎng)絡(luò)是使用單一
TCP
連接到電騾服務(wù)器,從服務(wù)器得到所要的文件和在線的客戶端。同時(shí)電騾客戶端和其他客戶端之間有幾百個(gè)
TCP
連接來上傳和下載文件。每個(gè)電騾客戶端維護(hù)一個(gè)上載的共享隊(duì)列。正在下載的客戶端首先加入到隊(duì)列的底部,逐漸的向前,直到到達(dá)隊(duì)列的定部才開始下載該文件??蛻舳丝梢詮膸讉€(gè)其他的電騾客戶端下載同一個(gè)文件,從每個(gè)客戶端取不同的分片??蛻舳艘部梢陨蟼鳑]有完全下載的文件塊;最后,電騾擴(kuò)展了電驢的能力,允許客戶端交換服務(wù)器、其他客戶端和文件的信息。注意客戶和服務(wù)器通訊都是基于
TCP
的。
服務(wù)器使用一個(gè)內(nèi)部數(shù)據(jù)庫,數(shù)據(jù)庫中存儲客戶端和文件的信息。一個(gè)電騾服務(wù)器并不存儲任何文件,它僅僅扮演文件位置信息的集中索引;另一個(gè)功能是作為穿過防火墻的客戶端連接以及不能接受輸入連接的客戶端之間橋梁。橋梁的功能明顯增加了服務(wù)器的負(fù)載。電騾使用
UDP
來增強(qiáng)客戶端不依賴服務(wù)器和客戶端的能力??蛻舳税l(fā)送和接收
UDP
消息的行為對于客戶端日常操作來說不是強(qiáng)制的,并且在防火墻阻止其放松和接受
UDP
消息時(shí)有點(diǎn)問題。
1.2.1
??????????????????????????????????????????
客戶端到服務(wù)器的連接
客戶端啟動的時(shí)候使用
TCP
連接到某個(gè)電騾服務(wù)器,服務(wù)器提供一個(gè)客戶端
ID
給該客戶端(
1.3
節(jié)),這個(gè)
ID
僅僅在客戶端和服務(wù)器連接的生命周期內(nèi)有效(注意,在客戶端有高
ID
是,直到他
IP
地址改變的時(shí)候,它才會從所有的服務(wù)器受到相同的
ID
)。在客戶端連接建立之后其發(fā)送共享的文件給服務(wù)器,服務(wù)器存儲這些信息到內(nèi)部數(shù)據(jù)庫中,數(shù)據(jù)庫中通常包含幾萬個(gè)可用文件或活動的客戶端。電騾的客戶端也將其他想下載的文件列表發(fā)送給服務(wù)器。第
2
節(jié)提供詳細(xì)的電騾客戶端和服務(wù)器之間
TCP
報(bào)文交互的描述。
在連接建立之后,電騾服務(wù)器將包含當(dāng)前客戶端需要下載的文件信息的其他客戶端擁有的文件發(fā)送給當(dāng)前客戶端(這些客戶端叫做源);從這時(shí)開始,電騾客戶端將和其他客戶端之間建立連接,
1.2.2
介紹。
注意,
TCP
連接的
C/S
在所有客戶端會話過程中事情打開,在大部分由用戶活動觸發(fā)的起初握手事務(wù)之后,有時(shí)客戶端發(fā)送文件查詢請求,其以搜索結(jié)果響應(yīng),一個(gè)搜索事務(wù)后面通常是一個(gè)到源指定文件的查詢,這個(gè)查詢通常返回源(
IP
地址和端口)的列表,請求者可以從他們那里下載請求的文件。
UDP
用來和當(dāng)前客戶端連接的服務(wù)器之外的服務(wù)器通訊。
UDP
報(bào)文的目的是增強(qiáng)文件查找、源搜索增強(qiáng)和保活(保證電騾服務(wù)器列表中的所有服務(wù)器是有效的)。更多的客戶端和服務(wù)器之間的報(bào)文交互在第
3
章介紹。
1.2.2
??????????????????????????????????????????
客戶端到客戶端的連接
電騾的客戶端連接其他客戶端的目的是下載文件;一個(gè)文件被分割成小塊??蛻舳丝梢詮膸讉€(gè)不同的客戶端下載同一個(gè)文件,當(dāng)然從每一個(gè)得到的分片是不一樣的。
兩個(gè)客戶端連接好之后,他們交換性能信息,并且協(xié)商一個(gè)下載(上傳)開始。每個(gè)客戶端都有一個(gè)下載隊(duì)列,這里面保存了正在等待下載文件的客戶端列表。當(dāng)電騾客戶端的下載隊(duì)列是空的時(shí)候,一個(gè)下載請求可能立即導(dǎo)致一個(gè)下載的開始(除非,例如,請求者是被禁止的)。當(dāng)下載隊(duì)列不是空的,一個(gè)下載請求的結(jié)果是在客戶端請求隊(duì)列中添加一個(gè)新的記錄;沒有嘗試過在一個(gè)給定時(shí)間內(nèi)為每個(gè)客戶端提供最小
2.4KB/s
的最小帶寬而同時(shí)服務(wù)多個(gè)客戶端。一個(gè)下載客戶端可能被在等待隊(duì)列先于他前面的客戶端占先,在下載會話開始的
15
分鐘內(nèi),電騾客戶端下載隊(duì)列排行被增加來阻止擊潰(
thrashing
)。
當(dāng)下載客戶端到達(dá)下載隊(duì)列的開始的時(shí)候,上傳客戶端初始化一個(gè)連接來將其需要的文件片發(fā)送給它。電騾客戶端可能正在幾個(gè)其他客戶端的等待隊(duì)列中并注冊了下載同一個(gè)文件片。當(dāng)從他們中的一個(gè)下載了一個(gè)完整的部分時(shí),它不會通知剩下的客戶端來讓他們將自己刪除,它只是將當(dāng)它自己到達(dá)他們等待隊(duì)列頭的時(shí)候他們發(fā)送來的連接拒絕掉。
電騾客戶端使用信用系統(tǒng)(見
1.4
節(jié)),目的是鼓勵上傳、并阻止外掛(假裝電騾),電騾使用
RAS
公鑰加密來保護(hù)信用系統(tǒng)的安全。
客戶端連接可能使用一些電驢協(xié)議中沒有定義的報(bào)文,這些報(bào)文叫做擴(kuò)展協(xié)議。擴(kuò)展協(xié)議用來實(shí)現(xiàn)信用系統(tǒng)、通常的信息交互(例如,更新服務(wù)器和源的列表)并且提高發(fā)送和接收壓縮的文件分片的性能。
電騾客戶端連接使用
UDP
僅僅在有限情況下,周期性的檢查上傳隊(duì)列中對端客戶端的狀態(tài),這些客戶端正在等待下載文件。
1.3
??????????????????????
客戶端
ID
客戶端
ID
是在客戶端和服務(wù)器之間建立連接握手的時(shí)候右服務(wù)器分配的
4
個(gè)字節(jié)標(biāo)示。一個(gè)客戶端
ID
在該服務(wù)器和客戶端
TCP
連接的生命周期內(nèi)有效,雖然萬一客戶端有一個(gè)高
ID
直到
IP
地址改變的時(shí)候被所有服務(wù)器分配同一個(gè)
ID
??蛻舳?/span>
ID
分成低
ID
和高
ID
。電騾服務(wù)器給那些不能接收輸入連接的客戶端通常分配一個(gè)低
ID
;由于低
ID
限制了客戶端使用電騾網(wǎng)絡(luò),并且可能導(dǎo)致服務(wù)器拒絕客戶端的連接。一個(gè)高
ID
是計(jì)算出來了的,基于客戶端的
IP
地址按照下面的方式。本節(jié)從電騾協(xié)議的觀點(diǎn)來描述客戶端
ID
分配和意義
[3]
。一個(gè)高
ID
分配給一個(gè)客戶端,其允許客戶端自由的連接電騾他們主機(jī)
TCP
端口(默認(rèn)的是
4662
)。高
ID
的客戶端使用電騾網(wǎng)絡(luò)是沒有限制的。當(dāng)服務(wù)器不能打開到電騾客戶端端口的
TCP
連接時(shí),客戶端將得到一個(gè)低
ID
。這通常是該客戶端安裝了一個(gè)防火墻其拒絕了輸入連接。一個(gè)客戶端在下面情況下可能也會被分配一個(gè)低的
ID
:
1.?
當(dāng)客戶端通過
NAT
和代理服務(wù)器連接的時(shí)候
2.?
當(dāng)服務(wù)器忙的時(shí)候(導(dǎo)致服務(wù)器的重連接定時(shí)器溢出)。
高
ID
是按照下面的方式來計(jì)算的:假定主機(jī)
IP
是
X.Y.Z.W
,
ID
將是
X+2
8
*Y+2
16
*Z+2
24
*W(
大序表示方式
)
。低
ID
始終小于
16777216(0X1000000)
,我沒有找到他是如何計(jì)算的線索,注意當(dāng)你有一個(gè)低
ID
的時(shí)候,不同
SERVER
是不同的。
低
ID
的客戶端沒有公網(wǎng)
IP
地址,其他的客戶端不能直接連接,因此所有的通訊必須通過電騾服務(wù)器;這增加了服務(wù)器計(jì)算負(fù)荷,導(dǎo)致服務(wù)器不愿意接受低
ID
的客戶端。另外,這表明低
ID
的客戶端不能連接到另外一個(gè)低
ID
的客戶端(如果該客戶端不是在同一個(gè)服務(wù)器上),因?yàn)殡婒叢恢С挚绶?wù)器的通道。
為了支持低
ID
客戶端,引進(jìn)一種回調(diào)機(jī)制,使用這種機(jī)制,高
ID
的客戶端可以邀請(通過電騾服務(wù)器)低
ID
的客戶端連接到它來交換文件。
1.4
??????????????????????
用戶
ID
電騾支持信用系統(tǒng)目的是鼓勵用戶共享文件。用戶上傳的文件越多,信譽(yù)值就或高,它在等待隊(duì)列中前進(jìn)的速度就越快。
用戶
ID
是一個(gè)
128
位(
16
字節(jié))
GUID
,由串聯(lián)的隨機(jī)數(shù)組成,第
6
和
15
字節(jié)不是隨即產(chǎn)生的,他們的值是
14
和
111
??蛻舳?/span>
ID
僅僅在客戶端和指定服務(wù)器會話的過程中是有效的,而用戶
ID
(也叫做用戶
hash
)是唯一的且用來表示會話中的客戶端(用戶
ID
表示工作站)。用戶
ID
在信譽(yù)系統(tǒng)中扮演重要的角色,這給黑客們假裝其他用戶來得到他們權(quán)限提供了動機(jī)。電騾支持一種加密模式,其設(shè)計(jì)為防止欺騙和假裝用戶。這個(gè)實(shí)現(xiàn)是一個(gè)簡單挑戰(zhàn)響應(yīng),依賴于
RSA
公鑰
/
私鑰加密。
1.5
??????????????????????
文件
ID
文件
ID
用來唯一的標(biāo)示網(wǎng)絡(luò)上的文件以及文件損壞檢查和恢復(fù)。注意,電騾并不依賴于文件名稱,目的是唯一標(biāo)示和索引。一個(gè)文件通過全局唯一的
ID
來標(biāo)示,通過哈希文件的內(nèi)容來計(jì)算。有兩種文件
ID
:第一種主要用來產(chǎn)生唯一文件
ID
,第二中用于損壞檢查和恢復(fù)
[3]
。
1.5.1
??????????????????????????????????????????
文件哈希
文件通過
128
位
GUID
哈希來唯一標(biāo)示,通過客戶端和基于文件的內(nèi)容來計(jì)算。
GUID
使用
MD4
算法
[4]
來基于文件的數(shù)據(jù)計(jì)算。當(dāng)計(jì)算文件
ID
時(shí),文件被分成
9.28MB
長的段。一個(gè)
GUID
是為每個(gè)單獨(dú)的段來計(jì)算的,然后將所有的哈希合并到一起形成一個(gè)唯一的文件
ID
。當(dāng)一個(gè)下載客戶端完全下載一個(gè)文件的所有部分時(shí),他計(jì)算部分的哈希并和對端發(fā)送的哈希部分比較,如果發(fā)現(xiàn)那部分損壞,客戶端嘗試從損壞的部分漸進(jìn)替換位(
180kb
每次)然后直到哈希計(jì)算是正確的為止。
1.5.2
??????????????????????????????????????????
根哈希
根哈希使用
SHA1
算法來為每個(gè)部分計(jì)算,基于
180kb
的塊大小。這提供較高級別的可靠性和錯誤恢復(fù)。官方的電騾網(wǎng)站有更詳細(xì)的信息。
1.6
??????????????????????
電騾協(xié)議擴(kuò)展
盡管電騾完全兼容電驢,它還另外實(shí)現(xiàn)幾個(gè)擴(kuò)展,這允許電騾客戶端為他們的用戶提供更好的功能。擴(kuò)展關(guān)注于客戶端和客戶之間的通訊,特別是安全和
UDP
的實(shí)現(xiàn)。本文的所有消息流程圖中擴(kuò)展部分都是灰色的。
1.7
??????????????????????
軟硬限制
服務(wù)器配置包括良種限制基于活動的用戶數(shù)
-
軟和硬。硬限制大于等于軟限制。當(dāng)活動用戶數(shù)量達(dá)到軟限制時(shí),服務(wù)器停止接受新的低
ID
客戶端連接,當(dāng)用戶數(shù)達(dá)到硬限制時(shí),服務(wù)器是滿負(fù)荷的,不能接受任何客戶端連接了。