Pull to refresh

Гиперссылки в формате «ed2k://…» и их применение. Часть 1: описание формата файловых ed2k-гиперссылок

Reading time 7 min
Views 10K
Более десяти лет назад (6 сентября 2000 года, как можно выяснить в Архиве Интернета) на свет появился первый выпуск программы eDonkey2000, представивший миру идею и реализацию гиперссылок в формате «ed2k://…» — удивительный для своего времени алхимический сплав трёх идей: во-первых, хэширования файлов, во-вторых, URI (единой формы идентификации ресурсов), и в-третьих, файлообмена.

Хотя через 6 лет (в сентябре 2006 года) юристам RIAA через суд удалось принудить производителя eDonkey2000 прекратить распространение программы (и даже подменить её сайт зловещим предупреждением о нелегальности файлообмена), формат гиперссылок «ed2k://…» был унаследован и широко используется по сей день во всех файлообменных программах и на всех сайтах, имеющих дело с файлообменными сетями ed2k или Kad. Более того, с тех пор этот формат успел слегка подразвиться по сравнению с вариантом 2006 года. Такова эпическая сила идей, в нём заложенных.

Популярность программ, реализующих формат гиперссылок «ed2k://…», также оказалась немалою. В зените своей славы программа eDonkey2000, название которой действительно происходит от английского слова «donkey» («осёл»), в умах российских пользователей на равных боролась за жаргонное название «ослика» с мега-популярным браузером IE, который обязан этой кличкою лишь случайному сходству транскрипции «иэ» и имени ослика Иа-Иа из историй о Винни-Пухе — а также, быть может, и своему ослиному упрямству в некорректной интерпретации некоторых веб-стандартов. (Приязнь к аниме и понимание «иэ» как японского отрицания «нет» в те годы, как видно, не было распространено.) А главный из идейных «наследников» eDonkey2000 — свободная программа eMule с открытым исходным кодом — до сих пор находится в вершине списка наиболее популярных (по числу закачек) продуктов на сайте SourceForge.

Хэширование файлов. URI. Файлообмен. Каким образом все три эти идеи сплелись воедино в формате гиперссылок «ed2k://…»?

Три источника, три составные части…


Хэшированием файла называют математический процесс, который способен поставить в соответствие каждому файлу некоторое длинное (многобитное), но всё же небольшое по размеру число, называемое хэшем. При этом даже незначительные изменения в файле приводят к значительным изменениям этого числа (хэша), поэтому, как правило, разным файлам соответствуют разные хэши. Разумеется, количество хэшей конечно, хотя и очень велико (например, ≈2160 для 160-разрядных хэшей), так что появление коллизии (то есть такой пары файлов, которые имеют одинаковый хэш) возможно. Однако оно необычайно маловероятно. Поэтому, если алгоритм хэширования обладает математически доказанной криптографической стойкостью (то есть если вычислительно сложно было бы подобрать файл, соответствующий некоторому заранее известному хэшу — или даже подобрать два таких разных файла, хэши которых одинаковы), то тогда хэш файла может использоваться в качестве уникального идентификатора содержимого файла (и одновременно как средство проверки целостности содержимого файла).

Идея URI (единой формы идентификации ресурсов) первоначально пришла в голову Тиму Бернерсу-Ли в 1994 году в виде URL (единой формы адресации ресурсов), то есть такого способа записи адреса файла (или не файла, а другого ресурса), по которой любой браузер мог бы понять, где ресурс лежит. Позднее (в июне 1994 года, создав RFC 1630) Бернерс-Ли обобщил идею единой формы адресации, сформулировав идею единой формы идентификации — например, идентификатор «urn:isbn:0-395-36341-1» использует международный стандарт нумерации книг (International Standard Book Number, ISBN) для того, чтобы понятно и недвусмысленно указать, какая книга имеется в виду, хотя ничего не говорит о том, где эту книгу можно взять.

Джед Мак-Калеб (Jed McCaleb), создатель eDonkey2000, осознал, что хэш (уникальный идентификатор содержимого файла) как раз и является превосходной основою для записи URI этого файла. Что же касается вопроса о том, где можно получить файл, то ответом стал p2p-файлообмен автоматический процесс поиска и последующей прямой передачи данных между пользователями глобальной сети, впервые реализованный в июне 1999 года Шоном Фэннингом (Shawn Fanning) с появлением Napster. Употребление хэшей позволило eDonkey2000 превзойти Napster сразу по двум характеристикам: во-первых, поиск файла в сети происходил по хэшу, так что переименование файла не мешало ему быть найденным (в Napster от клиента к поисковому серверу передавались сведения только об имени и размере, но не о содержимом файла), а во-вторых, получатель файла мог собирать фрагменты файла от нескольких других участников сети (а не от одного, как в Napster) и всё же быть уверенным в целостности файла, так как целостность проверялась по хэшу.

Ссылка на файл


На примере дистрибутива Adobe Reader X я покажу вам, как выглядит типичная ed2k-гиперссылка, указывающая на файл:
ed2k://|file|AdbeRdr1001_en_US.exe|48536984|249634B84340FEB5778EC09A2A9C2B87|/

На этом примере вы можете видеть, что формат её вот каков:
ed2k://|file|имяФайла|размерФайла|хэшФайла|параметр=значение|/

Подобно шаблону MediaWiki (например, в Википедии), ed2k-гиперссылка состоит из ряда значений, разделённых вертикальной чертою. Первым всегда является схема URI («ed2k://»), а последним — косая черта («/»). Вторым указывается ключевое слово, означающее тип ссылки. Для файловых ed2k-гиперссылок это всегда «file». За ним следуют в строгом порядке имя файла, размер файла (в байтах) и ed2k-хэш файла, после них в произвольном порядке могут следовать необязательные параметры в формате «имя=значение».

Имя файла, как и всегда в URI, может содержать служебные символы, подвергающиеся обязательному шестнадцатиричному кодированию побайтно. Пробел, например, записывается в форме «%20», а русская буква «к» — в форме «%D0%BA» (в UTF-8 ей соответствуют два байта), и так далее.

Хэш ed2k вычисляется по алгоритму MD4 таким образом, чтобы сделать возможным вышеупомянутое получение разрозненных кусков файла от нескольких участников файлообмена.
Википедия гласит, что для этой цели крупные файлы делятся на равные ломти, размером по 9500 килобайтов (9 728 000 байтов) каждый, и на последний ломоть меньшего размера, после чего для каждого ломтя вычисляется 128-битный хэш MD4. (Если размер файла кратен 9500 килобайтам, то последний ломоть считается пустым, но хэш MD4 от него всё равно рассчитывается.) После этого полученные хэши MD4 объединяются встык, и их собственный хэш MD4 становится ed2k-хэшем файла. Если же весь файл по размеру меньше 9500 килобайтов, тогда его хэш MD4 становится ed2k-хэшем файла.
Протокол файлообмена устроен таким образом, что клиенты обмениваются списками MD4-хэшей всех ломтей. Соответственно, общий ed2k-хэш позволяет проверить адекватность этого списка. А получив по файлообмену хотя бы один из таких 9500-килобайтовых ломтей файла от другого участника файлообмена, клиент ужé может проверить целостность этого ломтя и тотчас же включиться в файлообмен, раздавая имеющийся ломоть далее — другим желающим.

Необязательные параметры


Необязательные (именованные) параметры могут быть вот какими:
  • Параметр «s» указывает источник файла, альтернативный файлообмену. В настоящее время это, как правило, HTTP-сервер, хотя стандарт 2006 года предусматривал возможность получения файла и из сети Overnet. Пример:
    ed2k://|file|AdbeRdr1001_en_US.exe|48536984|249634B84340FEB5778EC09A2A9C2B87|s=http://ardownload.adobe.com/pub/adobe/reader/win/10.x/10.0.1/en_US/AdbeRdr1001_en_US.exe|/
    Таких параметров в одной ed2k-гиперссылке может быть несколько.
     
  • Параметр «p» содержит полный набор MD4-хэшей ломтей файла, обеспечивая возможность более надёжной и полной проверки их целостности, чем общий ed2k-хэш. В том случае, если файл скачан по URLу из параметра «s», а общение с другими клиентами ed2k (для получения хэшей ломтей) не производилось, этот набор позволит идентифицировать один или несколько порченых ломтей, а не просто убедиться в несоответствии файла и хэша. Пример:
    ed2k://|file|AdbeRdr1001_en_US.exe|48536984|249634B84340FEB5778EC09A2A9C2B87| p=F9FB4A4E8EC04320AC49D0F796807795: 9159AD7B29693322F8455258F6D02B3C: A51E847EB4E2D67BD04F1AF95D0479EB: A489A6E25ADF20366E8C4BCD69DD0DA9: 3315A3CDAE777B7AE8E734161DAEFFE3|/
    Этот пример содержит пробелы для удобства переноса на новую строку. Настоящий URI записывается без пробелов.
     
  • Параметр «h» позволяет указать хэш AICH, употребляемый некоторыми современными ed2k-клиентами (например, eMule) для дополнительного контроля целостности файла. (Он рассчитывается по алгоритму SHA-1 на небольших кусках файла, по 180 килобайтов, после чего находятся хэши от хэшей в рамках своего рода древовидной структуры; в параметре «h» указывается хэш, получающийся на вершине дерева.) Наличие этого параметра делает коллизии ещё менее вероятными, а также упрощает коррекцию ошибок в случае нарушения целостности файла при передаче, позволяя быстро выяснить, какой кусок ломтя повреждён (и восстановить один этот кусок вместо того, чтобы заново выкачивать по файлообмену весь ломоть). Пример:
    ed2k://|file|AdbeRdr1001_en_US.exe|48536984|249634B84340FEB5778EC09A2A9C2B87| h=5XYGXYHANLAEAL3Y67HVF32OOJ2HXCCP|/
    Этот пример содержит пробел для удобства переноса на новую строку. Настоящий URI записывается без пробелов.
     
  • Параметр «f» позволяет указать местонахождение текстового файла, содержащего более полную ed2k-гиперссылку — на случай, если она превосходит длину 2038 символов, являющуюся пределом размера URI в некоторых стандартах и браузерах. Пример:
    ed2k://|file|AdbeRdr1001_en_US.exe|48536984|249634B84340FEB5778EC09A2A9C2B87|f=http://example.org/long.ed2k|/
    Боюсь, что он едва ли поддерживается всеми современными клиентами.
     
  • Параметр «sources» имеет особую форму: всегда записывается в конце ссылки, и ему предшествует параметр, состоящий из косой черты («/»). Таким образом, клиенты, не понимающие параметра «sources» (и одновременно считающие косую черту признаком конца ed2k-гиперссылки), вольны его игнорировать. Содержит ключевое слово «sources», за которым, через запятую, следуют адреса (или доменные имена) и порты ed2k-клиентов. Пример:
    ed2k://|file|AdbeRdr1001_en_US.exe|48536984|249634B84340FEB5778EC09A2A9C2B87|/|sources,ed2k.example.net:6789,ed2k.example.org:12345|/
    Этот пример содержит пробел для удобства переноса на новую строку. Настоящий URI записывается без пробелов.

    Вполне понятно, что такие адреса должны быть долговременными, что достигается резервированием постоянного IP-адреса или привязкою доменного имени к динамическому DNS.

Создание файловой ed2k-гиперссылки


Чтобы создать ed2k-гиперссылку, содержащую размер файла (в байтах) и один (ed2k) или два (ed2k и AICH) хэша, не обязательно быть участником файлообмена, устанавливать eMule или другой аналогичный клиент для сетей ed2k и (или) Kad. Простая программа LinkCreator, распространяемая через сайт SourceForge создателями eMule (125 Kb ZIP), способна без труда справиться с этой задачей в Windows (или под Wine).

        (Продолжение следует…)
Tags:
Hubs:
+42
Comments 37
Comments Comments 37

Articles