upd: У поста вышло большое продолжение про блокчейн
В последние несколько недель я совершил серьезное погружение в мир децентрализованных сетей. У того были вполне практические причины, но скорее мне самому было интересно наконец разобраться в их устройстве и истории. Обожая сложные и неочевидные штуки, я решил немного прокачаться в этой области, а для начала историческое введение.
Сначала был фидонет. Созданный в 1984-м году геем-анархистом для обмена информацией между BBS'ками (досками объявлений), он стал первым иметь ряд черт, присущих децентрализованным сетям. Информация хранилась на компьютерах пользователей и серверах, которые в ночные часы одновременно созванивались по телефону и обменивались ей. Идея была привлекательна и интересна, но так и не захватила мир. В 1990-м придумывают Интернет.
Спустя более чем 10 лет, в 1999-м году, когда интернет уже вошел всеми своими TCP/IP в процветающие дома США, появляется Napster — первая децентрализованная файлообменная сеть. Для работы ему требовался сервер, на котором хранился индекс (список) файлов, доступных для скачивания. Индекс хранил IP-адреса пользователей, владеющих этими файлами, потому непосредственно скачивание производилось уже без участия сервера.
Схема работы Napster. Напоминает современные торренты
Именно Напстер, специализировавшийся только на mp3-файлах, запустил бум децентрализованных файлообменников и привлек такое большое внимание к ним. Так в 2000-м году запускаются сети Gnutella и eDonkey. Создатели Gnutella — Nullsoft (да, они же создатели плеера WinAmp), вдохновляются успехом Napster, улучшают его и предлагают полный отказ от центрального сервера со списком файлов. Вместо этого, каждый клиент Gnutella знает ip'шники нескольких «соседних», которым отправляет поисковый запрос (имя файла). Если те не знают ответа, они отправляют его своим соседям, те своим и так далее пока файл не будет найден. Если файл не найден за 7 таких уровней, «хопов», запрос отбрасывается. Естественно, у такой организации были и существенные минусы — запрос мог выполняться около 2-х минут, а так же ранние реализации такого стихийного распространения вызывали перегруз и отказ в обслуживании у всей сети. Неловко, да. Потом алгоритм усовершенствовали.
Сеть Gnutella, как и Napster, начинают бешено набирать популярность. Настолько бешено, что AOL, владеющий тогда Nullsoft'ом открещивается от нее, называя «unauthorized freelance project» и быстренько увольняет её создателей. Типичное поведение крупных компаний. Фанаты реверсят протокол, выпускают открытую реализацию, которая доживает и до наших дней. Однако именно алгоритм распространения запросов, несмотря на свою красоту, мешает сети вырасти во что-то большое и ведет к уменьшению её популярности.
eDonkey, запущенный в том же 2000-м году, тоже зависит от сервера. Точнее от серверов. Они так же выполняют роль хранителей индекса, однако теперь их множество и ни один из них не хранит весь список файлов. Это уже можно назвать настоящей децентрализацией, каждый сервер знает файлы только тех клиентов, которые подключены к нему. Отказ одного из серверов не повлияет на систему, просто клиентам придется ввести в настройках другой.
Клиент запрашивает файл только у своего сервера, однако тот имеет возможность опросить так же другие сервера на предмет наличия этого файла у их клиентов. Для поддержания такого общения, сервера тоже раз в N'ное время общаются между собой hello-сообщениями, в которых не только убеждаются в активности соседей, но и обмениваются списками новых известных серверов. Скачивание файлов, как и положено, происходит напрямую между клиентами, минуя сервер.
На волне общего ажиотажа появляется проект Freenet, призванный создать свой собственный распределенный децентрализованный интернет поверх существующего, запускается в 2000-м году. Однако как и любое другое ПО с "free" в названии особо ничего не добивается даже по сей день.
4 апреля 2001 года (через несколько дней мне исполнялось 10 лет ^_^) Брэм Коэн пишет на языке Python клиент и протокол с одним названием BitTorrent. Протокол резко набирает популярность по причине своей простоты, экономности, а главное — открытости. Napster был полностью проприетарен, Gnutella отреверсена фанатами, eDonkey имел закрытую серверную часть. BitTorrent же был полностью описан, понятен и метил на звание первого нормального стандарта.
Будучи похожим на eDonkey, он убирал взаимодействие между серверами (получившими название «трекеры»), перекладывая эту задачу на создателей раздач. Так же в отличии от eDonkey, где релизы оформлялись в виде ссылок специально формата (как magnet-ссылки, появившиеся позже), BitTorrent вводит понятие .torrent-файла. В нем описывается список входящих в раздачу файлов, размеры «кусков» для скачивания, а так же для каждого куска SHA-1 хеш (контрольная сумма). Эрудированному читателю становится очевидно, что чем на меньше куски релизер поделит раздачу - тем больше размер .torrent-файла, ведь приходится хранить больше хешей, однако чем размер куска больше — тем больше ошибок скачивания, а соответственно и перезакачек.
В конце .torrent-файла так же описываются трекеры, к которым клиент будет обращаться. Таких трекеров может быть множество. Тем самым решается проблема eDonkey с коммуникацией между трекерами. Она просто не нужна. Клиент просто подряд обращается ко всем описанным трекерам, спрашивая, известен ли тому кусок с определенным SHA-1. Этим хаком пользуются создатели ретрекеров (специальных трекеров в локальной сети, которые работают как кеширующие прокси, что не только ускоряет раздачи, но и экономит трафик провайдерам). Стало уже стандартом добавлять адрес "retracker.local:80" в список трекеров раздачи. Если такой адрес недоступен, он будет просто отброшен клиентом.
Общение с сервером происходит по обычному протоколу HTTP (иногда HTTPS), обычными GET-запросами. А вот формат кодирования .torrent-файла, ответа от трекера, а так же общения между клиентами, хоть и является текстовым, но весьма необычен — bencode (поцаны жили в эпоху без json, крутились как могли). Однако погружение в дебри протокола BitTorrent я хочу оставить на следующую статью, если эта вызовет хоть какой-то отклик.
Нам же интересно то, что у протокола BitTorrent стало появляться множество расширений. Одно из самых интересных для нас — поддержка DHT (механизма распределенных хеш таблиц). Механизм DHT позволяет клиентам, участвующим в раздаче, обмениваться между собой не только самими файлами, а выполнять роль мини-трекеров. Грубо говоря клиент может рассказать только что подключившемуся к нему другу, что вон там за углом он видел еще толпу поцанов с таким же файлом. Это позволяет сети BitTorrent работать без трекера и выводит ее на новый уровень отказоустойчивости.
Летом 2001 года, заваленный судебными тяжбами, умирает Napster. Точнее его продают и покупают копирасты, издеваются над трупом, используя бренд для собственных целей. BitTorrent плавно начинает занимать место лидера и на поприще файлообмена его еще долго ничего не затмит.
2002-2003 годы — рождение Tor (The Onion Router) и I2P (Invisible Internet Project), которые знаменуют собой появление Темного Интернета. Эти ребятки, хоть и немного по-разному, пытаются создать оверлейную децентрализованную сеть поверх существующего Интернета, отличающуюся паталогической параноидальностью. В России набирают популярность в 2012-2013 годах после Честных Выборов и всего с ними связанного, но бурного роста не показывают на фоне наличия всяких открытых и более быстрых классических VPN и проксей.
В октябре 2008 года в интернете появляется непримечательная pdf'шка под названием «Bitcoin: A Peer-to-Peer Electronic Cash System» за авторством некоего Satoshi Nakamoto. Вслед за ней, в 2009-м, выходит приложение Bitcoin и исходный код протокола. Но замечают его лишь в 2011-м, когда его начинают форсить зарубежные СМИ. Это привлекает сначала майнеров, а затем и спекулянтов на появляющиеся биржи.
Однако нам биткоин интересен не его платежеспособностью, а внутренним устройством. Модель blockchain, на которой основана вся валюта — это первое интересное применение распределенной базы транзакций (событий). В сети bitcoin отсутствует понятие «баланса кошелька». Баланс пользователя сладывается из его входящих и исходящих транзакций, сами «деньги» не хранятся нигде. Blockchain хранит список событий «А заплатил В», «В заплатил С», а не состояний «баланс А = 20». Такой подход редок, но его используют и в других областях. Где-то читал, что инстаграм так организует часть своей БД.
Майнинг же имеет практическую пользу для всей сети: транзакции не сразу добавляются в blockchain, а объединяются в блоки, которые присоединяются к нему. У блока должна быть определенный хеш чтобы присоединить его к цепочке, майнеры и занимаются тем, что пытаются угадать, то есть засрать блок рандомными битами так, чтобы получить такой хеш. Сложность хеша подбирается каждые 2016 блоков так, чтобы на его угадывание у всех майнеров в мире уходило примерно 10 минут. Угадываемый хеш имеет определенные свойства, которые гарантируют, что этот блок идет строго за тем, к которому был присоединен, а любое изменение в блоках вызовет каскадный отказ всех блоков за ними (потому что их хеши тоже посчитаны так, чтобы указывать на хеш предыдущего).
Интересность блокчейна в том, что он реализует сеть не столько для передачи, как все предыдущие сети, сколько для хранения данных. Это глобальная децентрализованная база данных, хоть и весьма своеобразная и требующая дичайших мощностей для поддержания своей работы. Это может быть лишь первой ласточкой среди таких сетей.
Схематическое описание генерации блока майнером
В 2010-2011 появляются децентрализованные социальные сети Diaspora и Twister. Но особого успеха не имеют, так как требуют установки себе на компьютер веб-сервера, а значит уже ограничены в росте тем 0,01% населения планеты, которое знает слово «веб-сервер». Быстро дохнут, так и не обретя своей славы.
2011 год — OpenGarden. Проприетарный проект, ставящий перед собой целью создать ячеистую сеть из устройств, находящихся рядом. Благодаря серьезному проникновению мобильных устройств впервые идеи mesh networking'а получают небольшой шанс на воплощение в жизнь. Однако идея делиться своим интернетом со всеми вокруг не находит должного отклика среди простых пользователей, в отличии от выходящего в марте 2014 года месседжера Firechat.
Основанный на той же самой технологии коммуникации различных устройств (iOS, Android, ноутбуков) по Wi-Fi и Bluetooth на небольшом (до 60 метров) расстоянии, FireChat получает мировую огласку после попытки революции в Гонконге в сентябре 2014 года, во время которой власти отключают протестующим интернет и те организовывают одну большую mesh network из собственных смартфонов.
Кроме протестующих и пишущих про них журналистов, FireChat'ом больше никто особо и не пользуется (возможно по причине общей уебищности и неудобности). Однако он стал первой ласточкой, показавшей нам, что у распределенных сетей есть свои применения. Мы входим в век, когда холодильники начинают общаться между собой, а у каждого в кармане лежит по смартфону. Сегодня уже никого не удивить телевизором с постоянным доступом в интернет, завтра это будут микроволновки и пылесосы. Для пользователей это всё клево и весело, другие видят в этом перспективы нового витка развития коммуникаций.
Выходящим за рамки привычных интернетов, провайдеров, но и не являющимися игрушками для гиков, как Tor и I2P, а технологиями, доступными даже последней домохозяйке. Мой отец не знает где на клавиатуре компьютера Esc, но без проблем установит приложение на подаренный мной iPhone. Именно мобильные устройства снижают порог вхождения в новый цифровой мир.
Пока все обсуждали новые розовые обои в iOS 7, Apple выпустила в ней то, что пока почему-то не заметил никто — Multipeer Connectivity Framework. Apple уже начинает догадываться к чему всё идет?
Добрые люди уже отсниффили протокол FireChat'а и работает всё достаточно просто — JSON-сообщение доставляется просто всем, кто рядом. Если в такой понадобится маршрутизация — классические алгоритмы роутинга в mesh-сетях OLSR и B.A.T.M.A.N. разработаны давно и ждут своего часа.
Технологии уже все есть. Осталось самое сложное — придумать как эти технологии обернуть в полезный для пользователя опыт. Алгоритмы статистического анализа естественного языка были разработаны пол века назад, но только Гуглы и Яндексы смогли использовать их на пользу простым людям. Всё устройство и проблемы распределенных децентрализованных сетей были исследованы уже давно, а вот действительно полезной вещи кроме фильмов на торрентах на них до сих пор не придумали. Если дать людям технологию — она так и останется уделом 0,01% упоротых гиков типа нас. Если дать новый удобный способ решения проблем на основе этой технологии — это способно изменить мир.
Прочитал. Збс. Жду следующие посты!
По генерации нодов в DHT писал свою бакалаврскую :) Не менее интересно было бы прочитать следующий пост
The_Mindless, ебани коммент по поводу того как там все устроено. Коротко своими словами :
О я тоже жду продолжение. ;) Я считаю что будущие за p2p технологиями!
Кхм, забыл упомянуть tox. Тоже считай поверх DHT, но чат, файлы, звонки, и т.п. The_Mindless, +1, ждём
Defcon!
s_mordvinov, шаришь! ReDetection, слышал, но не думал, что он особо популярен.
ну в узких кругах, примерно как и tor. у них на гитхабе дохуищща коммитов у ядра, дохуищща уже клиентов сделано, даже несколько под iOS, и один из них уже совсем торт. :)
Спасибо, клево. Было бы интересно почитать про протокол BitTorrent (или пнуть в сторону нормального описания, а то один раз пробовал реализовать и на чем-то сдох).
ak3n, тогда будет, как и планировал, следующим постом. Попробую :)
Почитай ещё про мультиагентные системы, это конечно несколько из другой оперы, но довольно интересно.
Блин, интересно стало аж. Вот так почитаешь про новые технологии и загораешься, т.к. понимаешь, что идеи реально бродят рядом с тобой…
Этот текст очень приятно читать. Спасибо за него.
ботнет забыли! и вот вам залипалочка - http://map.ipviking.com/
аффтар, ждем подробностей про bitcoin!
Жаль, конечно, что до сих пор есть люди, путающие интернет и www. Интернет был придуман в восьмидесятых.
Проблема малой распространённости mesh-сетей будет до тех пор, пока их создатели не задумаются, наконец, о вопросе мотивации участников. Типичная mesh-сеть замотивирована "коммунизмом" в стиле "ну, мне не жалко, пусть через меня связь ходит" или самообманом о к.-л. самозначимости ("я крут, т.к. борюсь за доступность знаний", "я борюсь против монополистов", итп). По сути, участник, предоставляющий свои ресурсы сети, безвозмездно спонсирует остальных участников сети "за идею". Рано или поздно, самообманы и "коммунизм" постепенно излечиваются рациональностью, так что возникает тенденция "а нафига оно мне надо?". Особенно быстро это происходит при затратности ресурсов, когда участник ощущает затраты карманом явно (а бесплатных ресурсов не бывает, просто их цена часто неочевидна). Необходимость что-то подкручивать и настраивать (даже однократно при инсталляции) - тоже цена ресурса (тоже неявная). Эта же тенденция также ведёт к "обману" договорённостей, когда получатель ресурса пытается "проехать на-шару" не предоставляя свои ресурсы взамен (вон, в торрентах: многие ли раздают хотя бы столько же, сколько скачали?). Лекарство от этой проблемы изобретать не надо, оно очевидно (только почему-то неочевидно разрабам сетей) - цена ресурса должна возмещаться раздающему его. Т.е. за каждый пакет данных получатель платит что-то передающему. Ну а дальше тут сами включаются рыночные механизмы, которые и завершат лечение болячки; да так, что от предоставляющих ресурсы будет тесно. :) Это, конечно, усложняет протоколы, т.к. они уже неотрывно должны содержать привязку к каким-то финансам -- микротранзакции, к.л. койны (очевидно, с блокчейном, реализуемым самой этой mesh-сетью), в протокол д.б. встроена механика торговли (или хотя бы выбора канала по цене из возможных), итд. Зато это однозначно "лечит" вышеуказанную болячку. А заодно и некоторые другие болячки инета (напр., при наличии явной платы за информацию, не будет смысла засирать эту информацию рекламой). Сам mesh-блокчейн почти невозможен без системы "рейтингов доверия" -- это тоже порядочный кусок сложности, особенно при многомерной реализации (кластеризация по взаимной оценке). Но зато это тоже попутно лечит кое-какие проблемы сетей. Сейчас "рейтинг" (в к.л. форме) - единая оценка от "толпы" или от "модератора". Но что, если я не согласен с этой оценкой? Дайте мне отдельную оценку именно от тех, кому я доверяю оценивать (от моей "группы доверия"). Это, кстати, тоже поднимет качество информации (напр новости будут рекомендоваться мне именно в порядке оценки от моей "группы доверия", которая постепенно вычисляется и корректируется по моим же прошлым оценкам; а отсюда вообще рукой подать и до распределённого управления более материальными ресурсами, напр "распределённого государства" вместо клоунады с депутатами). В общем, сетевые технологии ещё копать и копать; для многих полезных идей даже эффективных алгоритмов пока не наработали.