Protocol

From
Alex Kocharin (2:5012/2.470)
To
All
Date
2006-03-28T20:15:08Z
Area
RU.UNIX.FTN
==/     Привет, All, как коннект? :)


Ниже представлен более другой протокол, чем я использовал ранее. Скоро я
попытаюсь его реализовать в своем мылере. Жду конструктивной критики. :)

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

В этом протоколе все данные передаются _одним_ блоком в base64encoded. Для
гарантирования точности передачи блока, передаем также его размер и crc.
Со стороны клиента блок передается post-запросом в поле data, его длина - в
поле datalen, а crc - в datacrc. Со стороны сервера, он начинается в любом
месте документа символами **DATA, далее идут в скобках через запятую размер
(десятичный) и crc, двоеточие, далее - блок в base64 (пробелов и переводов
строки нет!), заканчивается точкой с запятой. Т.е. всё это имеет вид:
**DATA(size,crc):data_in_base64;

Блок состоит из записей, каждая запись состоит из фиксированной шапки (6 байт)
и data-поля. Первый символ шапки - символ "!", что введено для проверки
корректности данных, второй символ - команда (см. ниже), последующие 4 - длина
data-поля. Data-поле - это последовательность байт, интерпретируемая в
соответствии с командой.

Весь блок состоит из начала, где передаются адрес системы, данные и др. и
конца, где передаются файлы.

В начале блока передаются:
'A': список 5D-адресов системы, резделяемых пробелом.
'H': строки информации о системе, аналогичны M_NUL в binkp. Таких записей может
быть несколько.
'W': пароль на сессию.
'O': параметры соединения, протоколы, etc.

В конце блока передаются:
'E': ошибка. В data-поле - необязательное пояснение.
'G': запрос файла. В data-поле - имя файла, размер и offset, разделяемые
запятой (запятой в имени файла быть не должно).
'R': информация о получении файла. В data-поле - имя и размер, разделяемые
запятой.
'L': информация о наличии файла, ожидающего отправления на ремоту. В data-поле
- имя и размер, разделяемые запятой.
'F': файл. В data-поле - имя файла, размер и offset, разделяемые запятой, после
чего идет сам файл.

Ну и пример блока, чтоб всё понятно стало (байты разделены пробелами, записи -
переводами строки для удобства, многое скипнуто):

! A \00 \00 \00 \14 2 : 5 0 / 1 3 \20 2 : 5 0 1 2 / 2 . 4 7 0
! H \00 \00 \00 \0F S Y S : \20 A K - S t a t i o n
! H \00 \00 \00 \12 Z Y Z : \20 A l e x \20 K o c h a r i n
! O \00 \00 \00 \07 I M W / 1 . 0
! L \00 \00 \00 \13 1 2 3 4 4 3 2 1 . t u 0 , 1 0 2 4 0 0
! L \00 \00 \00 \0F a m f o w . t g z , 1 7 6 3 1
! F \F1 \12 \23 \34 p a g e f i l e . s y s , 2 5 2 7 8 1 3 4 2 , [скипнуто]
! E \00 \00 \00 \1A П р о в а й д е р ы \20 с в я з ь \20 п о х е р и л и !

==\                                              ---  Alex Kocharin  ---
... Powered by Linux Mandrake 10.1 Official
--- ||*()*|| (Voice: 7-912-976-3321, Email: AlexKocharin(shift+2)mail.ru)
 * Origin: AK-Station, Kurgan, Russia (2:5012/2.470)
SEEN-BY: 46/50 50/12 400/567 814 450/1024 452/25 154 461/1313 2432/260 4614/20
SEEN-BY: 4615/21 4635/1024 5000/5000 5001/100 5002/63 5003/58 5010/2 53
SEEN-BY: 5011/13 5012/2 9 30 31 38 46 5015/28 221 5019/31 5020/545 715 760
SEEN-BY: 5020/1641 1982 2238 2871 4441 5021/29 44 5025/3 5027/12 5028/61
SEEN-BY: 5029/60 5030/115 830 901 1080 5035/38 5036/10 5041/4 5042/12 21
SEEN-BY: 5049/19 164 5053/16 5054/1 8 9 37 45 50 63 67 89 5059/9 5062/10
SEEN-BY: 5063/3 5064/7 5070/156 5071/22 5072/333 5077/70 5078/20 5080/111 147
SEEN-BY: 5080/239 1003 5085/13 87 5093/4 33 55 5095/20 5096/18 5097/31 64 303
SEEN-BY: 6000/0 1 12 6001/10 6028/1 6055/2 6083/12
PATH: 5012/2 30 5080/1003 5020/545 5054/1 37