1 介紹
1.1 目的和范圍
eMule是一個基于eDonkey協議的流行文件共享應用程序。這份文檔描述eMule的網絡行為方式,以及為了更好理解這份協議的一些基本術語。同時,文檔也對eMule網絡協議做了全面的說明,其中還包含一個詳述消息格式的附言部分。這份文檔信息基于一個開源客戶端軟件eMule【2】。接下來的一些介紹是為讀者能更好的去閱讀和理解這份文檔的一些一般性的背景知識。關于eMule的更進一步的信息可以在【3】中找到。
1.2 概述
eMule網絡由幾百個eMule服務器和數百萬個eMule客戶端組成【1】。客戶為了得到網絡服務需要連接一個服務器;只要客戶端在系統中,服務器連接就一直保持打開狀態。服務器提供中心索引服務功能(象在Napster中一樣),不和別的服務器通信。
每個eMule客戶端在本地系統中預先配置好一個服務器列表和一個共享文件列表。一個客戶端使用單一TCP連接連接到eMule服務器來登入eMule網絡,去獲得文件和可連接的客戶端信息。eMule同時也使用數百個到別的客戶端的TCP連接去下載和上傳文件。每個eMule客戶端他的每個共享文件維護一個上載隊列。下載客戶加入隊列,進入隊列底部,逐步上移直到隊列的頂部開始下載文件。一個客戶可能從幾個不同的客戶端下載同一個文件,從每一個客戶端上面得到不同的片斷(fragments)。客戶也可能上載文件數據塊(chunks),即使這個文件還沒有下載完成。最后,eMule還擴展了eDonkey協議,允許客戶之間交換服務器、別的客戶和文件信息。這里值得注意的是,客戶跟服務器的通信是基于TCP的。
服務器啟用一個內部數據庫來保存客戶和文件信息。eMule服務器不保存任何文件,它扮演中心索引的角色,保存文件位置信息。服務器的一個額外橋接功能,同時也引來無數抗議的一個功能就是穿越防火墻,使得躲在防火墻后不能夠接受引入連接的客戶得到解放。橋接功能極大的增加了服務器的負擔。eMule啟用UDP加強客戶性能來應對服務器和別的客戶端的連接。客戶接收和發送UDP消息不是強制性的,如果防火墻阻止客戶發送和接收UDP消息,這不會妨礙正常運轉。
1.2.1 客戶到服務器的連接
在啟動的時候,客戶使用TCP連接到單個eMule服務器。服務器提供客戶一個客戶ID(1.3節),這個ID只是在客戶服務器連接生命期有效(這里有一點需要注意:如果客戶擁有一個High ID,那么只要他的IP地址不發生改變,客戶就會從所以的服務器上得到同一個ID)。緊接著連接的建立,客戶端會發送他的共享文件列表給服務器。服務器把這個列表信息保存他他的內部數據庫中,通常數據庫中存有數十萬個可獲得的文件和活動客戶信息。同時,eMule客戶端也發送他的下載列表,包含他希望去下載的文件。第2節會提供客戶和服務器TCP信息交換的詳細描述。
連接建立后,eMule服務器發送給客戶一個別的客戶的列表,列表中的客戶可以為當前客戶提供文件下載源(這些客戶理所當然就被稱為“sources”)。緊跟其后,客戶開始和別的客戶建立連接,1.2.2節對此有詳細描述。
值得注意的是:客戶服務器的TCP連接在整個客戶會話階段都保持開的狀態。初始握手之后,客戶服務器事件主要由用戶活動觸發:有時候,客戶發出文件查找請求,請求被查找結果作為答復;文件查找之后通常緊跟著一個特定文件源的查找,這個查詢以源列表(IP和port)作為答復,發出請求的客戶可以從源端下載特定文件。
客戶使用UDP和別的服務器(未建立TCP連接的服務器)通信。這種通信增強文件和源查找,保證客戶端服務器列表中所有的服務器是當前有效的。關于客戶服務器UDP連接的細節可以在第三章中找到。