EMule

eMule là một chương trình chia sẻ tệp đồng đẳng hoạt động trên mạng eDonkey và mạng Kad. eMule được phát triển trên nền Windows, và mã nguồn được lấy làm nền tảng cho các chương trình tương tự là xMule (chạy trên nền Linux) cùng với người anh em đa nền aMule.
Các tính năng nổi bật của eMule bao gồm trao đổi tệp trực tiếp giữa các máy trạm, khả năng phục hồi nhanh các nội dung tải về bị hư hỏng, và hệ thống điểm để khuyến khích tải lên. Ngoài ra, eMule sử dụng giải thuật nén Zlib cho nội dung vận chuyển nhằm tiết kiệm băng thông. Một tính năng thú vị khác của eMule hay bất kì chương trình eDonkey client là cho phép sử dụng các địa chỉ dạng 'ed2k' để tải về tệp tương ứng (tương tự như khi tải một tệp sử dụng giao thức http). Các địa chỉ này giúp người dùng tránh nguy cơ tải về một tệp giả mạo nhờ vào việc kiểm tra giá trị băm ("hash") của tệp. Các địa chỉ này được gọi là "đáng tin cậy". eMule kiểm tra tệp tải về hoàn thành có đúng với bản gốc hay không bằng cách sử dụng giải thuật MD4.
eMule được viết bằng ngôn ngữ Visual C++ trên nền .NET của Microsoft. Do eMule là một trong những chương trình mã nguồn mở rất phổ biến trên Internet nên nó có rất nhiều bản sửa đổi không chính thức.
Lịch sử.
Dự án eMule được khởi đầu vào ngày 13 tháng 5 năm 2002 bởi lập trình viên Hendrik Breitkreuz (còn được biết đến là Merkur). Merkur cảm thấy không thỏa mãn khi sử dụng chương trình client gốc của eDonkey2000 nên đã quyết định viết một chương trình tốt hơn. Trong thời gian phát triển eMule, dự án nhận thêm sự tham gia của 7 lập trình viên khác. Mã nguồn đầu tiên phiên bản 0.02 được công bố trên SourceForge vào ngày 6 tháng 7 năm 2002. Sau đó ngày 4 tháng 8 năm 2002, bản cài đặt được đầu tiên của eMule phiên bản 0.05a được phát hành. 'Hệ thống tính điểm' lần đầu tiên xuất hiện ở phiên bản 0.19a vào ngày 14 tháng 9 năm 2002. Trang web chính thức của dự án eMule bắt đầu hoạt động vào ngày 8 tháng 12 năm 2003. Từ ngày xuất hiện trên SourceForge đến nay, eMule đã được tải về hơn 199 triệu lần (tính đến ngày 31 tháng 5 năm 2006) và luôn dẫn đầu trong bảng xếp hạng phần mềm mã nguồn mở được tải về nhiều nhất trên Internet (đứng thứ 2 là Azureus, một chương trình BitTorrent client).
Hiện nay dự án eMule vẫn được tiếp tục được hoàn thiện bởi 16 thành viên: 2 người phát triển, 2 quản lý dự án (bao gồm Merkur), 3 người kiểm tra và 9 người dò lỗi. Trang web chính thức do 7 người phát triển và 4 người quyền quản trị để duy trì trang web hoạt động tốt.
Các sự kiện gần đây.
Từ phiên bản 0.40a, eMule bắt đầu hỗ trợ mạng Kad. Mạng này sử dụng giao thức Kademlia, một giao thức chia sẻ phân tán và không cần máy chủ trung tâm như mạng eDonkey truyền thống.
Một tính năng được thêm vào trong các phiên bản gần đây là hỗ trợ tìm kiếm Unicode (cho phép tìm kiếm các tệp có tên không phải là ký tự la tinh) và khả năng tìm kiếm trên các máy chủ những tệp hoàn chỉnh cho tệp tải về đang thiếu (tính năng này không hỗ trợ trên mạng Kad).
Các phiên bản mới còn có thêm tính năng "Danh sách đen" liệt kê các địa chỉ IP kết nối không thành công. Một IP khi bị vào danh sách này sẽ được xem như là IP chết và bị cấm kết nối trong một khoảng thời gian ngắn, từ 15 – 45 phút. Tuy nhiên, tính năng này gây tranh cãi trong cộng đồng người dùng vì nhiều người cho rằng nó dẫn đến tình trạng thiếu nguồn tải về và do đó làm chậm tốc độ tải. Ví dụ, một nguồn có thể rơi vào tình trạng ngoại tuyến chỉ trong vài phút (do lỗi mạng hay khởi động lại hệ thống) nhưng vẫn bị cấm đến 45 phút.
Một vài tính năng thêm vào khác bao gồm khả năng chạy eMule từ một tài khoản hạn chế quyền nhằm tăng độ an toàn cho hệ thống, khả năng xử lý lỗi thông minh (ví dụ trường hợp tải tệp có kích thước 9,28Mb, nếu có một đoạn của tệp bị lỗi trong quá trình truyền thì chương trình eMule không cần tải về lại toàn bộ tệp, mà nó chỉ cần tải về đoạn tệp bị lỗi sau đó nó tự lắp ghép để hoành chỉnh tệp như bản gốc)
eMule hiện nay đã được xem như một sản phẩm khá ổn định do đó khoảng cách giữa 2 phiên bản được giãn rộng ra, thường vào khoảng 2 đến 3 tháng. Phiên bản mới nhất là v0.50a được phát hành vào ngày 7 tháng 4 năm 2010.
eMule khuyến cáo nên thay đổi thiết lập mặc định giá trị cổng (ví dụ nên sử dụng cổng có giá trị là 20000 thay vì 4662), vì hiện nay rất nhiều ISP làm nghẹt cổng mặc định của giao thức P2P làm tốc độ tải tệp của chương trình rất thấp.
Trang web chính thức và trang web giả mạo.
Địa chỉ trang web chính thức của eMule tại http://www.emule-project.net. Bạn có thể tải về phiên bản mới nhất của eMule tại đây. Các phiên bản cũ hơn được lưu tại trang http://sourceforge.net/projects/emule.
Các trang web có tên miền tương tự thường đề nghị bạn trả một khoản phí để đăng nhập hoặc để tải về phiên bản mới nhất là trang web giả mạo, ví dụ trang: 
Khái niệm cơ bản.
Nhận dạng tệp.
Tất cả các tệp đều có giá trị băm để kiểm tra xem tệp tải về có đúng như bản gốc không. Giá trị băm này phụ thuộc vào nội dung của tệp, nó không phải là tên tệp. Điều này cho phép mọi người đều có thể tìm kiếm tệp mình cần mà không cần biết tện tệp mình cần tìm có tên là gì.
Tệp được chia thành các khối có kích thước 9,28 Mb (khối cuối cùng của tệp có thể nhỏ hơn 9,28 Mb). Giá trị băm của tệp được tính toán như sau: đầu tiên tính toán giá trị kiểm tra theo thuật giải MD4 của mỗi khối, sau đó kết nối giá trị kiểm tra MD4 của tất cả các khối thành một chuỗi, tính toán giá trị kiểm tra MD4 của chuỗi này sẽ ra giá trị băm của tệp.
Định danh các máy đồng đẳng.
Tương tự như giá trị băm của tệp, mỗi máy đồng đẳng trong mạng cũng có một định danh duy nhất. Giá trị định danh của các máy đồng đẳng được giữ bí mật tuyệt đối bằng giải thuật bắt tay khóa công khai / khóa riêng, tránh trường hợp các định danh của các máy đồng đẳng bị sử dụng sai mục đích.
Tải tệp.
Sau khi xác định nguồn của tệp cần tải (có một hoặc nhiều máy đồng đẳng trong mạng đang chia sẻ tệp này), chương trình eMule sẽ liên hệ với các máy đồng đẳng này để yêu cầu cho nó tải tệp. Mỗi chương trình eMule đều duy trì một danh sách 'hàng đợi tải về', bao gồm tất cả các máy đồng đẳng khác đang có yêu cầu tệp. Khi một máy đồng đẳng trong danh sách hàng đợi tải về đến lượt, chương trình eMule ở hai máy liên hệ với nhau và bắt đầu trao đổi tệp. Chương trình eMule có tính thông minh để luôn luôn yêu cầu các khối của tệp hiếm nhất, ít máy đồng đẳng cung cấp nhất để tránh hiện tượng nút cổ chai. Nếu máy đồng đẳng đã có đủ hầu hết các khối hiếm thì nó vẫn yêu cầu các khối còn lại, chương trình eMule chỉ cho phép chia sẻ các khối của tệp đã hoàn chỉnh.
Nén dữ liệu.
Trước khi dữ liệu được gửi đi, eMule nén dữ liệu này lại bằng giải thuật zlib với tỉ lệ nén chặt nhất để giảm băng thông mạng. Sau khi đã nén xong eMule chọn gói dữ liệu theo thứ tự từ nhỏ đến lớn để bắt đầu truyền đi.
Classic server dựa trên ed2k.
Kết nối vào mạng.
Mấu chốt của mạng Edonkey là máy chủ eD2k. Mỗi máy đồng đẳng đều phải kết nối vào máy chủ để vào mạng chia sẻ. Khi máy đồng đẳng đã kết nối vào máy chủ, máy chủ sẽ kiểm tra xem các máy đồng đẳng khác có kết nối tự do vào máy của bạn không. Nếu có, máy chủ sẽ đặt cho máy bạn một định danh có giá trị cao, bằng không giá trị định danh sẽ có giá trị thấp. Sau khi đã gán giá trị định danh cho máy bạn, eMule sẽ gửi tất cả các tệp bạn chia sẻ cho máy chủ. Máy chủ sẽ thêm tên tệp và giá trị băm của từng tệp vào cơ sở dữ liệu của nó.
Tìm tệp.
Khi đã kết nối vào mạng EDonkey, máy đồng đẳng có thể tìm kiếm từ khóa có trong tên tệp. Cuộc tìm kiếm có thể là cục bộ hoặc toàn cục. Nếu là tìm kiếm cục bộ (chỉ tìm tại máy chủ bạn kết nối tới) thì thời gian tìm kiếm sẽ nhanh hơn nhưng có ít kết quả. Nếu là tìm kiếm toàn cục (tìm kiếm tất cả các máy chủ có trong mạng) thì thời gian tìm kiếm sẽ lâu hơn nhưng có nhiều kết quả tìm kiếm hơn. Mỗi máy chủ khi nhận được yêu cầu tìm kiếm, nó sẽ tìm kiếm từ khóa trong cơ sở dữ liệu của nó và trả lại tên tệp (cùng giá trị băm) tương ứng với từ khóa.
Chú ý: máy chủ giả mạo trong mạng sẽ không đưa ra kết quả cho bất kỳ yêu cầu tìm kiếm nào.
Tìm kiếm nguồn gốc của tệp.
Có thể tìm tệp tải về bằng chức năng tìm kiếm của eMule hoặc rất nhiều trang web cung cấp liên kết dạng eD2k. Khi bắt đầu có yêu cầu tải tệp xác định, đầu tiên eMule truy vấn máy chủ cục bộ và tất cả các máy chủ khác trong mạng để xác định nguồn gốc của tệp. Máy chủ sẽ tìm kiếm giá trị băm của tệp trong cơ sở dữ liệu của nó và trả về kết quả tìm được cho máy có yêu cầu. Kết quả sẽ là một máy đồng đẳng khác trong mạng đang có ít nhất một khối hoàn chỉnh (9,28Mb) của tệp, giá trị băm của tệp này tương ưng với giá trị băm có lưu trong cơ sở dữ liệu của máy chủ
Mạng phân tán Kad.
Kết nối vào mạng.
Điều duy nhất cần để kết nối vào mạng là "cung mồi", lưu trữ thông tin về địa chỉ IP và cổng của chương trình một máy khách eMule đang kết nối trong mạng Kad. Thông thường, một máy muốn kết nối vào mạng Kad tìm cung mồi thông qua một máy chủ ed2k. Một khi đã được kết nối vào mạng Kad, máy khách sẽ yêu cầu các máy khác trong mạng kiểm tra khả năng kết nối của nó. Có 2 khả năng xảy ra. Thứ nhất, nếu máy khách có thể được kết nối tự do từ bất kì máy nào trong mạng, nó sẽ được cung cấp một ID và được gán trạng thái mở. Trong trường hợp ngược lại, máy khách sẽ được gán trạng thái bị chặn bởi tường lửa. Kể từ phiên bản 0.44a, mạng Kad hỗ trợ khả năng Buddy để giúp các máy khách bị tường lửa. Một "buddy" là một máy khách trong mạng có trạng thái mở (và do đó có thể kết nối tự do với bất kì máy nào). Máy buddy này đóng vai trò như một cầu nối chuyển tiếp giữa máy bị chặn bởi tường lửa và một máy khách khác trong mạng Kad. Tính năng này giúp cho 2 máy bị tường lửa có thể kết nối và chia sẻ với nhau.
Tìm kiếm trên Kad.
Trên mạng Kad tất cả các dạng tìm kiếm đều hoạt động theo một phương thức và được tổng quát hóa thành một hàm tìm kiếm "lookup(giá trị cần tìm kiếm)". Giá trị cần tìm kiếm là một giá trị băm, đại diện cho một máy khách, một tên tệp, một nguồn tải về... Do Kad là một mạng phân tán, tất cả hoạt động đều thực hiện thông qua các máy khách vì không tồn tại bất kì máy chủ nào. Về phương thức hoạt động, có thể xem như mỗi máy khách là một máy chủ con, chịu trách nhiệm cho một số nội dung và từ khóa nhất định. Khi nhận được một yêu cầu tìm kiếm từ một máy khách khác, nó kiểm tra xem từ khóa tìm kiếm có phải do mình quản lý hay không. Trong trường hợp từ khóa do máy khách quản lý, nó sẽ gởi về kết quả tìm kiếm dưới dạng địa chỉ nguồn tải về tương ứng với từ khóa. Nếu không phải, nó sẽ sử dụng một thuật toán để xác định một (hay một số) máy khách có khoảng cách đến từ khóa gần hơn khoảng cách từ bản thân nó đến từ khóa. Sau khi xác định nó sẽ chuyển yêu cầu đến máy khách đó. Thuật toán này khá phức tạp nhưng hiệu quả, bảo đảm sau "log(2^n)" bước chuyển ("n" là tổng số máy khách trong mạng Kad) sẽ tìm ra máy chịu trách nhiệm cho từ khóa. Độ phức tạp này chính là tính chất cốt yếu của tất cả các mạng DHT (Distributed Hashing Table), trong đó bao gồm Kad.
Các luật cơ bản cho người dùng eMule.
eMule và tất cả các chương trình chia sẻ tệp của mạng eDonkey đều hỗ trợ chia sẻ theo hai cách cơ bản sau:
1) Mọi người bắt buộc phải chia sẻ tệp: Tệp được chia sẻ có kích thước lớn hơn 9500 Kb sẽ chia thành các khối (trunk), vì vậy người nhận sẽ bắt đầu chia sẻ khối đã tải xong ngay cả khi cả tệp chưa tải xong. Người nhận bắt buộc phải chia sẻ theo cách này cho đến khi tệp được tải hoàn chỉnh.
2) Mọi người bắt buộc phải chia sẻ băng thông để tăng luồng dữ liệu của mạng: phiên bản chính thức của eMule bắt buộc người dùng thiết lập tốc độ tải về tối đa không được lớn hơn 4 lần tốc độ tải lên tối đa. Giới hạn này không áp đặt nếu tốc độ tải lên tối đa được đặt từ 10KB/s trở lên.
Mặc dù có rất nhiều bản chỉnh sửa của eMule, nhưng thật khó để tìm ra một bản chỉnh sửa mà không tuân theo luật 2. Thêm nữa nếu người dùng cố gắng phá vỡ luật này bằng cách giới hạn tốc độ tải lên có thể sẽ làm chậm tốc độ tải về do có thứ hạng xấu đối với người cung cấp tệp (tính toán thông qua hệ thống điểm của eMule). Và rất nhiều máy đồng đẳng gian lận thường bị cấm không cho kết nối vào mạng bởi các công cụ bổ sung do các bản chính sửa thêm (tính năng cấm máy kết nối không hỗ trợ trong phiên bản eMule chính thức).
eMule có tính năng giới hạn tốc độ tải về và tải lên để không vượt quá ngưỡng đặt bởi người dùng.
Các phiên bản eMule cũ hơn bản 0.47a không thể chia sẻ tệp lớn hơn 4.189.500 Kb (441 khối). Đây là một giới hạn kế thừa từ giao thức ed2k. Từ phiên bản 0.47a giới hạn kích thước của tệp là 256 GB.
Tổng kết.
Cả hai mạng eDonkey và Kad tuy có khác nhau về nguyên lý hoạt động nhưng đều nhằm vào một mục đích tìm kiếm tệp và nguồn cho tệp. Mục đích chính của mạng Kad là loại bỏ sự phụ thuộc của mạng vào máy chủ trung tâm và tăng khả năng mở rộng mạng (nhờ vào độ phức tạp logarithmic của thuật toán tìm kiếm). Ngược lại, trong eDonkey hay các mạng tương tự, tất cả tìm kiếm đều phải thông qua máy chủ trung tâm. Do đó khi mạng mở rộng, số lượng tìm kiếm đến máy chủ sẽ trở nên rất lớn và đến một lúc sẽ vượt quá giới hạn tính toán của máy chủ khiến cho hiệu suất mạng bị suy giảm nặng nề (hãy tưởng tượng một yêu cầu tìm kiếm cần vài phút để nhận được kết quả!). Hơn nữa, nếu máy chủ trung tâm có vấn đề thì cả mạng sẽ đổ vỡ. Vấn đề này thực sự nghiêm trọng kể từ vài năm trở lại đây, không phải từ giới hạn kĩ thuật mà là từ các rắc rối về pháp lý. Gần đây nhất là sự kiện máy chủ nổi tiếng Razorback bị đóng cửa do sức ép từ các nhà điều tra vi phạm bản quyền Mỹ. Do đó trong tương lai gần các hoạt động chia sẻ đồng đẳng sẽ có khuynh hương phân tán hóa, và các mạng như Kad sẽ trở nên phổ thông với mọi người dùng.
Các bản sửa đổi của eMule.
Như các chương trình mã nguồn mở phổ biến khác, eMule có rất nhiều biến thể, gọi là mods (các bản sửa đổi). Một vài bản còn làm phân nhánh mã của eMule, và phát triển độc lập với phiên bản chính thức, như eMule Plus. eMule Plus không có giao thức Kademlia. Các phiên bản không chính thức khác theo sau phát hành của eMule, và phân phối phiên bản chỉnh sửa của họ dựa trên những cải tiến của eMule trong phiên bản mới. Gần đây Neomule đang thử nghiệm tính năng mã hóa để chống ISP làm nghẹt đường truyền. Đó có thể là một tin tốt cho người dùng không muốn thay đổi nhà cung cấp dịch vụ Internet, nhưng có thể dẫn tới sự giới hạn băng thông nghiêm nghặt hơn của ISP.
Liên kết đến các bản sửa đổi.
Một vài liên kết đến bản sửa đổi eMule phổ biến:
Hệ thống điểm thưởng.
Giới thiệu.
Hệ thống điểm thưởng dùng để thưởng cho người dùng cung cấp tệp trong mạng.
Hệ thống hàng đợi trong eMule dựa trên thời gian người dùng phải chờ trong hàng đợi để tải tệp. Hệ thống điểm thưởng cung cấp một phương thức thay đổi thời gian chờ bằng cách so sánh thời gian tải lên và tải về giữa hai máy đồng đẳng khác nhau trong hàng đợi, máy nào tải lên cho nó nhanh hơn thì nó sắp xếp trước trong hàng đợi.
Phương thức thay đổi thời gian chờ được tính bằng cách lượng dữ liệu vận chuyển giữa hai máy đồng đẳng. Giá trị này có thể xem ở cửa sổ chi tiết của các chương trình client.
Tính toán điểm thưởng.
Thứ tự của máy đồng đẳng trong hàng đợi của một máy đồng đẳng khác phụ thuộc vào rất nhiều nhân tố khác nhau, bao gồm thời gian nó đã chờ trên hàng đợi, quyền ưu tiên cho tải lên một tệp xác định và điểm của các người dùng khác đánh giá nó. Các nhân tố trên đều có một giá trị tương ứng, tổng của các nhân tố trên là điểm dùng để xếp thứ tự các máy đồng đẳng trong một hàng đợi của một máy xác định.
Điểm thưởng được tính như sau:
Màu sắc của thanh tiến trình.
Mỗi tiến trình tải tệp về được biểu diễn bằng một thanh màu. 
Màu đỏ diễn tả phần của tệp chưa xác định được máy đồng đẳng nào sẽ cho tải về. 
Thanh màu đỏ tối diễn tả tiến trình tải tệp đang bị tạm dừng hoặc hãm tải về.
Thanh tải về.
Nếu bạn mở cửa sổ xem thông tin chi tiết về tệp đang tải, bạn sẽ nhìn thấy mỗi nguồn cung cấp của tài nguyên tương ứng với một thanh màu. Để xem thông tin này nhắp đúp vào tên tệp (hoặc nháy đơn, điều này tùy thuộc vào thiết lập trong Option -&gt; Display). Dưới đây là thanh màu diễn tả các ý nghĩa khác nhau: 
 (shaded style)
Số nguồn cung cấp.
Bốn giá trị xx/yy+aa (zz) hiển thị sau thanh thanh tiến trình là số nguồn cung cấp tệp và có các ý nghĩa sau.
Tính hiệu lực của tệp chia sẻ.
Mỗi tệp chia sẻ được biểu diễn tương ứng bằng một thanh màu, các màu có ý nghĩa tương ứng với màu dùng trong thanh tải về.
Liên kết ngoài.
Phiên bản mới nhất có thể tải ở đây: