Протокол передачи данных HUDP
При передачи данных по каналам без синхронизации в большинстве протоколов вводят уникальный маркер для синхронизации, а чтобы он был уникальным используют подмену (стаффинг), если данный маркер встречается в данных.
Например подобный подход используется в протоколе 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:
comments powered by Disqus