реклама на сайте
подробности

 
 
> FTP сервер на STM-ке, подход к верификации данных
Danis
сообщение Nov 19 2014, 15:50
Сообщение #1


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Привет, коллеги!
Недавно поднял на STM32Fxx FTP сервер и удаленно через Internet пишу файлы во внешнюю flash память. Все неплохо работает, есть вопрос с подходом к верификации данных в принятых файлах. Я использую ftp passive mode, и по сути, аппаратно верифицируются только пакеты пришедшие с Ethernet, можно конечно и проверить пакет после записи на SD. Но этого не достаточно для полного убеждения о целостности файла. Я тут вижу два пути, сначала записать удаленно файл, и скачать обратно, сравнить их Hash (долго, если файл большой). Второй, научить STM-ку считать Hаsh уже записанных файлов по команде (возможно не стандартной) FTP и создавать *.txt файл с Hаsh суммами файлов в текущей директории. После чего можно скачать этот файл и проверить. Но наверняка, есть более красивый и правильный подход, которого я не знаю, так что буду рад подсказке, спасибо!


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
WitFed
сообщение Nov 20 2014, 10:11
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701



Про TCP я читал очень давно, как там дополнительно контролируется содержимое внутри уже проверенного внешним CRC32 пакета, но CRC32 вполне себе очень доверятельная вещь !
По инету всё им проверяется на вшивость, мужики очень умные придумывали. И просто, и надёжно.
Там на каждый единичный бит в исходном файле к 4-байтному результату XOR-ится уникальное 32-битное число, и если бит/байт или их группа рядом где-то испортится, как обычно бывает в импульсных глюках, то проксорится уже другая цепочка, и вероятность получить тот же код невероятно мала. Для получения той же CRC32 для других данных нужен очень мощный перебор.
Происходит вычурная однозначная трансляция из всего множества файлов разных длин в множество 32-битных чисел, которая, естественно, может несколько файлов отобразить в одно и то же число, но на практике это не бывает, особенно если несколько байт изменено, а остальные прежние.
Вообще, я считаю, что нужно сначала ошибку увидеть, а потом её начинать бояться, солому стелить как-то... Флэшь тоже может сбоить -- вот там нужны CRC32 в каталоге для каждого файла или даже у каждого сектора, как раньше было у HDD.
А у провайдера кэш глючил на прокси (ОЗУ/винт SSD), скорей всего -- они файл получили, куда-то сохранили, потом считали побитый, на пакеты порезали, новой CRC32 закрыли -- и передали, типа "усё хоккей".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 20 2014, 10:21
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(WitFed @ Nov 20 2014, 16:11) *
Про TCP я читал очень давно, как там дополнительно контролируется содержимое внутри уже проверенного внешним CRC32 пакета, но CRC32 вполне себе очень доверятельная вещь !

Ещё раз внимательно читаем по слогам: в TCP-кадрах нет CRC32-контроля.
Вот расчёт контрольной суммы для TCP-кадра из рабочего TCP-стека:
CODE
static s32 CalcCsum(void const *start, int cnt, s32 sum)
{
u16 const *p = (u16 const *)start;
while ((cnt -= 2) >= 0) sum += *p++; //sum words
if (!(cnt + 1)) sum += *(u8 *)p; //add left-over byte, if any
while ((u32)(sum = (sum & 0xFFFF) + ((u32)sum >> 16)) >> 16); //fold 32-bit sum to 16 bits
return ~sum;
}

Покажите мне - где здесь CRC32????
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Nov 20 2014, 12:12
Сообщение #4


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(jcxz @ Nov 20 2014, 13:21) *
...где здесь CRC32????


Вам шашечки или ехать?
От противного =>
Вы утверждаете, что контрольая сумма даёт сбои при конкретной реализации и посему TCP не надёжен в плане сетевой передачи?

Если нет - тогда не понятен изначальный посыл. Если да, то собственно это немного противоречит мировой практики, несколько тонн кода и
фиг знает сколько часов работы...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 20 2014, 16:45
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(kolobok0 @ Nov 20 2014, 18:12) *
Вы утверждаете, что контрольая сумма даёт сбои при конкретной реализации и посему TCP не надёжен в плане сетевой передачи?

Пропускают ошибки любые методы контроля. Вопрос в вероятности. А по этому критерию CRC32 несравнимо лучше обычной суммы.
И если поддаться паранойе, то можно не ограничиваться 32 разрядами. Есть полиномы и на большие разрядности.

Цитата(Сергей Борщ @ Nov 20 2014, 19:12) *
Хорошо, в TCP простая сумма. Но этот TCP идет поверх Ethernet, в котором как раз таки CRC-32.

А где ТС пишет, что клиент и сервер находятся в одной Ethernet-сети?
Он вроде про Интернет пишет. А значит - на пути следования пакета могут быть различные физические+канальные среды передачи.
Плюс - переход пакета из одного сегмента сети в другой, через кучу маршрутизаторов.
Не здесь-ли и возникают сбои, приводящие к ошибкам в принятых по FTP файлах?

А ещё - как я понимаю для Ethernet обязательно только формирование кадров с CRC, но не обязателен контроль этой CRC на приёмной стороне.

Цитата(Golikov A. @ Nov 20 2014, 18:26) *
Такая контрольная сумма весьма не дурна, но не гениальна. Она не замечает перестановку слов, и двойную ошибку одного бита. Учитывая сетевой протокол, избыточное кодирование и прочее она годиться для ТСР (вот теперь сижу вспоминаю а есть ли там избыточное кодированиеsm.gif), и дает единицы ошибок в год, но CRC32 в разы надежнее...

Я бы сказал - не в разы, а на порядки. Учитывая кол-во разрядов в контрольной сумме TCP и в CRC32. Уж не говоря о том что даже CRC16 будет надёжнее обычной суммы.
Кодирование - это функция вроде канального или физического уровня протокола (в частности - Ethernet-уровня или какой там канальный/физический уровень в данном сегменте). А TCP - это более высокий уровень OSI.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Danis   FTP сервер на STM-ке   Nov 19 2014, 15:50
- - jcxz   CRC32 вполне достаточно в этом случае.   Nov 19 2014, 16:15
- - scifi   Ну да, если файл передаётся через интернет, то кон...   Nov 19 2014, 16:23
|- - Danis   Цитата(scifi @ Nov 19 2014, 19:23) Ну да,...   Nov 19 2014, 17:14
- - AlexandrY   Цитата(Danis @ Nov 19 2014, 17:50) Но это...   Nov 19 2014, 17:48
- - Golikov A.   ЦитатаВот смысла закачки файла с контрольной суммо...   Nov 19 2014, 20:46
|- - Aleksandr Baranov   Цитата(Golikov A. @ Nov 19 2014, 16:46) в...   Nov 19 2014, 21:10
|- - jcxz   Цитата(Golikov A. @ Nov 20 2014, 02:46) Н...   Nov 20 2014, 02:59
- - Golikov A.   ЦитатаА почему нельзя хитрую контрольную сумму пом...   Nov 20 2014, 05:54
|- - jcxz   Цитата(Golikov A. @ Nov 20 2014, 11:54) к...   Nov 20 2014, 07:35
- - Golikov A.   я может ошибаюсь, но вроде бы для распаковки предо...   Nov 20 2014, 07:42
|- - jcxz   Цитата(Golikov A. @ Nov 20 2014, 13:42) Т...   Nov 20 2014, 09:01
- - Danis   Коллеги, большое спасибо за идеи и рассуждения. Ду...   Nov 20 2014, 09:04
|- - jcxz   Цитата(Danis @ Nov 20 2014, 15:04) Просто...   Nov 20 2014, 09:41
- - Golikov A.   На самом деле я что-то тоже в какой-то момент нача...   Nov 20 2014, 12:26
- - Сергей Борщ   Хорошо, в TCP простая сумма. Но этот TCP идет пове...   Nov 20 2014, 13:12
- - Golikov A.   Вот оно откуда воспоминание о CRC32, ведь помнил ч...   Nov 20 2014, 13:58


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 14:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016