Проект "Свободные голосования"
http://gplvote.andyhost.ru/forum/

Документы по протоколам
http://gplvote.andyhost.ru/forum/viewtopic.php?f=13&t=219
Страница 1 из 2

Автор:  Андрей [ 16 окт 2011, 22:13 ]
Заголовок сообщения:  Документы по протоколам

Решил сделать на вики что-то конкретное по протоколам что-бы уже как-то начинать.

Структура пакетов

Типы пакетов

Коды типов голосований

Коды данных (Грубо говоря, коды, описывающие назначение полей данных)

Автор:  yurial [ 16 окт 2011, 22:29 ]
Заголовок сообщения:  Re: Документы по протоколам

Структура пакетов:
Для того чтобы через сеть могло функционировать множество подсистем необходимо ввести номер протокола. Для того, чтобы корректно разбивать поток на "пакеты" необходимо ввести длину.
Итого: Номер протокола 2 байта, длинна пакета 2 байта.
Дальнейшие данные вообще говоря для каждого из протоколов могут быть специфичными. Но в общем случае будет что-нибудь вроде "тип пакета в данном протоколе" (как в вашем варинте), можно фиксировано задать 2 байта, 1 лишний байт роли не сыграет.

Для функционирования самой сети скорее всего будут нужен собственный протокол. Предлагаю зарезервировать номера протоколов 0..15 как системные.
-------------
Системой голосований предлагаю заняться после того как будет готов транспорт.
ps не совсем понимаю необходимость в кодах данных.
pps пакеты лучше идентифицировать не по uuid а по хэшу от неизменяемых данных. (транспортная подпись является изменяемой и для идентификации пакета учитываться не должна)

Автор:  Андрей [ 16 окт 2011, 22:42 ]
Заголовок сообщения:  Re: Документы по протоколам

yurial писал(а):
Структура пакетов:
Для того чтобы через сеть могло функционировать множество подсистем необходимо ввести номер протокола. Для того, чтобы корректно разбивать поток на "пакеты" необходимо ввести длину.
Итого: Номер протокола 2 байта, длинна пакета 2 байта.
Дальнейшие данные вообще говоря для каждого из протоколов могут быть специфичными. Но в общем случае будет что-нибудь вроде "тип пакета в данном протоколе" (как в вашем варинте), можно фиксировано задать 2 байта, 1 лишний байт роли не сыграет.

1 байт не сыграет никакой роли при передаче одного пакета. При функционировании всей сети - очень даже сыграет. Я-бы и версию протокола сделал однобайтной.

Цитата:
Для функционирования самой сети скорее всего будут нужен собственный протокол. Предлагаю зарезервировать номера протоколов 0..15 как системные.

Не против.

Цитата:
Системой голосований предлагаю заняться после того как будет готов транспорт.

Я только готовлю основу, я не призываю голосования делать сразу-же. Просто для понимания структур данных нужно хотя-бы примерно представлять что там будет.

Цитата:
ps не совсем понимаю необходимость в кодах данных.

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

Цитата:
pps пакеты лучше идентифицировать не по uuid а по хэшу от неизменяемых данных. (транспортная подпись является изменяемой и для идентификации пакета учитываться не должна)

Для идентификации по хэшу нужно, насколько я понимаю что-то вроде sha256 что в 2 раза больше чем uuid. Я-бы все-таки рекомендовал аккуратнее относиться к размерам данных. Боюсь что нагрузка на сеть у нас будет главной проблемой после ее запуска.

Автор:  Андрей [ 16 окт 2011, 22:43 ]
Заголовок сообщения:  Re: Документы по протоколам

Кстати, насколько я понимаю, вы протоколом называете то, что я называю "типом пакета"?

Автор:  yurial [ 17 окт 2011, 10:29 ]
Заголовок сообщения:  Re: Документы по протоколам

Андрей писал(а):
Кстати, насколько я понимаю, вы протоколом называете то, что я называю "типом пакета"?

Пример:
Протокол 0 (системный протокол транспортной подсистемы)
Тип пакета 0 (запрос открыкого транспортного ключа)
Тип пакета 1 (ответ содержащий открытый транспортный ключ)
Тип пакета 2 (запрос списка узлов в ноде)
Тип пакета 3 (список узлов в ноде)
Протокол 66 (протокол голосований)
Тип пакета 0 (запрос списка субъектов)
Тип пакета 1 (ответ списка субъектов)
и т.п.
В этом случае именно "тип пакета" определяет содержимое которое передается в нем. Я бы его даже назвал "команда", команда "REQUEST_SUBJECT_LIST", "RESPONCE_SUBJECT_LIST".

Обработка при этом производится так:
Транспортная система принимает самый маленький первый заголовок. Если "протокол" поддерживается системой то принимаются оставшиеся байты в буфер, буфер передается на обработку модулю. Модуль в зависимости от "тип пакета" методом тупого switch вызывает функцию для обработки именно этого типа пакета. Функция преобразует указатель на буфер в указатель на структуру связанную с этим типом пакета и получает нужные поля данных. Никаких кодов данных до этого момента не нужно.

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

Автор:  yurial [ 17 окт 2011, 10:46 ]
Заголовок сообщения:  Re: Документы по протоколам

Андрей писал(а):
1 байт не сыграет никакой роли при передаче одного пакета. При функционировании всей сети - очень даже сыграет. Я-бы и версию протокола сделал однобайтной.

Даже при наличии 140млн устройств это сгенерирует всего лишь 280мб лишних данных, распределенных по коммуникациям всей страны. Заголовки ip сгенерируют в 10 раз больше данных, и tcp столько же.
Можно сэкономить на UUID, в качестве хеша можно будет использовать md5 (128 бит). Да даже если использовать SHA256 это нам никак не помешает. По факту нам не надо его передавать вместе с данными . Я предполагаю что схема будет примерно следующая:
A: B, у тебя есть пакет ID123123?
B: неа
A: на данные
B: принял данные, посчитал хэш, добавил пакет в БД.
Либо возможен другой вариант:
A: B, дай мне пакет ID1234123
B: на
A: принял данные посчитал хэш, добавил в БД.

Автор:  Андрей [ 17 окт 2011, 13:59 ]
Заголовок сообщения:  Re: Документы по протоколам

yurial писал(а):
Андрей писал(а):
Кстати, насколько я понимаю, вы протоколом называете то, что я называю "типом пакета"?

Пример:
Протокол 0 (системный протокол транспортной подсистемы)
Тип пакета 0 (запрос открыкого транспортного ключа)
Тип пакета 1 (ответ содержащий открытый транспортный ключ)
Тип пакета 2 (запрос списка узлов в ноде)
Тип пакета 3 (список узлов в ноде)
Протокол 66 (протокол голосований)
Тип пакета 0 (запрос списка субъектов)
Тип пакета 1 (ответ списка субъектов)
и т.п.

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

Автор:  Андрей [ 17 окт 2011, 14:06 ]
Заголовок сообщения:  Re: Документы по протоколам

yurial писал(а):
Андрей писал(а):
1 байт не сыграет никакой роли при передаче одного пакета. При функционировании всей сети - очень даже сыграет. Я-бы и версию протокола сделал однобайтной.

Даже при наличии 140млн устройств это сгенерирует всего лишь 280мб лишних данных, распределенных по коммуникациям всей страны. Заголовки ip сгенерируют в 10 раз больше данных, и tcp столько же.

Вы забываете что у нас связи будут не "один-к-одному", а "многие-ко-многим". Соответственно, эти 280Мб надо умножать на среднее количество связей у клиента.

Цитата:
Можно сэкономить на UUID, в качестве хеша можно будет использовать md5 (128 бит).

Не вы-ли мне объясняли почему нельзя использовать md5? Кроме того, на чем вы собрались экономить если uuid и так имеет размер 128 бит (16 байт)? Кстати, присутствие в uuid MAC адреса не обязательно, если вы из-за этого против него.

Цитата:
Да даже если использовать SHA256 это нам никак не помешает. По факту нам не надо его передавать вместе с данными . Я предполагаю что схема будет примерно следующая:
A: B, у тебя есть пакет ID123123?
B: неа
A: на данные
B: принял данные, посчитал хэш, добавил пакет в БД.
Либо возможен другой вариант:
A: B, дай мне пакет ID1234123
B: на
A: принял данные посчитал хэш, добавил в БД.

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

С другой стороны, вместо того что-бы использовать uuid для идентификации и md5 для контроля данных, лучше использовать sha256 того-же размера для обеих этих функций одновременно.

Автор:  yurial [ 17 окт 2011, 15:30 ]
Заголовок сообщения:  Re: Документы по протоколам

Андрей писал(а):
Мне не нравится увеличенная нагрузка на клиента если ему придется считать хэши всех приходящих пакетов.

Уверен эта нагрузка не будет значительной.
Андрей писал(а):
Вообще, хэши конечно лучше в качестве идентификаторов, т.к. одновременно выполняют 2 функции - и идентификацию и контроль данных. Но для идентификации нельзя использовать md5, соответственно, размер хэша будет больше чем uuid.
С другой стороны, вместо того что-бы использовать uuid для идентификации и md5 для контроля данных, лучше использовать sha256 того-же размера для обеих этих функций одновременно.

Я согласен на sha256. При том, что передаваться это поле (см. мой пример взаимодействия устройств) будет только при необходимости.

Автор:  Андрей [ 24 окт 2011, 12:54 ]
Заголовок сообщения:  Re: Документы по протоколам

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

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/