«Сайт не распространяет и не хранит электронные версии произведений, а лишь предоставляет доступ к списку хеш-сумм» - загадочную фразу читал с экрана монитора популярного сайта мой знакомый, чью книгу спиратили и выложили на популярном торрент-сайте, пока я объяснял ему, что нет никакого подвоха...
А что такое эти самые хэш-суммы? Предположим, вы — робот (т. е. компьютер), и ваша скорость чтения — более 50 мегабайт в секунду (обычное дело), то есть, почти любую книгу вы можете прочитать менее чем за 1 секунду, так текстовая информация занимает минимальный объем памяти, а затраты на механику чтения мы не учитываем.
Предположим, что вы занимаетесь оцифровкой большой библиотеки, в которой тысячи книг, и вам нужно все книжки после «оцифровки» отправить в другое место по сети. Разумеется, многие книжки в библиотеке не уникальны и уже есть там, куда вам нужно все отправить. А значит отправлять каждую оцифрованную книгу нелогично, и нужно найти способ как-то различать их.
Так как существуют различные издания у одной и той же книги, или, если книга рукописная, может быть написана с ошибками, нельзя различать книги по названию или по общему количеству символов, это ненадежно, и теоретически важный экземпляр книги может быть упущен. Поэтому книги нужно различать непосредственно по их содержиму, нужно каким-то образом снизить затраты на сравнение разных книг и построении выводов об их «одинаковости».
Для этого один ученый, работавший в IBM в 1953 году ввел в оборот термин «хэша» (hash), за чем в последствии стали иметь ввиду функцию, которая приводит данные незаданного размера к значению фиксированной длины. Проще говоря, хэшем называют функцию, которая может преобразовать книгу с содержимым любого размера в некоторую последовательность символов заданной длины, которая подходит на роль указателя. Например, результатом хэша может быть строка из 20 байтов, как функция SHA-1, используемая в BitTorrent. Используя такие строки как «указатели» в базе данных, можно однозначно сравнить любые две книги и сделать вывод о том, что они одинаковые, без сравнения их названия или содержания (которое может быть любого размера).
Конечно, для очень больших книг, скажем, более 10 МБ, хэши начнут повторятся, поэтому структуру базы данных придется изменить. Мы будем разбивать каждую книгу на фрагменты по 10 мегабайт и назовем их частями. Для каждой части мы будет создавать свой хэш и формировать список хэшей частей. В качестве указателя на каждую уникальную книгу мы будем использовать уже список хэш-сумм, вместо одной общей. Для книги размером 5 МБ будет всего 1 часть и один хэш в списке, для книги размером 83 мегабайта указатель будет списком из 9 хэш-сумм.
Так как мы роботы, и наши вычислительные мощности превосходят человеческие, мы можем сравнивать эти самые списки хэш-сумм очень быстро. За то же время, за которое человек отличает две надписи из 4 букв, мы можем сравнить два списка из тысяч хэш-сумм.
После оцифровки каждой книги в нашей библиотеке, мы буем высылать список её хэш-сумм (хэшей для всех её частей) на сервер нашей базы данных. Там нам будут давать ответ, существует ли такая книга, или нет. Сервер базы данных будет считывать индекс для каждой книги, что у него имеется, и сравнивать с присланным списком хэш-сумм. Если встречается список, идентичный присланному, значит книга уже существует в базе данных, и её не нужно повторно сохранять.
В другом случае, робот-оцифровщик высылает полное содержимое книги по частям. Так как межгалактический интернет очень нестабильный, он прерывается, и иногда книга может быть передана частично. Тогда при повторном соединении отправляются только «потерявшиеся» части, или искаженные, так как для каждой части на обоих сторонах известен хэш, и он обязательно должен быть одинаковым, иначе содержимое необходимо отправить заново. Когда сервер получил нашу книгу, он сохраняет её где-то в своих недрах, добавляя в базу данных запись ограниченой длины: «указатель» (список хэш-сумм частей книги) и адрес, куда реально книга была сохранена, что бы её позже можно было обнаружить, по хэш-суммам).
Так у нас появился идеальный робот, который может оцифровывать тысячи библиотек по всему миру, и присылать нам только уникальные версии произведений, которые мы будем складировать и различать по достаточно коротким указателям. Б-г (программист базы данных) может сообщить своим друзьям-роботам: «эй, прочитайте книгу Х!» - и в качестве Х передать список хэш сумм. Каждый проверит в своей собственной памяти, и кто-то скажет «знаешь, я уже прочитал Х!». А кто то - «Ой, а передай мне пожалуйста копию Х!».
----------
В реальном мире все еще намного сложнее и запутанее, ведь речь идет о любых файлах, любых размеров. Однако принципы разбивки на части и хэш-суммы тот же. «Базой данных» из художественного примера выше в BitTorrent является торрент-трекер. Так называется веб-сайт, который предоставляет возможность скачать списки хэш-сумм для произведений, которые хотят получить его пользователи. Например, Вася скачивает .torrent файл «Игра престолов все серии» с трекера. Этот файл будет очень небольшой и его загрузка едва ли займет секунду времени, ведь мы помним, что она содержит всего лишь список хэшей для честей. Независимо от размера каждой части хэши всегда 20 байтов в длину, что даже меньше, чем четвертишье стихотворения Маяковского. Но тем не менее, торрент будет состоять из сотен или тысяч частей, так как любые фильмы и кино (мультимедиа файлы) — это большие объемы данных.
После этого Вася включает спициальную программу, которая умеет работать с такими .torrent-файлами (например, свободная кросс-платформенная программа Transmission). Вы наверняка осведомлены о том, что Torrent-клиент (так называются эти программы), скачивают файлы напрямую с компьютеров других пользователей, которые уже ранее скачали файлы. Значит, кто-то когда-то скачал этот файл впервые, откуда? Все просто — файл был скачан впервые у того, кто создал и опубликовал торрент-файл на трекере, а первый скачавший получил свою копию первым, а затем, он стал «сидом» (seed — англ. Сеять), то есть он из «качающего» стал «раздающем», и теперь к нему можно обращаться с самым главным вопросом: «Эй, привет, можешь поделиться частью 43 файла 332 торрента Х? Жду передачи».
Торрент-клиент, с помощью которого части раздаются и скачиваются между «пирами» (peer— участник обменной сети), получатет информацию о том, у кого сколько процентов торрента скачано от торрент-трекера. То есть файл .torrent содержит не только список частей и их хэш-суммы, он так же содержит список трекеров, к которым можно обратиться за списком «сидирующих» (раздающих) этот торрент. На практике, существует технология DHT, которая в определенных обменных сетях позволяет сделать процесс обмена списком пиров в конкретной сети очень быстрым. В то время как в глобальной сети, отключив трекер, торрент очень скоро прекратит свое существование, ведь новые и старые пиры уже не смогут найти друг друга.. Поэтому называть BitTorrent децентрализованным протоколом файлового обмена не совсем корректно.
Поэтому в мире BitTorrent существуют абсолютно аномные трекеры, которые можно найти в интернете. Адреса этих трекеров можно смело добавлять при создании торрента. И они не требуют публикации .torrent файла. Они просто будут «помнить» членов обменной сети для каждого торрента, список хэш-сумм которого у них появится, то есть трекер действительно ПОЧТИ ничего не знает о содержимом файлов торрентов, а просто собирает и делится по запросу списком IP-адресов, когда его спрашивают, где можно скачать конкретный торрент.
Наконец, в случае с базой данных, куда оцифровщик отправлял уникальные произведения, мы говорили о так называемом «указателе», который является списком хэш-сумм. Например, список хэш сумм для 10 частей фиксированного размера составит 200 байтов (размер хэша = 20 Б). Значит, указателем является последовательность из 200 байтов. А вот для торрента из 1000 частей, указатель станет очень длинным (20000 Б), и сравнивать много таких указателей не разумно. Поэтому мы опять используем хэш — для индекса мы берем эту самую последовательность хэшей (будь то в 200 Б, или 20000 Б) и вычисляем её хэш, равный 20 Б. То есть, получается, что мы создали хэш из списка хэшей, и размер нашего указателя тоже стал фиксированным. В BitTorrent это применяется для того, что бы различить разные торренты, для каждого списка хэш-сумм, независимо от размера и количества частей, можно сделать фиксрованный хэш. Он может, к примеру, использоватьсяв качестве «указателя» на серверах торрент-трекеров, когда нужно «спросить» у кого можно скачать содержимое торрент файлов.
Торрент-файлы может создать любой желающий. Для этого необхима упомянутая программа-клиент (Transmission) и файл или папка, которую вы хотите «раздать». Вам нужно найти функцию создания торрента. Программа-клиент сама разобьет ваши файлы на части и вычислит для каждого блока хэш. В качестве списка трекеров вы можете указать вот эти (https://openbittorrent.com/), и сгенерировать торрент-файл. Отправив файл другу или друзьям, он может открыть его в аналогичной программе, совместимой с протоколом BitTorrent. При условии, что вы «встанете на раздачу», оповестив трекер, ваши товарищи смогут получить ваш IP-адрес от трекера и начать передачу напрямую.
А что по поводу скорости скачивания? Она зависит от собственной сети - или совпадает со скоростью очередного раздающего?
Я тот, кому было лень читать ответ выше,спасибо, от души прям)