BitTorrent
Протокол BitTorrent был разработан Коэном Брахмом в 2001 году, чтобы позволить набору узлов быстро и легко обеспечивать общий доступ к файлам. Существуют десятки свободно распространяемых клиентов, которые поддерживают этот протокол, точно так же, как много браузеров поддерживают протокол HTTP с веб-сервером. Протокол доступен как открытый стандарт на www.bittorrent.org.
В типичной системе равноправных узлов (пиров), например организованной с помощью BitTorrent, каждый из пользователей имеет некоторую информацию, которая, возможно, представляет интерес для других пользователей. Эта информация может быть свободным программным обеспечением, музыкой, видео, фотографиями и т. д.
Есть три проблемы, которые нужно решить, чтобы предоставить контент в общий доступ.
1. Как пир находит другие пиры, которые имеют контент, который он хочет загрузить?
2. Как контент дублируется пирами, чтобы обеспечить быструю загрузку для каждого?
3. Как пиры поощряют друг друга к загрузке контента другим, так же как и скачиванию для себя?
Первая проблема существует, потому что не все пиры будут иметь весь контент, по крайней мере, изначально. Подход, принятый в BitTorrent, — создание для каждого поставщика контента описания контента, названного торрент (torrent). Торрент намного меньше, чем контент, и используется пиром, чтобы проверить целостность данных, которые он загружает с других пиров. Другие пользователи, которые хотят загрузить контент, должны сначала получить торрент, скажем, найти его на веб-странице, рекламирующей контент.
Торрент — это просто файл в определенном формате, который содержит два ключевых вида информация. Один вид называется трекер — сервер, который приводит пиры к содержимому торрента. Другой вид информации — список фрагментов одинакового размера, или сегментов (chunks), из которых состоит контент. Для различных торрентов могут использоваться различные размеры сегментов, обычно от 64 до 512 Кбайт. Файл торрента содержит имя каждого сегмента, предоставленного как 160-битовый SHA-1 хэш сегмента. Мы рассмотрим криптографические хэши, такие как SHA-1 в главе 8. Пока вы можете считать что хэш — это более длинная и более безопасная контрольная сумма. Содержащий размер сегментов и хэши торрент-файл как минимум на три порядка величины меньше, чем контент, поэтому он может быть передан быстро.
Чтобы загрузить контент, описанный в торренте, пир сначала контактирует с трекером торрента. Трекер (ttacker) — это сервер, который поддерживает список всех остальных пиров, которые активно загружают и пересылают контент. Этот набор пиров называют рой (swarm). Члены роя постоянно контактируют с трекером, чтобы сообщать, что они все еще активны, а также о том, что они покидают рой. Когда новый пир контактирует с трекером, чтобы присоединиться к рою, трекер сообщает ему об остальных пирах в рое. Получение торрента и контакт с трекером — это первые два шага для загрузки контента, как показано на рис. 7.42.
Вторая проблема — как разделить контент таким образом, чтобы обеспечивать быструю загрузку. Когда формируется начальный рой, некоторые пиры должны иметь все сегменты, составляющие контент. Эти пиры называют сидерами (seeders — сеятелями). Другие пиры, которые присоединяются к рою, не будут иметь никаких сегментов; они — пиры, которые скачивают контент.
В то время как пир участвует в рое, он одновременно скачивает отсутствующие сегменты с других пиров и загружает имеющиеся у него сегменты другим пирам, которым они нужны. Этот обмен показан как последний шаг распределения контента на рис. 7.42. Через какое-то время пир собирает все больше сегментов, пока не загрузит весь контент. Пир может покинуть рой (и вернуться) в любое время. Обычно пир остается в рое в течение некоторого короткого периода после окончания своей собственной загрузки. Из-за появляющихся и исчезающих пиров «текучесть» в рое может быть довольно большой.
Рис. 7.42. BitTorrent
Чтобы описанный выше метод работал хорошо, каждый сегмент должен быть доступен у большого числа пиров. Если каждый должен получать сегменты в одном и том же порядке, то многие пиры зависели бы от сидеров следующего сегмента. Это создало бы узкое место. Вместо этого пиры обмениваются друг с другом списками сегментов, которые они имеют. Затем они выбирают редкие сегменты, которые трудно найти для скачивания. Идея состоит в том, что при скачивании редкого сегмента создается его копия, что делает сегмент более доступным для других пиров. Если это делают все пиры, все сегменты будут широко доступны через короткое время.
Третья проблема возможно наиболее интересная. Узлы CDN настроены исключительно для того, чтобы поставлять контент пользователям. А узлы P2P не такие. Это компьютеры пользователей, а пользователи могут быть более заинтересованы в получении кинофильма, чем в помощи в скачивании другим пользователям. Узлы, которые берут ресурсы из системы без какого-либо вклада, называются фрирайдеры (freeriders) или личеры (leechers — пиявки). Если их слишком много, система перестает хорошо функционировать. Более ранние системы P2P, как известно, работали с ними ^агош и др., 2003), так что BitTorrent стремится минимизировать их количество.
Подход, принятый в клиентах BitTorrent, награждает пиры, которые показывают хорошее поведение при загрузках. Каждый пир беспорядочно обращается к другим пирам, получает сегменты от них и в то же время пересылает сегменты к ним. Пир продолжает обмен сегментами только с небольшим количеством пиров, что обеспечивает самую высокую производительность скачивания, и также беспорядочно пробует другие пиры, чтобы найти хороших партнеров. Случайные обращения к пирам также позволяют вновь прибывшим получить начальные сегменты, которыми они могут обменяться с другими пирами. Пиры, с которыми узел в настоящее время обменивается сегментами, называют не заглохшими (unchoked).
Через какое-то время этот алгоритм должен сопоставить друг с другом пиры с сопоставимой возможностью загрузки и скачивания. Чем больше пир содействует другим пирам, тем больше он может ожидать в ответ. Использование набора пиров также помогает насыщать пропускную способность пиров для высокой производительности. С другой стороны, если пир не пересылает сегментов на другие пиры, или делает это очень медленно, рано или поздно он окажется отрезанным или заглохшим (choked). Эта стратегия препятствует антисоциальному поведению, такому как у личеров в рое.
Заглушающий алгоритм иногда описывается, как осуществление стратегии «зуб-за-зуб» (tit-for-tat), которая поощряет кооперацию в повторных взаимодействиях. Однако он не защищает клиентов от обыгрывания системы в любом сильном смысле (Piаtek и др., 2007). Тем не менее внимание к проблеме и механизмы, которые затрудняют фрирайд для случайных пользователей, вероятно содействовали успеху Bit-Torrent.
Как вы можете увидеть из нашего обсуждения, BitTorrent имеет свой обширный словарь терминов. Есть торренты, рои, личеры, сидеры, трекеры, а также выговоры, заглушение, прослушивание и т. д. Дополнительную информацию вы можете узнать из короткой статьи о BitTorrent (Коэн, 2003) и в Сети, начиная с сайта www.bittorrent.org.
DHT — распределенные хэш-таблицы
Появление файлообменных P2P сетей в 2000-х годах вызвало большой интерес в исследовательском сообществе. Сущность систем P2P в том, что они избегают централизованно управляемых структур как в CDN и других системах Это может быть существенным преимуществом. Когда системы разрастаются до очень крупных размеров, централизованно управляемые компоненты становятся узким местом и точкой сбоев. Центральные компоненты также могут быть использованы в качестве точки контроля (например, чтобы выключить сеть P2P). Однако ранние P2P системы были только частично децентрализованы, или, если они были полностью децентрализованы, они были неэффективны.