FAQ eD2k-Kademlia-ru

From AMule Project FAQ
Revision as of 10:28, 22 January 2006 by Treplo (Talk | contribs)

Jump to: navigation, search

F.A.Q. по eD2k-Kademlia

English | Español | Italiano | Deutsche | Français | Nederlands | Polish | Russian

Что такое ED2K?

ED2K это протокол, который был впервые использован в P2P (Peer-to-Peer) клиенте eDonkey2000, отсюда и его название. Этот протокол основан на технологии клиент-сервер и поддерживает обмен источниками между клиентами.

Основу сети ED2K составляют серверы, так же как и во многих других P2P сетях, например Kazaa (в Kazaa тоже есть серверы, но там соединение с сервером скрыто от пользователя), поэтому первое, что надо сделать, запустив aMule -- соединиться с сервером (вручную или автоматически).

После успешного соединения с сервером, клиент может искать файлы локально (на соединенном сервере) или глобально (на всех серверах). Запрошенные серверы должны предоставить клиенту список файлов, которые удовлетворяют параметрам поиска.

Если пользователь хочет начать загрузку, то его клиент запрашивает сервер на предмет источников. В ответ сервер выдает список IP адресов известных ему клиентов, которые имеют данный файл.

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

Клиенты могут передавать вам одновременно только один кусок. Даже если вы в очереди за двумя разными файлами у какого-то клиента, он все равно будет передавать вам только один файл (другая загрузка, в зависимости от ED2K клиента, который вы используете, скорее всего получит максимальный приоритет, но загружаться начнет не раньше, чем будет получен кусок первого файла).

Если у обоих пользователей HighID (см. Что такое LowID и HighID?), то соединение устанавливается напрямую от клиента к клиенту (Peer-to-Peer). Если же у одного из них LowID, то соединение происходит через сервер, так как с LowID нельзя принимать входящие соединения. Отсюда же следует, что два клиента с LowID не могут соединяться друг с другом.

Что такое Kademlia?

Kademlia это естественное продолжение сети ED2K. За Kademlia будущее. Подробнее о том, зачем нужна Kademlia, смотрите в разделе Есть ли какие-нибудь ограничения у сети ED2K?

Поскольку Kademlia представляет собой децентрализованную сеть, исчезает "узкое место" в виде сервера (хотя Lugdunum много сделали, чтобы уменьшить этот эффект). Теперь, вместо того, чтобы соединяться с сервером, вы просто соединяетесь с клиентом (зная его IP адрес и порт), который поддерживает сеть Kademlia. Это называется Boot Strapping.

В зависимости от вашей возможности принимать входящие соединения, вы получите статус "open" или "firewalled", который аналогичен HighID и LowID в сети ED2K. Затем вам присваивается ID.

При поиске, каждый клиент действует, как маленький сервер, который отвечает за определенные ключевые слова и источники. Таким образом, ваш запрос направляется не к центральному серверу, а проходит через всю сеть.

Поддержка Kademlia появилась в aMule версии 2.1.0.

Kademlia это то же самое, что Overnet?

Если кратко, то нет. Overnet это безсерверное развитие программы eDonkey, а Kademlia -- безсерверное развитие клиентов *Mule. Обе системы основаны на оригинальном алгоритме Kademlia, но реализованы по разному и несовместимы. То есть, у них одна философия, но разные правила. Подробнее о работе Overnet смотрите по адресу http://www.edonkey2000.com/documentation/how_on.html только имейте в виду, что разработка Overnet будет закрыта вплоть до версии 1.0, тогда как разработка Kademlia открыта с самого начала.

Что такое кусок?

Чтобы предотвратить распространение поврежденных файлов, протокол ED2K предусматривает деление файлов на "куски", каждый из которых хэшируется отдельно (ниже написано подробнее про хэш). Стандартный размер одного куска 9.28MB, поэтому файл размером 15MB будет разбит на два куска (9.28MB + 5.72MB), файл размером 315KB останется одним куском, а файл размером 100MB поделится на 11 кусков (10x9.28MB + 7.2MB).

Что такое хэш?

Деление файлов на куски (см. Что такое кусок?) позволяет избежать загрузки поврежденного файла целиком, так как можно будет загрузить по новой только поврежденный кусок, но нужен способ определять поврежденные куски. Для этого используются MD4 хэши.

MD4 хэш это уникальное значение, которое присваивается каждому куску. Хэш представляет собой результат математической операции над каждым битом содержимого куска. Поэтому, изменив хотя бы один бит в куске, мы получим совсем другой хэш. Таким образом клиенты проверяют целостность каждой загруженной части файла.

Кроме того, вычисляется и хэш всего файла. Для этого хэши кусков последовательно соединяются друг с другом в том же порядке, в котором идут куски в файле (то есть: хэш_1го_куска+хэш_2го_куска+хэш_3го_куска+...) и полученная строка хэшируется. Таким образом, каждый файл в сети ED2K получает уникальный идентификатор. Хэш файла вычисляется не из содержимого файла, а именно из значений хэшей всех его кусков.

Кроме хэша файла надо знать и его размер. Эта информация указывается в ED2k ссылке, которые повсеместно используются.

Вот например:

ed2k://|file|eMule0.42f-Sources.zip|2407949|CC8C3B104AD58678F69858F1F9B736E9|/

Самые важные части здесь: "2407949" - это размер файла в байтах и "CC8C3B104AD58678F69858F1F9B736E9" - собственно хэш, показанный, как 32 шестнадцатиричных цифры.

Имя файла не играет роли при идентификации файла.

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

Если вы поняли "Что такое хэш", то сразу догадаетесь. ED2K сервер сообщает клиенту имена и хэши всех файлов, которые подпадают под параметры поиска. Два файла, содержимое которых различается, неважно большая эта разница или маленькая, имеют разный хэш и поэтому считаются разными файлами. Соответственно файлы с разными именами, но имеющие одинаковый хэш, считаются одним файлом: для сети ED2K важен хэш, а не имя.

Что такое LowID и HighID?

Каждому клиенту присваивается уникальный ID (идентификационный) номер, чтобы отличать его от всех других клиентов на сервере. Если этот ID меньше 16777216 (16 миллионов), то у вас LowID, а если больше, то HighID. Получите вы high или low ID -- это зависит от вашего клиента и от того, открыт ли TCP порт. Этот TCP порт клиента можно изменять в окне Настройки -> Соединение. Значение по умолчанию 4662 обычно тоже годится. Если вы прочитали про ED2K, то знаете, что клиенты с LowID не могут соединяться с другими клиентами, у которых тоже LowID, а это в целом уменьшает скорость загрузки. Поэтому так важно иметь открытым порт 4662 TCP (или другой, который указан в Настройках). Некоторые большие серверы вообще не пускают клиентов с LowID, потому что им требуется передача данных через сервер, что увеличивает нагрузку на сервер.

Для клиентов с HighID, числовое значение ID вычисляется из IP по формуле A + 256*B + 256*256*C + 256*256*256*D, где A.B.C.D это IP адрес. Число ID используется для идентификации. Его конкретное значение не важно, важно только то, больше оно 16777216 или нет. То есть клиент с ID равным 50000000 ничем не лучше клиента с ID 49999999. Еще бывает, что неправильно настроенный или очень загруженный сервер присваивает LowID, даже если открыт порт 4662 TCP. Это редкие исключения, но иногда они случаются.

Если вы не уверены, что правильно настроили порты, то можете протестировать их здесь.

Какие порты надо настроить в файрволе или роутере для нормальной работы aMule?

Надо различать входящие и исходящие соединения. Обычно, для отправки данных (исходящие соединения) все порты в роутере октрыты.

В этом случае, вам надо настроить порты только для входящих соединений:

aMule будет работать, даже если порты не открыты, но тогда вы не получите HighID. Как сказано выше, для получения HighID, порт 4662 TCP (или другой, который указан в Настройках) должен "слушать" (т.е. должен быть открыт в файрволе и перенаправлен в роутере).

Кроме этого, для хорошей работы ED2K, должно работать прослушивание еще двух портов: 4672 и 4665 UDP (то есть, TCP_PORT+3) (их тоже можно изменить в Настройках).

Для чего нужен каждый из портов?

Почти все номера портов можно изменить в настройках, поэтому здесь указаны значения по умолчанию. Направление трафика считается от клиента (от вас):

  • 4661 TCP (исходящий): Порт, на котором сервер ожидает соединения (определяется сервером).
  • 4662 TCP (исходящий и входящий): Передача от клиента к клиенту.
  • 4665 UDP (исходящий): Для глобального поиска и глобального запроса источников. Это значение всегда равно TCP порт клиента + 3
  • 4672 UDP (исходящий и входящий): Расширенный протокол eMule, Queue Rating и File Reask Ping
  • 4711 TCP: Порт для WebServer.
  • 4712 TCP: Порт для внешних соединений. Используется для связи aMule с другими программами, такими как aMule WebServer и aMuleCMD.

Есть ли какие-нибудь ограничения у сети ED2K?

Немного, но есть: два естественных ограничения и одно "искусственное". Естественные ограничения уже упоминались выше. Во-первых, проблемы пользователей с LowID (им требуется передача данных через сервер и два клиента с LowID не могут делиться файлами друг с другом). Во-вторых, хотя ED2K это p2p протокол, но для p2p соединения все же требуются серверы. Эту проблему решает протокол Kademlia.

"Искусственное" ограничение вводится для того, чтобы заставить клиентов делиться файлами, иначе сеть ED2K просто исчезнет. Клиенты с лимитом отдачи X KBps, где X между 0 и 3.99 (включительно) могут загружать файлы на скорости максимум X*3 KBps. Клиенты с лимитом отдачи Y KBps, где Y от 4 и до 9.99 (включительно) могут загружать не быстрее, чем Y*4 KBps. Если же лимит отдачи 10KBps или более, то на загрузку нет никаких ограничений. Искуственное ограничение встроено в программу клиента и его можно обойти, изменив исходный код, но тогда вас скорее всего будут банить серверы, с которыми вы соединяетесь.

Кроме того, все клиенты обязаны предоставлять минимум три слота, поэтому каждому из слотов нельзя разрешить больше, чем лимит_отдачи/3 KBps.

Есть и еще одно ограничение: максимальный размер файла в сети немного меньше 4GB (ровно 4294967295 байт, хотя aMule поддерживает файлы размером до 4290048000 байт).

При поиске серверы могут выдавать не более 300 результатов, но это уже ограничение сервера, а не eD2k.

А на стороне клиента имена файлов обычно ограничены 161 символом.

Есть ли какие-нибудь ограничения у сети Kademlia?

  • Эта сеть основана на ed2k и должна обеспечивать совместимость и однозначную идентификацию файлов, поэтому в Kademlia максимальный размер файла тоже 4GB.
  • То же самое и с лимитом на 161 символ.

Какие типы файлов скрываются за каждым из фильтров в окне "Поиск"?

Имейте в виду, что фильтры в окне "Поиск" работают не с содержимым файла, а только с расширением имени файла:

  • Архив: .ace .arj .rar .tar.bz2 .tar.gz .zip .Z
  • Звук: .aac .ape .au .mp2 .mp3 .mp4 .mpc .ogg .wav .wma
  • CD-образ: .bin .ccd .cue .img .iso .nrg .sub
  • Изображение: .bmp .gif .jpeg .jpg .png .tif
  • Программа: .com .exe
  • Видео: .avi .divx .mov .mpeg .mpg .ogg .ram .rm .vivo .vob

Так что, какой-нибудь фильм, который имеет имя "Birthday.zip" подпадает под фильтр Архив, а не под фильтр Видео.

Что такое источник?

Источник это клиент, который делится каким-то куском одного из незавершенных файлов в вашем списке загрузок. Очевидно, чем больше источников будет у некоторого файла, тем больше возможностей его загрузить и тем быстрее это можно сделать. В случае LowID есть разница между "источниками" и "доступными источниками", потому что "источник" это любой клиент, у которого есть кусок нужного вам файла, а "доступный источник" это тот, который и имеет нужный вам кусок и с которого вы можете его загружать (то есть, у того источника HighID).

Для чего нужны кредиты, рейтинги и счет?

Все три термина имеют отношение к тому, как в сети ED2K устанавливаются приоритеты в очереди на загрузку.

Счет имеет самое важное значение: клиент с наибольшим счетом будет первым в очереди за получением слота. Счет вычисляется следующим образом: счет = рейтинг x время_ожидания_в_секундах / 100 Для этого надо понять, что такое рейтинг.

Рейтинг символизирует преимущество, которое клиент получает вне зависимости от того, сколько он ждет в очереди. Когда клиент впервые появляется в очереди на загрузку, ему присваивается рейтинг 100. Затем это значение меняется следующим образом:

В зависимости от количества кредитов, рейтинг умножается на число от 1 до 10. Кроме того, в зависимости от приоритета файла, он еще умножается на число от 0.2 до 1.8 (Релиз 1.8, Высокий 0.9, Нормальный 0.7, Низкий 0.6, Очень низкий: 0.2).
Пользователей с некоторыми старыми клиентами, которые перегружают сеть, наказывают умножением рейтинга на 0.5.

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

Эти коэффициенты умножения называют "модификаторами". Клиенты, у которых модификатор больше единицы помечаются желтой звездочкой.

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

Модификатор кредитов, по которому вычисляется рейтинг, равен меньшему из двух чисел:
(количество_отданного x 2)/количество_загруженного и квадратный_корень(количество_отданного+2), где количество_отданного и количество_загруженного измеряются в MB.

Если результат меньше 1, то используется значение 1, а если больше 10, то берется число 10. Кроме того, если отдано меньше 1MB, то модификатор будет 1, а если ничего не загружено, то модификатор будет равен 10.

Что такое слот?

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