Отсутствующие файлы повторяют хеширование торрента

Обновлено: 03.07.2024

В последнее время много читаю о хеше с торрентов, о магнитных ссылках и т. д. Но есть вопрос, которого я не понимаю.

  • хэш файла
  • и информационный хэш торрента

Является ли infohash = хешу файла?

Если да, что, если торрент описывает 6 файлов для скачивания?

Если нет, что это означает?

нет, не совсем, есть информация, что информационный хэш — это хеш над информационной частью торрента. Но что такое информационная часть?

У меня есть хэш файла и информационный хэш торрента. Является ли информационный хэш = хэшу файла? Почему бы просто не посмотреть на них.

3 ответа 3

Итак, я наконец понял это.

Информационный хеш — это хеш SHA1 части торрент-файла, которая включает:

  1. ЭЛЕМЕНТ: длина (размер) и путь (путь с именем файла)
  2. Имя: имя для поиска
  3. Длина куска: длина (размер) одного куска.
  4. Кусочки: SHA1 Хэш КАЖДОЙ части этого торрента.
  5. Личное: пометка для ограниченного доступа

Чтобы показать это немного больше, я взял случайный торрент-файл и использовал «Редактор BEncode» от Ultima, чтобы сделать его более понятным для меня.

Редактор BEncode

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

  • Для элемента 1 с: 1069496548
  • и item2 со значением: 223
  • Это вместе: 1069496771
  • С размером куска: 524288
  • Есть 2040 штук. (1069496771/524288=2039,9032 приблизительно)
  • Секция частей включает 40800 байт данных, что составляет 81600 + 2 символа в файле.
  • +2, потому что 0x означает, что это шестнадцатеричное число.
  • Хеш SHA1 содержит 40 символов 0x или 20 байт данных, что составляет 2040 хэшей SHA1.

введите здесь описание изображения

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

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

Я хотел бы добавить еще один пример, немного более конкретный.

Начнем с одного из самых маленьких торрент-файлов, которые у меня есть:

Если мы декодируем BEncoding:

Или в псевдо-json:

InfoHash — это хэш информации

InfoHash — это хэш SHA-1 содержимого информационного словаря.

Мы хотим получить хэш SHA-1 value ключа информационного словаря:

Мы запускаем все эти байты вместе:

А затем возьмите хэш SHA-1 для создания 160-битного (20-байтового) дайджеста:

Какой ответ правильный:

введите здесь описание изображения

Вот как извлечь соответствующий сегмент данных *.torrent для информационного хэша bittorrent.

Я сделал это для примера.

Содержимое ключа «info» находится между (включительно) смещениями 0x4D и 0xA7. Итак…

Вы должны увидеть это:

Вот вывод xxd вместо shasum для большего пояснения:

Вы можете обратиться к Спецификации протокола BitTorrent за объяснением, хотя и кратким и довольно грамматически неэлегантным, относительно их номенклатуры и того, почему необходимо исключить последний 0x65.
Кратко: все данные заключены в пару US-ASCII «d» и «e»; содержимое ключа или поля «информация» также заключено в оболочку. Вам нужно все между первым 0x64 — «d», — который следует за строкой US-ASCII 4:info, и конечным 0x65 — «e», — который связан с вышеупомянутым 0x64.


Я разместил это в r/torrents, и мне предложили зарегистрироваться здесь. Ниже приведена копия исходного сообщения (с небольшими изменениями):

Надеюсь, кто-то может помочь с этой (вероятно) очень простой проблемой. Я искал везде и не нашел точного ответа на свой конкретный вопрос.

После завершения загрузки я предпочитаю сохранять копию файла .torrent на случай, если он когда-нибудь понадобится в будущем. При загрузке файла .torrent напрямую (а не при открытии загрузки в клиенте с помощью магнитной ссылки) я получаю 2 файла .torrent: первый — это файл, который я скачал с любого веб-сайта, на котором я нашел торрент, а второй файл, созданный клиентом автоматически (например, C:\Users\\AppData\Local\qBittorrent).

Из любопытства я решил сравнить хэш одного из моих торрент-файлов с его «дубликатом». Оригинал .torrent генерирует одно значение SHA1, а файл, сгенерированный qBittorrent, генерирует другое значение SHA1. С тех пор я проверил несколько других файлов с теми же результатами. Файлы .torrent, созданные qBittorrent, кажутся на 28 байт больше, чем исходные файлы .torrent по всем направлениям, поэтому кажется, что что-то добавляется или изменяется каждый раз, когда я загружаю «оригинальный» .torrent-файл.

Я проверил это поведение с несколькими файлами .torrent с помощью uTorrent. Все файлы, сгенерированные после загрузки «оригинального» файла .torrent, имеют тот же SHA1, что и исходный файл .torrent, так что это, по-видимому, характерно для qBittorrent.

Сравнение информации о недавно добавленных торрентах в qBittorrent и uTorrent показывает, что хэш торрента, количество и размер фрагментов совпадают.

Чтобы быть особенно осторожным, я попытался удалить торрент из uTorrent, включая созданный файл .torrent. Если я перезагружу торрент, используя файл .torrent из qBittorrent (расположенный в C:\Users\\AppData\Local\qBittorrent), uTorrent в конечном итоге создаст .torrent, который теперь имеет ту же контрольную сумму SHA1, что и файл, сгенерированный qBittorrent. Хэш торрента, размер файла и количество фрагментов в обоих клиентах по-прежнему показывают полное совпадение.

Что-то добавляется в этот файл при загрузке в клиенте, что вызывает несоответствие? Если так, то, что это? И если бы я сохранил файл .torrent, имеет ли значение, какой файл я сохраняю? Я просто хочу быть уверенным, что это "несоответствие" не вызовет проблем, если мне понадобится снова загрузить файлы в будущем.

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

Какое ожидаемое поведение

Capture

Это происходит без начального режима ^, что является ожидаемым поведением.

Этапы воспроизведения

Добавьте торрент в начальном режиме (у вас уже должны быть файлы, чтобы начальный режим работал) и выйдите из qBt.
Удалить/переместить/переименовать файлы.
Перезапустите клиент.
Торрент приостановлен из-за ошибки отсутствия файлов.
Но в списке трансферов нет никаких признаков ошибки. Таким образом, состояние торрента с отсутствующими файлами вообще не было зарегистрировано.
Если возобновить торрент, вместо перепроверки начнется раздача! Потому что состояние отсутствующих файлов не было зарегистрировано!

Capture2

Это происходит в исходном режиме ^

Дополнительная информация (если есть)

Журналы:
23.06.2020, 9:55 — Несоответствие размеров файлов для торрента 'xyz', воспроизведение приостановлено.

Это сообщение одинаково в обоих случаях. Значение fastresume_rejected_alert было сгенерировано для обоих.

Текст был успешно обновлен, но возникли следующие ошибки:

Ghost прокомментировал 23 июня 2020 г.

Не удается воспроизвести в Ubuntu 18.04. Но я подожду, пока кто-нибудь действительно проверит Windows, прежде чем присвоить ярлык «Невозможно воспроизвести», так как это может быть специфично для Windows.

Вы добавили торрент в режиме заполнения (пропустить хэш), когда у вас действительно были файлы на диске? Это важно.

Франциско Помбал прокомментировал 23 июня 2020 г. •

Вы добавили торрент в режиме раздачи (пропустить хэш), когда у вас действительно были файлы на диске? Это важно.

Хотя под "режимом раздачи" вы просто имели в виду "добавить уже завершенный торрент для раздачи" (как, например, при перекрестном раздаче), поскольку в qBittorrent такой опции нет. Действительно, при использовании опции «пропустить проверку хэша» я могу воспроизвести это, так что это не проблема, специфичная для Windows. Пожалуйста, отредактируйте ОП соответствующим образом.

FranciscoPombal изменил название. Торренты, добавленные в исходном режиме, никогда не регистрируют состояние отсутствующих файлов при запуске 23 июня 2020 г.

Проблема, подтвержденная командой проекта, считается ошибкой

Ghost прокомментировал 26 июня 2020 г. •

Я подозреваю, что libtorrent, сообщающий о завершении торрента, каким-то образом обходит состояние отсутствующих файлов?
Должен ли @arvidn торренты, добавленные с флагом начального режима, сообщать о завершении, даже если быстрое возобновление будет отклонено из-за отсутствия файлов?

arvidn прокомментировал 26 июня 2020 г.

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

arvidn прокомментировал 26 июня 2020 г.

@an0n666 не могли бы вы подать жалобу на libtorrent? в идеале с максимально возможным количеством деталей.

Ghost прокомментировал 26 июня 2020 г.

@an0n666 не могли бы вы подать жалобу на libtorrent? в идеале с максимально возможным количеством деталей.

Франциско Помбал прокомментировал 26 июня 2020 г.

А, теперь я вижу - функция "пропустить проверку хеша" реализована с использованием флага seed_mode libtorrent (из torrent_flags_t ). Извините за недоразумение.

Ghost прокомментировал 1 июля 2020 г.

Проблема сохраняется в трекере libtorrent.

Франциско Помбал прокомментировал 1 июля 2020 г.

Проблема сохраняется в трекере libtorrent.

arvidn прокомментировал 2 июля 2020 г.

было бы неплохо, если бы кто-нибудь подтвердил, что этот патч устраняет проблему в qbt.

Учитывая, что этот тикет закрыт, означает ли это, что на стороне qbt, скорее всего, ничего нельзя сделать?

glassez прокомментировал 2 июля 2020 г.

Учитывая, что этот тикет закрыт, означает ли это, что на стороне qbt, вероятно, ничего нельзя сделать?

Проблемы могут возникнуть с обеих сторон. Итак, давайте сначала проясним, как на самом деле должен работать режим seed_mode (было бы нехорошо, если бы одно неопределенное/неожиданное поведение было исправлено путем добавления вместо него другого).
Насколько мне известно, torrent_finished_alert публикуется каждый раз, когда торрент переходит из любого «незавершенного» состояния (какое-то состояние проверки или загрузки) в любое «завершенное» состояние (завершенное или начальное). Это удобоваримое поведение на этом уровне, поэтому мы можем реализовать высокоуровневую абстракцию поверх него. Крайним случаем является добавление торрента в seed_mode (по крайней мере, как seed_mode взаимодействует с так называемыми «данными возобновления»). IIRC, когда торрент добавляется с флагом seed_mode, он просто пропускает любую проверку и слепо верит, что все его файлы существуют. Но на самом деле он различает эти непроверенные фрагменты и те, которые были затронуты и проверены в процессе раздачи, не так ли? Когда такой торрент сохраняет «данные возобновления», он содержит информацию о проверенных и непроверенных фрагментах, и когда мы восстанавливаем этот торрент, его «данные возобновления» отличаются от тех, которые мы добавляем в первый раз. Или я ошибаюсь?

arvidn прокомментировал 2 июля 2020 г.

Насколько мне известно, torrent_finished_alert публикуется каждый раз, когда торрент переходит из любого "незавершенного" состояния (какое-то состояние проверки или загрузки) в любое "завершенное" состояние (завершенное или начальное).

Звучит правильно. Следует иметь в виду, что завершенный торрент не обязательно является начальным. Торрент считается завершенным, когда все файлы с ненулевым приоритетом завершили загрузку.

Поэтому, просто взглянув на несколько строк, окружающих m_hasMissingFiles = false в этом патче, не кажется безопасным предположение, что никакие файлы не пропали только потому, что торрент закончился. Если это был заполнение, то; да.

IIRC, когда торрент добавляется с флагом seed_mode, он просто пропускает любые проверки и слепо верит, что все его файлы существуют.

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

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

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

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

У меня есть один торрент с файлами, которые мне очень нужны, но он мертв уже много месяцев. Теперь, к счастью, у меня есть прямые ссылки для скачивания всех файлов. Проблема в том, что размер торрента составляет много ГБ, и он был завершен почти на 75%, прежде чем он умер. Я не могу тратить так много данных, так как у меня есть ограничение на загрузку, а доступ в Интернет здесь очень дорогой.

Есть ли способ продолжить загрузку всех торрент-файлов, используя прямые ссылки для скачивания? Я пытался использовать fdm и jdownloader, но, насколько я могу судить, оба не поддерживают это.

-1, i = I, becoz = потому что. У вас тоже нет абзацев. Это затрудняет чтение вашего вопроса. Обновите свой вопрос и исправьте его (вы можете его отредактировать), и я удалю свой -1 :) Помните, отрицательные голоса не являются личными, это способ человека сказать, что ваш вопрос нуждается в улучшении

@Priyanka: Думаю, это тоже не сработает. Попробуйте повторно объявить торрент-файл и получить любой новый трекер и продолжить загрузку.

4 ответа 4

Теоретически это должно быть возможно, но на практике, кажется, нет простого способа добиться этого (по крайней мере, я не знаю).

Проще говоря, проблема возникает из-за того, что торрент-клиенты одновременно скачивают разные кусочки каждого файла и "сшивают" их вместе в нужном порядке на диске. Таким образом, даже если у вас может быть 75% файла, это не означает, что это непрерывный 75%-й блок данных с начала файла. Отсутствующие части (то есть те, которые еще не загружены) представляют собой нулевые байты, которые постепенно заполняются клиентом по мере завершения каждой части.

1


Источник

Теперь вы можете задаться вопросом: если менеджеры загрузки могут (одновременно) загружать части файла и возобновлять загрузку так же, как это могут делать торрент-клиенты, почему прежние не могут также возобновлять прерванные торрент-загрузки? Как я сказал в начале, теоретически они могут, но есть различные проблемы. Торрент-клиенты используют файлы .torrent, в которых хранится информация о каждом файле, включая имена и размеры файлов. Что еще более важно, размер фрагмента известен, а хэш SHA-1 (что-то вроде уникального цифрового «отпечатка пальца») каждого фрагмента, а также информационный хэш информационного словаря в целом включен в файл .torrent. Таким образом, даже если торрент-клиент используется для возобновления прерванной загрузки торрента, с которым он ранее никогда не сталкивался, он может сравнить ожидаемые хэши каждой части с фактическими хэшами данных на диске, чтобы выяснить, какие части не прошли проверку хэша и таким образом, необходимо повторно загрузить.

† Самое близкое, с чем я столкнулся в любом менеджере загрузок, это функция GetRight Восстановить потерянные загрузки. Однако это работает только с файлами, которые были загружены последовательно с самого начала, и, кроме того, размер на диске должен отражать фактическое количество загруженных байтов, а не общий размер файла. Таким образом, если у вас есть прерванная загрузка, когда размер файла на диске составляет, скажем, 15 000 байт, а сервер сообщает, что Content-Length для ресурса составляет 100 000 байт, тогда все, что GetRight делает, это отправляет Range запрос байтов от 15 001 до 100 000. (На самом деле он «откатывается» на 4 КБ (значение по умолчанию, настраивается пользователем), чтобы подтвердить, что данные не были повреждены в конце, когда загрузка файла была прервана, но это второстепенная деталь реализации.) Очевидно, что, учитывая то, как она работает, эта функция не может помочь. вы возобновляете прерванную загрузку торрента.

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

Какой смысл использовать хэш файла на странице загрузки

Хеш-значение и контрольная сумма

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

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

Генерация контрольной суммы: когда файл загружается на сервер (или до того, как он начнет раздаваться, в случае торрентов), используется алгоритм хеширования (например, MD5 или SHA) для создания соответствующего хеш-значения для файл. Это значение сохраняется для последующей проверки.

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

Примечание. При создании контрольных сумм следует применять надежный алгоритм. Если, например, простой алгоритм делит конкретное значение на 11 (простое число) и получает остаток в качестве окончательной контрольной суммы, единственными возможными сгенерированными значениями будут числа от 0 до 10. В этом случае существует 9%-ная вероятность того, что поврежденный файл (в результате потери данных) сгенерирует то же значение, что и контрольная сумма. Поэтому рекомендуется, чтобы сгенерированная контрольная сумма была достаточно большой.

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

Есть несколько бесплатных программ, которые могут вычислять контрольные суммы хэшей и позволяют проверять загрузку файлов. HashGenerator — это генератор хэшей файлов, который генерирует хэши одновременно по разным алгоритмам (включая SHA1, SHA256, MD5 и т. д.). Загрузите его отсюда и распакуйте программу.

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

Читайте также: