7

Мне любопытно, как скорость загрузки определяется в торрент-сети, поскольку нет центральных концентраторов. Если есть 300 сеялок, почему клиент не может просто подключиться ко всем этим 300 и ничего не посеять? Это встроено в клиента (в чем я сильно сомневаюсь). Как все это работает?

PS: я не уверен, что это правильное место, чтобы спросить, но это, конечно, не принадлежит переполнению стека. Также я не хочу знать, как торрент-загрузка может быть сделана быстрее. Я хочу знать, как они работают.

1 ответ1

8

Bittorrent на самом деле не совсем "бесполезен" - не для передачи данных, а для однорангового обнаружения. Первоначально торренты могли зависеть только от центрального концентратора, называемого трекером, - опять же, не для обмена частями файла, а для того, чтобы узнать, кто еще находится в рое. (Я считаю, что вы можете указать несколько трекеров в протоколе для резервирования.) С введением DHT одноранговый битторрент может использовать DHT для поиска других одноранговых узлов, в дополнение или вместо использования трекера. Сам DHT зависит от предвидения нескольких хорошо известных "узлов" DHT (неуверенных в точной терминологии), чтобы "загрузить" пира, который никогда не запрашивал DHT или какое-то время.

Клиент свободен устанавливать соединение с каждым равноправным узлом, о котором он знает, одновременно и чаще всего - за исключением рассмотрения любых настроек "предела подключения", которые поддерживает программа.

Из официальной спецификации Bittorrent:

Соединения содержат два бита состояния на каждом конце: засорены или нет, и заинтересованы или нет. Удушение - это уведомление о том, что никакие данные не будут отправлены, пока не произойдет снятие блокировки. Причины и общие методы удушья объясняются далее в этом документе.

Передача данных происходит всякий раз, когда одна сторона заинтересована, а другая не задыхается. Состояние интереса должно постоянно обновляться - всякий раз, когда у загрузчика нет чего-то, что он в настоящее время запрашивает у равноправного участника в unchoked, он должен выражать отсутствие интереса, несмотря на то, что задыхается Реализовать это правильно сложно, но позволяет загрузчикам узнать, какие одноранговые узлы начнут загрузку немедленно, если они не зафиксированы.

Соединения начинаются захлебываться и не интересуются.

Когда данные передаются, загрузчики должны держать в очереди несколько запросов одновременно, чтобы получить хорошую производительность TCP (это называется конвейерной обработкой). С другой стороны, запросы, которые не могут быть немедленно записаны в буфер TCP, должны помещаться в очередь в памяти, а не храниться в сетевом буфере уровня приложения, поэтому все они могут быть выброшены при возникновении засорения.

Таким образом, для получения данных от однорангового узла одноранговый узел должен быть "заинтересован", а вас должны "не задушить" - согласно протоколу. Далее:

Удушье делается по нескольким причинам. Контроль перегрузки TCP ведет себя очень плохо при одновременной отправке нескольких соединений. Кроме того, удушение позволяет каждому пиру использовать алгоритм «один за один», чтобы обеспечить постоянную скорость загрузки.

Алгоритм подавления, описанный ниже, является развернутым в настоящее время. Очень важно, чтобы все новые алгоритмы хорошо работали как в сети, состоящей исключительно из самих себя, так и в сети, состоящей в основном из этого.

Есть несколько критериев, которым должен соответствовать хороший алгоритм удушья. Это должно ограничить количество одновременных загрузок для хорошей производительности TCP. Следует избегать быстрого удушья и расцепления, известного как «фибрилляция». Он должен отвечать взаимностью пэрам, которые позволяют его загружать. Наконец, ему следует время от времени проверять неиспользуемые соединения, чтобы выяснить, могут ли они быть лучше, чем используемые в настоящее время соединения, известные как оптимистическое отключение.

Используемый в настоящее время алгоритм удушения позволяет избежать фибрилляции, изменяя только удушье каждые 10 секунд. Он выполняет взаимную компенсацию и ограничивает количество загрузок, снимая флажок с четырех пиров, у которых он имеет лучшие скорости загрузки и которые заинтересованы. Сверстники, которые имеют более высокую скорость загрузки, но не заинтересованы, становятся непокрытыми, и, если им это интересно, худший загрузчик удушается. Если загрузчик имеет полный файл, он использует свою скорость загрузки, а не скорость загрузки, чтобы решить, кто отключить.

Для оптимистического снятия блокировки в любой момент времени существует один равноправный узел, который не привязан независимо от скорости загрузки (если это интересно, он считается одним из четырех разрешенных загрузчиков). Какой из пиров оптимистически не закреплен, вращается каждые 30 секунд. Чтобы дать им приличный шанс получить полный кусок для загрузки, новые подключения будут в три раза чаще запускаться, чем текущий оптимистический отклик, чем где-либо еще в ротации.

Таким образом, большинство партнеров Bittorrent реализуют алгоритмы "удушения", которые гарантируют, что все работает справедливо, но при этом получают новые предпочтения при подключении, чтобы дать им шанс стать хорошей частью роя. Один узел мог попытаться использовать другой алгоритм, который был бы более несправедливым, но без немедленного сотрудничества со всеми остальными узлами "плохой" узел просто "задохнулся бы", пока не получил данные от кого-либо.

Больше пиров = больше скорости, и более быстрые пэры предпочтительнее. Объем загрузки однорангового узла, любые установленные вами ограничения на загрузку и объем загрузки / выгрузки физической ссылки также влияют на скорость.

Я (и другие) подробно рассказал о том, как Bittorrent работает над этим вопросом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .