Как перейти к передаче хэша для проверки целостности файла? - PullRequest
1 голос
/ 03 мая 2011

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

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

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

Есть идеи?

На всякий случай имеет значение, что сервер использует C #, а клиент является устройством Android (JAVA).

Спасибо

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

TCP / IP выполняет проверку целостности самостоятельно;тебе не нужноЦелостность каждого пакета данных обеспечивается с помощью CRC, а протокол TCP проверяет потерянные пакеты и запрашивает повторную отправку.Поэтому, пока ваш сервер генерирует заголовок Content-Length, вы можете быть уверены, что неправильная передача обнаружена, и клиент выдаст ошибки.

Тем не менее, хорошим местом для хэша файла будет специальный заголовок HTTP.Поставьте перед его именем префикс «X-», чтобы он не конфликтовал с существующими или будущими стандартными заголовками.

2 голосов
/ 03 мая 2011

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

Теперь вы можете проверить, что этот вектор хэшей передан правильно, проверив сам хэш. Если он не проходит, повторно запросите хеш-вектор.

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

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

Этот подход будет работать независимо от того, работаете ли вы над проверенным протоколом, таким как TCP / IP, или с ненадежным протоколом, таким как UDP. Сжатие данных, если вы этого еще не сделали, также будет значительным улучшением.

Единственный недостаток - это, очевидно, намного больше работы.

...