1. 程式人生 > >eMule 協議中的一些基本概念

eMule 協議中的一些基本概念

上篇部落格中介紹了ed2k協議的一些背景記憶eMule的整體架構,這裡主要說明幾個

基本概念以便於以後的分析,後面一篇部落格就會涉及具體的原始碼了。

客戶端ID

客戶端是一個4位元組的識別符號,在跟伺服器連線握手的時候由伺服器提供的。客戶端ID僅在客戶端伺服器TCP連線的生命期內可用,雖然如果客戶端是高IDHigh ID),它在任何伺服器分配的客戶端ID都一樣,除非IP變化了。客戶端ID分為低IDlow ID)和高ID。電騾伺服器通常會給不能接受連線的客戶端分配低ID。擁有低ID會限制客戶端在電騾網路中的使用,甚至會造成伺服器拒絕連線。高ID是由客戶端的IP地址為基礎算出的。這裡從電騾協議的觀點來看客戶端

ID的分配和表示。得到高ID的客戶端允許其他的客戶端自由地連線他的電騾TCP埠(預設為4662)。得到高ID的客戶端在電騾網路內不受任何限制。當伺服器不能開啟一個連往客戶端的電騾埠的連線時,伺服器給客戶端一個低ID。這主要是客戶端安裝了防火牆組織外來連線造成的。以下情況下,客戶端會得到低ID

·        當客戶端通過NAT或者代理伺服器上網。

·        當伺服器正在忙(造成伺服器的連線計數器超時,從而認為客戶端無法連線)。

ID通過下面的方法計算:假設機器IP地址為X.Y.Z.W,客戶端ID應該為 X+28*Y+216*Z+224*Wbig endian高位在前)。低ID

總是小於15777216(0x1000000)我不知道它是怎麼計算的(協議原文如此,看來低ID的演算法並不重要,只要滿足條件即可。),注意從不同的伺服器得到的低ID是不一樣的。ID的客戶端沒有公開的IP地址供其他的客戶端連線,所以所有的通訊必須通過電騾伺服器。這會造成伺服器的負載提升,所以伺服器不願意接受低ID的客戶端。同樣,這說明低ID的客戶端不能跟其他伺服器上面的低ID客戶端連線,因為電騾不支援伺服器間的橋接。為了支援低ID客戶端電騾協議引入了回撥機制。使用這種機制,一個高ID客戶段可以要求(通過伺服器)低ID客戶端連線它來交換檔案。現在大部分伺服器不會拒絕低ID的客戶端連線,因為他們基本上都不幫助客戶端傳輸檔案了。由此,低
ID的客戶端之間也無法傳輸了。

使用者ID

電騾支援聲望系統為了增加使用者的檔案共享。一個使用者上傳給其他客戶端越多東西,它就得到越多的聲望,這樣它在他們的等待佇列中前進就會越快。使用者ID是一個128位(16位元組)GUID,通過連線隨機數而產生,第6和第15位不是隨機生成的,他們分別是14111。使用者ID僅在客戶端和伺服器會話中有效,使用者ID是唯一的用來標識客戶端。使用者ID在聲望系統裡面起了很大的作用,攻擊者冒充其他使用者就是為了得到它們聲望對應的權利。電騾提供了加密方案用來使用者欺詐。實現方式是用RSA方法來加密方法來加密資訊交換。

檔案ID

檔案ID用於網路中檔案的唯一標識,以及檔案損壞的檢測和修復。注意電騾對檔案進行唯一標識和編目不依賴於檔名,檔案由其內容雜湊計算出來的全域性唯一ID來標識。檔案ID有兩種,一種用來生成唯一標識,一種用於檔案損壞的檢測和修復。

檔案雜湊

檔案是用一個128位的GUID來標識的,這個GUID是由客戶端用檔案內容雜湊計算出來的。GUID使用MD4演算法計算。計算檔案ID的時候檔案被分成 9.28MB的大小。一個GUID是分別計算每個檔案塊的雜湊,然後把它們合成為一個唯一檔案ID。下載客戶端完成檔案塊的下載後,會計算塊的雜湊和檔案上傳端傳送來的檔案塊雜湊做比較,如果不同,就說明檔案塊損壞了,客戶端將逐塊的覆蓋(一次180kb)知道雜湊計算表明檔案塊已經修復為止。

根雜湊

根雜湊是每個檔案塊用SHA1演算法計算出來的,每個計算單元尺寸為180kb。它提供了更高級別的可靠性和錯誤恢復。

電騾協議拓展

雖然電騾(eMule)完全相容電驢(eDonkey),但是它還是實現了一些擴充套件,用於增強它的功能。擴充套件關注於客戶端和客戶端之間的通訊,特別是安全領域和UDP工具。

軟體和硬體限制

伺服器設定包括兩種對活躍使用者數目的限制,軟體的和硬體的。硬體限制大於等於軟體限制。當活躍使用者數目到達了軟體限制,伺服器停止接受新的低ID客戶端連線,當用戶數目達到了硬體限制,伺服器不會接受任何連線。

這是eMule 的開原始碼,筆者在這裡把連結先給大家,可以先下載熟悉下程式碼結構,看下篇部落格時最好已經下了原始碼。