Разделение файлов для приложения P2P

Мне нужно реализовать систему промежуточного программного обеспечения для совместного использования файлов, и он должен разделить файлы, аналогично тому, что происходит на bittorrent, где он отправляет и получает отдельные части одновременно из различных источников. Как я могу это сделать? Это библиотека или я должен сам реализовать разделение файлов?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
387
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Разделите файлы на блоки, скажем, по 100 КБ каждый. Затем вычислите хэш SHA (или какой-либо другой алгоритм хеширования) для каждого из блоков. поэтому, если размер файла составляет 905 КБ, у вас будет рассчитано 10 таких хэшей.

Сервер будет содержать файл определения хэша для каждого файла, который он обслуживает. Этот файл определения хэша будет содержать список всех блоков файла вместе с хешем. Итак, если сервер обслуживает наш файл размером 905 КБ с именем test.exe. Затем у нас будет другой файл с именем test.exe.hashes, который содержит список 10 хэшей файла.

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

Вам не нужно физически разделять файл, разделение файла - это просто чтение той его части, которая вас интересует. Первый блок файла находится в диапазоне байтов от 0 до 102399, следующий блок - от 102400 до 204800, и так далее. Так что просто откройте файл, найдите эту позицию, прочтите данные и закройте файл.

Посмотрите на реализацию Split и Concat (программное обеспечение GNU).

Возможно, вы захотите рассмотреть возможность использования кодировки Соломона-Рида. Это значительно упростит получение последних блоков. Это путь, по которому Microsoft пошла в Avalaunch.

Из интереса: почему бы просто не реализовать BitTorrent или что-то в этом роде? Существует много клиентов с открытым исходным кодом (например, Azureus), а протокол - действительно просто. Также есть статья с более подробной информацией, но он содержит некоторые расширения - сомнительно, официальная спецификация всегда верна.

Другие вопросы по теме