EDonkey2000 (сеть)

eDonkey2000, eDonkey, eD2k — файлообменная сеть, построенная по принципу P2P на основе сетевого протокола прикладного уровня MFTP. Распространённые в Рунете неформальные названия: «ослик», «осёл» пользователи сети — «ословоды».

Сеть состоит из изменяющегося во времени количества программ-клиентов, которые исполняются на компьютерах пользователей сети, и относительно небольшого (несколько десятков) количества серверов, взаимодействующих между собой по схеме клиент-сервер, клиент-клиент и т.д.

Передача файлов в сети производится от клиента к клиенту напрямую, по частям, то есть наличия полного файла у клиента сети для его раздачи другим клиентам не требуется. Серверы в файлообмене не участвуют.

Клиенты могут как загружать части файлов, доступных для загрузки, от других клиентов, так и отдавать другим клиентам имеющиеся у них части, доступные для раздачи.

Серверы, помимо некоторых вспомогательных задач, выполняют функцию поиска клиентами опубликованных (т. е., доступных для скачивания другими клиентами) частей файлов.

Существует множество программ, являющихся клиентами сети eDonkey. Наиболее известными из них являются eDonkey2000 (оригинальный клиент, больше не поддерживается, но остаётся популярным в наши дни), eMule и Shareaza (последние две программы, наряду с eDonkey, поддерживают и другие протоколы, но лишь eDonkey является для них общим).

Идентификация файлов 
Файлы в сети eDonkey идентифицируются благодаря использованию корневой MD4-хеш суммы MD4-сумм частей файла. Это позволяет считать одинаковыми файлы с разными названиями, но одинаковым содержимым, и различать файлы с разным содержимым, но одинаковым названием.

Поиск 
Поиск файлов в сети eDonkey осуществляется по ключевым словам, входящим в имена файлов и некоторым дополнительным характеристикам, таким как размер файла, его расширение, битрейт и т. п. Результатом поиска, возвращаемым сервером, является список имён файлов с соответствующей каждому имени корневой MD4-суммой найденного файла, IP-адресом и портом клиента, у которого хотя бы одна часть этого файла доступна для загрузки.

Каждый клиент связан с одним из серверов сети. Клиент сообщает серверу, какие файлы он предоставляет в общий доступ (эти файлы включают в себя как файлы, явно предоставленные в общий доступ пользователем через интерфейс программы-клиента, так и файлы, которые клиент сам загружает или уже загрузил от других клиентов, но не удалены пользователем из списка загрузки программы-клиента. Каждый файл, загружаемый клиентом, автоматически предоставляется в общий доступ, как только получена хотя бы одна его часть). Каждый сервер поддерживает список всех общих файлов клиентов, подключенных к нему. Когда клиент что-то ищет, он посылает поисковый запрос своему основному серверу. В ответ сервер проверяет все файлы, которые ему известны, и возвращает клиенту список файлов, удовлетворяющих его запросу.

Возможен поиск по нескольким серверам сразу. Такие запросы и их результаты передаются через протокол UDP, чтобы уменьшить загрузку канала и количество подключений к серверам. Эта функция особенно полезна, если поиск на сервере, к которому клиент подключен в настоящее время, даёт низкий результат.

Чтобы упростить поиск файлов, некоторые веб-сайты публикуют MD4-суммы файлов в виде ED2K-ссылки. Некоторые из этих сайтов также содержат списки активных серверов для обновления списков пользователями.

Загрузка 
Загрузка файла основана на принципах сетевого протокола прикладного уровня MFTP и происходит без участия сервера. Клиент, желающий скачать файл, получает информацию о наличии частей этого файла в общем доступе у других клиентов, используя результаты поиска на сервере, и соединяется с такими клиентами напрямую по полученным IP-адресу и порту. Для идентификации запрашиваемого файла используется корневая MD4-хеш сумма файла, также содержащаяся в результатах поиска. Помимо хеш-суммы, запрос на скачивание включает в себя начальное и конечное смещение требующейся части файла.
Клиент посылает запросы на скачивание отсутствующих у него частей файла другим клиентам, имеющим эти части, до тех пор, пока не соберёт из этих частей полный файл. Обращение к другим клиентам независимо друг от друга так, что разные части файла могут скачиваться от разных клиентов одновременно, что ускоряет загрузку файла. При первоначальном получении любой части файла скачивающий клиент сообщает поисковому серверу, что этот файл частично доступен у него для загрузки другими клиентами. Данное свойство протокола является одним из основополагающих принципов децентрализованных сетей «скачивая — раздавай» и служит цели увеличения количества доступных источников файла для других клиентов. При удалении файла из списка скачиваемых файлов части такого файла более не доступны для скачивания другим клиентам.

Межсерверные соединения 
Периодически серверы связываются друг с другом на короткое время. Во время этого сеанса связи сервер, объявляя о своём существовании, посылает список всех других известных ему серверов. Таким образом, серверы поддерживают список других активных серверов. Когда клиент подключается к серверу, сервер может выдать ему список известных ему серверов.

Хеш-алгоритм ed2k 
Хеш-алгоритм, используемый для вычисления идентификатора (корневой MD4-суммы) файла:
 Файлы делятся на равные кусочки по 9 728 000 байт (9500 КБ) и остаток.
 Для каждого кусочка вычисляется 128-битная MD4-хеш сумма.
 Если размер файла кратен 9 728 000 байтам, то есть размер остатка равен 0, всё равно рассчитывается сумма для этого пустого остатка.
 Затем все рассчитанные суммы объединяются в один единый массив (хеш-список) и рассчитывается MD4-хеш сумма всего этого массива. Эта сумма является корневой MD4-суммой файла — и идентификатором в сети eDonkey.
 Если размер файла меньше 9 728 000 байт, то хеш-список не составляется, а идентификатором файла служит MD4-хеш сумма всего файла.

Существует второй вариант алгоритма вычисления контрольной суммы файлов, дающих другой результат для файлов, размер которых кратен размеру секции, то есть с размерами 9 728 000 байт, 19 456 000 байт и т. д. Оригинальный алгоритм (использовавшийся в eDonkey2000 до версии v0.5.0) содержит ошибку (особенность), благодаря которой для файлов размерами, кратными 9 728 000 байтам, добавляется контрольная сумма пустой секции. Эту особенность учитывают в расчётах далеко не все программы (например, eMule учитывает, а Shareaza — нет). В eDonkey2000 с версии v0.5.0 до версии v1.4.3 эта «особенность» исправлена.

Отличия от оригинального алгоритма в следующем:
 Если размер файла меньше или равен 9 728 000 байтам, то в качестве идентификатора используется MD4 сумма всего файла.
 Если размер файла кратен 9 728 000 байтам, то контрольная сумма «пустого» остатка не добавляется.

Различия алгоритмов столь минимальны (и возникают только в конце расчёта суммы), что позволяет рассчитать обе суммы одновременно — практически без потери производительности.
Вторая версия суммы для таких «особенных» файлов может быть указана, например, в комментариях (так делает программа avdump).

Вот, например, контрольные суммы для файлов, состоящих из одних нулевых кодов для разных «вариантов» алгоритма.
Получить их (файлы) можно, например, такой командой bash для unix-систем:

 for i in 1 2 3;do dd if=/dev/zero of=zero$i bs=9728000 count=$i;done

ED2K-ссылка 
Используется для обмена файлами и публикации на порталах.

Пример:
 ed2k://|file|[Имя файла]|[Размер файла]|[ ed2k хеш файла ]
 |h=[ AICH хеш файла]|p=[ Md4 хеш 1-й части ]:[ Md4 хеш 2-й части ]:...
 |s=[ URL ссылка на файл]|/|sources,[ IP адрес источника ]:[ Порт источника]|/

Чаще всего встречается короткий вид.
 ed2k://|file|[Имя файла]|[Размер файла]|[ ed2k хеш файла ]|/

 Имя файла рекомендуется URI-кодировать.
 Размер файла — точный размер в байтах.

h — AICH (Advanced Intelligent Corruption Handler) 
Дополнительный хеш для ed2k ссылки. Использует более мелкие части для получения хеша. Это позволяет более подробно исследовать файл для нахождения и устранения ошибок, и уменьшает количество данных, необходимых для восстановления файла.

Рекомендуется публиковать его вместе со ссылкой, тогда он сразу становится доверяемым хешем и сразу же может использоваться для восстановления файла. Если же его не публиковать вместе со ссылкой, то клиенту необходимо будет получить один и тот же AICH-хеш из нескольких источников, прежде чем этот хеш будет признан достоверным.

Расчёт AICH-хеша 
Для получения хеша стандартный ed2k-блок (9 728 000 байт) делится на 53 части (52 по 180 КБ и 1 — 140 КБ). Каждая часть позже обрабатывается алгоритмом sha1. Далее пары хешей снова проходят через алгоритм sha1 до тех пор, пока не получается один единственный хеш.

p — набор MD4-хешей 
В этом поле перечисляются MD4-хеши ed2k -блоков через двоеточие «:». Позволяет проверять части на соответствие, даже если нет возможности получить набор хешей другим путём, например, если единственным источником файла является URL-ссылка.

s — URL-ссылка 
Позволяет при отсутствии ed2k-источников загрузить файл по URL-ссылке. Обычно серверы доступны постоянно, в отличие от ed2k источников, которыми в основном являются персональные компьютеры, подключенные к сети Интернет. Благодаря этому первичная загрузка происходит с сервера, а дальнейшее распространение идет уже в сети ed2k, что разгружает сервер и увеличивает доступность файла.

Перед вставкой ссылка должна быть URI-кодирована.

sources — источники 
Позволяет указать ed2k-источники, к которым можно обратиться для загрузки файла. Это даёт возможность начать загрузку файла без подключения к ed2k-серверу, просто подключившись к перечисленным источникам напрямую.

Данное поле имеет смысл использовать только, если источник имеет постоянный IP-адрес.

Коллекции 
Для публикации на порталах ссылки могут быть объединены в коллекции.

Lugdunum server 
 Lugdunum server — серверное ПО сети eDonkey2000. Большинство серверов ed2k-сети работает на Lugdunum. Он более масштабируем и эффективен, чем оригинальный MetaMachine eDonkey server.

См. также 
 eMule — наиболее распространённый свободный клиент сети eDonkey2000 для Windows
 iMule — кроссплатформенный, защищённый, анонимный клиент для сетей I2P и Kad сетей
 mlDonkey — свободный кроссплатформенный клиент с открытым исходным кодом
 aMule — кроссплатформенный клиент, разработанный на основе xMule, lMule и eMule
 JMule — клиент к файлообменной сети eDonkey2000, написанный на Java.
 lphant — бесплатный кроссплатформенный клиент
 Shareaza — свободный клиент для Windows, поддерживающий несколько P2P сетей

Ссылки 
 Официальный сайт. Закрытый (прекративший работу)
 Описание протокола eDonkey на Hydranode Project
 Описание протокола eDonkey на pDonkey project
 Скачиваем фильмы, музыку и программы из Интернета. Пиринговые сети eDonkey, BitTorrent, KaZaA, DirectConnect. Пер. с чеш. Рус. изд. под ред. М. В. Финкова. СПб.: Наука и Техника, 2006. - 272 с., ил. ISBN 5-98378-245-0 
 Алгоритм ed2k_hash
 eDonkey понарошку закрылась на compulenta.ru (13 сентября 2006)
 RHash консольная Open Source программа, вычисляющая ED2K и AICH хэши и EDonkey ссылки.

Примечания 

Файлообменные сети
Файлообменные протоколы