Как стать автором
Обновить

Простота в дизайне. Эпизод 2. DHT и PEX

Время на прочтение2 мин
Количество просмотров5.9K
Peer-to-peer сеть BitTorrent очень популярна. И тем обидней, что базируется такая сеть на веб-сайт, трекер, что совершенно не пиртупирно и потенциально опасно. Соответственно, с тех пор, как жив BitTorrent, предпринимались различные попытки децентрализовать и оставшуюся часть — получение списка пиров.

Есть у студентов computer science популярный шаблон мышления: «Децентрализовать? DHT!». DHT, Distributed Hash Tables — умозрительно простая идея: диапазоны ключей хэш-таблицы разбрасываются на пиров, выстраиваются взаимные ссылки и ура. Ура — в жопе дыра. Потому что при столкновении с реальной сетью, в отличие от симулятора или кластера, начинается преогромное количество проблем. Более половины пиров, например, скрыты за NATами и фэйрволами, поэтому на запросы DHT одним пирам они отвечают, а другим — нет, причём труднопредсказуемым образом. Пиры постоянно приходят и уходят, некоторые пиры глючат, есть злоумышленные пиры, кто-то подключён по диал-апу. Чтобы всё это предусмотреть и подкрутить соответствующие затычки, пришлось серьёзно потрудиться. И получившийся код всё равно вызывает нарекания. Коренная проблема в том, что DHT вынужден строить свою отдельную P2P-сеть по своим отдельным правилам. Что плохо влияет на сложность, эффективность, безопаснось.

Другая попытка в том же направлении — PEX (Peer EXchange)*, gossip протокол, в котором уже соединённые пиры просто обмениваются адресами тех, к кому они уже присоединены. У протокола была нелёгкая судьба, потому что изначально Брам Коэн (автор BitTorrent) был уверен, что PEX будет вести к распадению роя. Он сделал по-быстрому какой-то симулятор и увидел полный распад. Некоторое время назад мне показалось, что я понимаю, почему и него рои распадались. Я тоже сделал симулятор, но при разумных параметрах распадения роя добиться не удалось. Видимо, была у него какая-то ошибка.

А PEX работает отлично. Его изначально реализовали в неофициальных клиентах, кажется Azureus и µTorrent (второй ещё не был куплен BitTorrent Inc). Постепенно реализация µTorrent, под названием ut_pex, стала общепринятой. Протокол очень эффективен: я с моего лаптопа своим специальным BitTorrent-пауком за пару-тройку минут переписывал всех пиров в 100-тысячном рое. Логика работы простая, экспоненциальная. Получив от трекера двадцать пиров и успешно присоединившись к двум, мы тут же по ut_pex получаем ещё двести. Ну и так далее. Сам протокол чрезвычайно прост и состоит из одного (!) сообщения. Ещё один популярный шаблон мышления: все думают, что сообщения должно быть два: запрос и ответ. Нет, запроса нет. Просто сообщения так малы, что экономить нет смысла. А с запросами куча мороки. Поэтому если пир видит, что вы понимаете ut_pex, он просто периодически шлёт вам IP-адреса. Реализация ut_pex в libtorrent-rasterbar занимает в 7 раз меньше места, чем довольно компактная реализация DHT там же**.

* А то, что сейчас написано про PEX в Википедии — это original research или попросту лажа.

** Внимательный читатель, возможно, заметит подтасовку — ut_pex не обеспечивает полной децентрализации трекинга, ведь ему нужны стартовые пиры. Поделюсь секретом. DHT этого тоже не обеспечивает. Во-первых, пользователи всё равно идут на сайт, потому что иначе их собрать сложно. Во-вторых, из того что я знаю, DHT на практике бутстрапится с корневых серверов (только это большой секрет! :) )

The cheapest, fastest, and most reliable components of a computer system are those that aren't there. — G. Bell
Теги:
Хабы:
Всего голосов 59: ↑51 и ↓8+43
Комментарии30

Публикации