Доброго времени суток!
Пишу приложение, которое будет запускаться на стороне машины пользователя и собирать определённую информацию (путём захвата трафика через pcap)
Пользователь будет иметь доступ к исходному коду приложения.
Приложение будет отправлять данные на сервер (сервер уже не имеет открытых исходников), где эти данные будут обрабатываться в нужные для клиента метрики.
Сами данные подготавливаются на стороне клиента, так как (полагаю), что отправка сырых данных и обработка их уже на сервере - довольно трудоёмкая задача для оного (при увеличении числа клиентов), особенно когда все метрики должны будут обновляться в реалтайме.
Возникло сразу несколько вопросов.
1. Каким образом убедиться в том, что клиент передал именно те данные, которые изначально были перехвачены через pcap?
Подозреваю, что эти данные можно подделать на каждом этапе. Так вот, существуют ли способы максимально усложнить это дело? Дело в том, что некоторые метрики имеют статус "общих" и формируются всеми клиентами и доступны для просмотра всеми клиентами. И если один какой-нибудь человек по приколу решит отправить кучу неверных данных, то это приведёт к неправильной метрике.
2. Каким образом убедиться, что данные от клиента до сервера были доставлены?
Например, если в какой-то момент на каком-то узле произошёл сбой и пакет просто не дошёл до сервера, то в некоторых ситуациях (в сценариях использования, который предполагается на сервере) это может исказить метрику
В голове появилась подобная идея реализации:
1. Клиент генерирует хеш на основе сформированных данных
2. И отправляет данные и хеш на сервер.
3. Клиент переходит в режим ожидания ответа от сервера
4. Сервер генерирует на основе полученных данных свой хеш
1. Если хеши совпадают, то всё ок, сервер сообщает, что клиент может отсылать новую порцию данных
2. Если хеши не совпадают, то сервер отправляет запрос на повторную отправку данных
Всё ли я учёл? Может быть есть способы лучше?
3. Каким образом лучше всего осуществлять эту самую передачу? Через сокеты, или обычным HTTP-POST запросом?
Данные будут отправляться по необходимости. То есть если на стороне клиента ничего не происходит, значения в подготовленных данных не меняются - то клиент молчит.
Никогда не доводилось работать с таким типом приложений. По отдельности то их я могу написать. А как вот соединить вместе, чтобы это всё работало как надо - уже вопрос