Как работает Bittorrent?
Я хочу узнать больше о bittorrent способ обмена файлами. Я - технически продвинутый пользователь (программист), поэтому технически продвинутый материал не проблема, но он должен быть кратким и конкретным. Мне нужна хорошая книга ресурсов / веб, которая объясняет общую архитектуру bittorrent.
Меня не интересуют детали, только общая архитектура и терминология, такая как семена, коллеги и т. Д.
Какие-либо предложения?
4 ответа
Обзор работы bittorrent:
У вас есть сверстники и трекер. Все сверстники в любой момент - это рой. Обычная ситуация - один или несколько пиров имеют полный набор файлов и хотят сделать его доступным для других пиров.
Одноранговый узел получает файл.torrent, который будет иметь среди прочего A) хэш SHA-1 набора файлов, B) URL-адрес трекера и C) количество фрагментов, на которые разбит файл, а также хэш SHA-1 для каждой части. Размер кусков определяется самим торрентом.
Затем узел подключается к трекеру, используя URL-адрес, указанный в торренте. Трекер отвечает списком пиров. Трекеры говорят HTTP через порт 80 или 443.
Пир затем выбирает другого пира, используя информацию из трекера, и связывается с ним напрямую, чтобы установить сеанс обмена, пытаясь получить кусок. Обратите внимание, что сеансы обмена напрямую выполняются одноранговыми узлами, и трекер НЕ участвует в передаче. Трекер только предоставляет информацию.
Как только у узла есть кусок, он проверяет его по хешу SHA-1 и записывает его в файл. Затем он может предложить этот кусок при выборе другого пира. Последующие обменные сессии включают "торговые" фигуры. Я полагаю, что сверстники, как правило, дадут вам первую часть, если у вас нет других частей.
Одноранговый узел периодически повторяет проверку трекера, чтобы получить обновленный список одноранговых узлов. Партнеру не нужно ждать окончания одного обмена, прежде чем начинать другой, если у него есть несколько частей, поэтому, когда у партнера есть куча частей, передача может действительно ускориться. Вот почему торренты начинают медленно, но быстро набирают скорость по мере того, как пир приобретает фигуры.
Когда узел имеет все части, весь файл сверяется с хэшем SHA-1 набора файлов. Затем он становится сеялкой и теперь не делает ничего, кроме как помогает повысить доступность набора файлов. Сверстники, которые не имеют всех частей, являются пиявками.
Если у торрента нет начальных значений, он мертв, хотя, если между всеми частями, находящимися у всех пиров, существует полная копия файла, они в конечном итоге обменяются, чтобы получить полную копию между собой.
Хэш SHA-1 - это то, как трекер и одноранговые узлы "знают", какой файл должен быть скопирован. Имена файлов в торренте не используются для идентификации данных. Куски, которые не проверяются на наличие ошибок в файле.torrent, выбрасываются. Сверстники, которые постоянно посылают плохие куски, игнорируются другими сверстниками и в конечном итоге не смогут соединиться ни с кем в рое.
Меньший размер фрагмента означает, что торрент более устойчив, поскольку одноранговые узлы могут обменивать фрагменты быстрее, но это также означает, что в списке должно быть больше хэшей фрагментов в файле.torrent, и поэтому файл.torrent может быть большим.
Если вы публикуете что-то через BitTorrent, лучше всего заполнить файл, если вы хотите сделать его доступным. Другие коллеги будут помогать вам, так как большинство программного обеспечения BitTorrent реализует алгоритмы, которые предпочитают пытаться распределить вещи среди максимально возможного числа пиров, чтобы максимизировать параллельные соединения. Таким образом, BitTorrent может помочь вам опубликовать вещи и сэкономить расходы на пропускную способность.
Хорошая статья на эту тему здесь
http://davidhales.name/posters/patarin-hales-delis-poster6.pdf(Примечание на самом деле .pdf
файл и может быть просмотрен с помощью Acrobat Reader.)
Вот файл изображения, который кто-то сделал из его содержимого:
На YouTube есть довольно симпатичное видео, которое объясняет это визуально с помощью картонных вырезов. Это не очень техническое объяснение, но оно отлично подходит для объяснения идеи BitTorrent людям простым и понятным способом.
Обзор протокола одноранговых сообщений.
Клиент может использовать два протокола для обмена информацией с пирами, TCP или uTP (через UDP). Эти данные соответствуют спецификации протокола bittorrent, сообщения однорангового узла.
Таким образом, программно должно быть установлено соединение между двумя клиентами. После того, как соединение установлено (через TCP или uTP), клиент инициирует битрент-квитирование, которое получило информацию удаленного узла (ip&port) с трекера или через DHT. Это рукопожатие содержит info_hash, который идентифицирует торрент, о котором будет происходить соединение.
Давайте сначала посмотрим, как данные Torrent усекаются по протоколу. Часть - это часть данных, которыми вы делитесь через сеть. Не путать с блоком, который является частью куска, завернутого в пакет. Блок - это гранулярность для совместного использования фрагмента через пакеты, а блок - это гранулярность для совместного использования Torrent через одноранговые узлы.
Когда соединение начинается, оба клиента (локальный клиент, который я назову LC, и удаленный клиент, RC) блокируются и не заинтересованы. Choked означает "Я не буду отвечать ни на одно из ваших сообщений, слишком занят, но я мог бы принять их во внимание". Unchocked поэтому означает "я отвечу на ваши сообщения". Заинтересованный означает, конечно, что я хотел бы некоторые кусочки у вас есть Следовательно, состояние соединения между двумя одноранговыми узлами может быть определено с помощью этих четырех состояний: LC_chocked?, LC_interested?, RC_chocked?, RC_interested? Чтобы предупредить RC, что я (не) заблокирован или (не) заинтересован, я должен отправить ему (не) заинтересованные и (не) заблокированные сообщения, и взаимно.
Чтобы сообщить друг другу, какие фрагменты у них есть, они могут отправить сообщение битового поля сразу после рукопожатия. Как следует из названия, это битовая строка, где каждый бит установлен в 1
если у клиента есть этот специфический кусок, 0
иначе.
Таким образом, если LC заблокирован и заинтересован, а RC разблокировал его, тогда он может отправить сообщения с запросом, чтобы запросить блок, принадлежащий одному фрагменту, который, как он знает, LC имеет благодаря сообщению битового поля.
Когда одноранговый узел получил всю часть, он может отправить сообщение части, чтобы проинформировать всех своих удаленных одноранговых узлов, чтобы они обновили связанное битовое поле, которое они содержат.
Это очень простой обзор, и, конечно, здесь не все подробности предоставлены, например, алгоритм удушения и т. Д. Если вы хотите больше подробностей, проверьте две ссылки, которые я опубликовал выше, в разделе комментариев (как новый пользователь, я могу не более двух ссылок в сообщении).