eMule 協議中的一些基本概念
上篇部落格中介紹了ed2k協議的一些背景記憶eMule的整體架構,這裡主要說明幾個
基本概念以便於以後的分析,後面一篇部落格就會涉及具體的原始碼了。客戶端ID
客戶端是一個4位元組的識別符號,在跟伺服器連線握手的時候由伺服器提供的。客戶端ID僅在客戶端伺服器TCP連線的生命期內可用,雖然如果客戶端是高ID(High ID),它在任何伺服器分配的客戶端ID都一樣,除非IP變化了。客戶端ID分為低ID(low ID)和高ID。電騾伺服器通常會給不能接受連線的客戶端分配低ID。擁有低ID會限制客戶端在電騾網路中的使用,甚至會造成伺服器拒絕連線。高ID是由客戶端的IP地址為基礎算出的。這裡從電騾協議的觀點來看客戶端
· 當客戶端通過NAT或者代理伺服器上網。
· 當伺服器正在忙(造成伺服器的連線計數器超時,從而認為客戶端無法連線)。
高ID通過下面的方法計算:假設機器IP地址為X.Y.Z.W,客戶端ID應該為 X+28*Y+216*Z+224*W(big endian高位在前)。低ID
使用者ID
電騾支援聲望系統為了增加使用者的檔案共享。一個使用者上傳給其他客戶端越多東西,它就得到越多的聲望,這樣它在他們的等待佇列中前進就會越快。使用者ID是一個128位(16位元組)GUID,通過連線隨機數而產生,第6和第15位不是隨機生成的,他們分別是14和111。使用者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 的開原始碼,筆者在這裡把連結先給大家,可以先下載熟悉下程式碼結構,看下篇部落格時最好已經下了原始碼。