Какова правильная процедура проверки ошибок при передаче файлов по HTTP? - PullRequest
0 голосов
/ 11 мая 2019

Моя цель: передать большой (~ 200 КБ) двоичный файл по HTTP в чанках и проверить с помощью некоторого типа обнаружения ошибок, что мой полученный чанк (на стороне клиента) ТОЧНО совпадает с отправленным чанком с сервера.

Итак, у меня есть двоичный файл (обновление прошивки для микроконтроллера), который я пытаюсь отправить со своего сервера (nodejs с Express) на мое устройство.Я могу успешно отправлять HTTP-запросы на строки и другие мелочи и хорошо читать ответы, но теперь я хочу отправить файл.

Этот файл имеет размер около 200 КБ, а на стороне сервера я использую fseek, чтобы разделить файл на 512 байт (это размер страницы моей встроенной флэш-памяти NAND, в которую будет записано обновление).На стороне клиента (мой микроконтроллер) я делаю запрос на получение и указываю индекс текущего чанка, на котором я работаю (например, я начинаю с ?index=0 и увеличиваю чанк на чанк примерно до ?index=400).

Для каждого полученного чанка я хотел бы подтвердить, что у меня есть те же данные, что и на сервере.Моя текущая идея состоит в том, чтобы выполнить проверку CRC на стороне клиента и сравнить ее с CRC с сервера, который будет сохранен в заголовке ответа GET.Это хороший подход?Есть ли лучший стандарт для того, что я пытаюсь достичь?

Дополнительно: Микроконтроллер использует процессор STM32, 2 МБ флэш-памяти NAND, 256 КБ SRAM.Написание моих изображений с использованием Mbed-OS 5.12

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Если вы отправляете данные через один сокет TCP, канал гарантирует, что все отправленные данные поступят на удаленный конец и будет автоматически восстанавливаться после большинства ошибок без вмешательства, используя контрольные суммы и порядковые номера.

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

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

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

0 голосов
/ 11 мая 2019

По HTTP (S) вы не можете проверять порции (если они не являются отдельными запросами) = вы можете только добавить CRC или MD5 в файл, а скрипт на стороне сервера может проверить его и отправить вам ответ, когда.

У вас есть два варианта: 1. Сен-чанки как отдельные запросы (или файлы) и проверка целостности чанка 2. Установите не HTTP-соединение и внедрите собственный протокол отправки 3. Используйте другие протоколы передачи файлов по TCP /IP

...