Протокол передачи данных HUDP

18 Февраля 2016 К комментариям

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

Например подобный подход используется в протоколе WAKE http://digit-el.com/files/open/wake/wake.html.

Вводятся управляющие коды:

Обозначение Пояснение HEX-значение
FEND Frame End C0h
FESC Frame Escape DBh
TFEND Transposed Frame End DCh
TFESC Transposed Frame Escape DDh

Если в данных встречаются такие же коды их подменяют на ESC-последовательности:

Байт данных Передаваемая последовательность
C0h DBh, DCh
DBh DBh, DDh

И для общей картины структура пакета:

Заголовок Адрес Команда Кол-во Данные Данные Контрольная сумма
FEND ADDR CMD N Data1 DataN CRC

Недостаток такого метода “плавающая” длина пакета из-за подмены.

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

Меня такое положение не устраивало и мне пришлось придумать свой “костыль”.

Решений аналогичных моему мне не удалось найти.

Протокол передачи данных HUDP

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

Для проверки и правильного декодирования ввести контрольную сумму и размер пакета.

Структура пакета:

Данные Длина данных Контрольная сумма для данных Маркер
От 0 до N байт 2-байта 2-байта 4-е байта

В качестве маркера использую 4-е ASCII символа “HUDP” (4-е байта), “Header Universal Data Protocol” :)

Размерность длины пакета и контрольной суммы решил выбрать по два байта, так как мелких пакетов не предполагал использовать.

На первый взгляд кажется, что декодирование сложно, но это вовсе не так.

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

Таким образом чтобы пакет был принят декодером правильно необходимо выполнение трех условий:

  • совпадение маркера
  • совпадение размера
  • совпадение контрольной суммы

Минус: протокола необходимо при приеме предварительно накапливать принимаемые данные (т.е. использовать буфер), а так же большая избыточность на мелких пакетах.

Плюс: заранее известная длина пакета, нет необходимости использовать подмену.

Реализацию кодера и декодера приведу позже, на примере SVGA-контроллера на базе STM32F4:


Categories: Проекты Tags: HUDP WAKE

comments powered by Disqus