Protocol

From
Oleg Lobachev (2:2432/260.1)
To
Alex Kocharin
Date
2006-03-29T22:40:48Z
Area
RU.UNIX.FTN
Say yes, Alex. At least say hello.

30 Mar 06 00:46, you wrote to Stas Degteff:

 SD>> Можно передавать управляющую информацию в виде XML (парсеры есть
 SD>> готовые и в php, и в perl),

 AK> Не стоит ориентироваться на какой-либо язык. А так, при использовании
 AK> других языков, придется огребать проблемы с парсингом...

(Задумчиво) yacc? ;)

Другое дело, что 1) это действительно ориентация на ээ... структуру
представления данных, а не на язык. Парсеров XML - дофига, на всем от сей до
тикля. 2) Если можно обойтись без XML, лучше без него обойтись. Кроме того, это
ж типа обертка для мейлера, да? Щаз вспомним, что траффик вроде бы платный и
будем придавливать XML gzip'ом на лету. Бр-рррр.

 AK> Да и всегда проще читать строки фиксированной длины, чем парсить.

Строки фиксированной длины - зло. И 60-е годы прошлого века.

 SD>> а данные передавать в бинарном виде в ответ на запрос файла.

 AK> Кстати, хотелось бы избежать бинарного вида вообще. Хотя бы ради
 AK> единообразия. В твоем предложении сервер отдает файлы в бинарном виде, а
 AK> клиент - в текстовом. (бинари в пост-данные вроде не лезут)

А об объеме ты подумал? ;))

 SD>> В целях безопасности клиент должен передавать пароль только после
 SD>> получения ответа от сервера. При этом реализовать CRAM - раз плюнуть.

 AK> А что есть CRAM?

Challenge-Response Authentication Mechanism.

 SD>> Для передачи имени файла можно использовать заголовки HTTP и параметры
 SD>> CGI. Файл можно передавать шифрованным.

 AK> А зачем шифровать файл?

(Мрачно) Чтоб никто не догадался.

 AK> Мне кажется, что лучше, если сервер видит один запрос как полноценную
 AK> сессию, а клиент в одной сессии дает столько запросов, сколько _ему_
 AK> надо. Так отпадают все проблемы с таймаутами, обрывами, etc. И bsy'шки
 AK> залипать не будут. :)

Если я тебя правильно понял - welcome to the DoS.

 SD>> клиент в запросе передаёт список имеющихся файлов для сервера,
 SD>> сервер в ответе передаёт список имеющихся файлов для клиента и
 SD>> запрашивает первый файл.

 AK> Хотелось бы предоставить возможность запроса нескольких файлов.

Если ты уж _так_ упрощаешь, что у тебя сессия выглядит как "запрос - на файл",
то для следующего файла разумнее посылать еще один запрос - то бишь начать еще
одну сессию вида "запрос - на файл".

 SD>> Сессия завершается по обмену пустыми списками.

 AK> Вот он, лишний запрос...

Ты еще от CRAM'а лишние запросы начни отрывать. ;)

Тут или так:

начало_сессии: запрос - отзыв
аутентификация: CRAM (черным ящиком серия запросов и отзывов)
передача файла: запрос - кусок файла - подвтерждение - подтверждение
подтверждения (хм, Остапа несло)
передача следующего файла: см. выше, и так до опупения.
конец_сессии: запрос - отзыв

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

Или так:
начало_сесси: запрос - файл. конец_сессии.

Подтверждениями пусть tcp занимается, за один раз передается один файл. Хех, да
посмотри на само http. Вот это - вторая схема. Какой-то pop3 - первая.

 SD>> Надо также предусмотреть команды удаления файлов из дальней очереди,
 SD>> модификаторы докачки и т.п.

 AK> Ну это уже детали...

Нефига себе детали... А потом удивляемся почему оно реализовано через задницу.

Вообщем, еще раз: разработка хорошего, надежного, быстрого протоколла, с
попытками уменьшить время отзыва, возможность DoS и прочие вещи - это очень
хитрая штука. Реализация уже готового хорошего протоколла - тоже весьма хитрая
штука. Поиск граблей во всем этом растягивается на десятилетия. Поэтому для
применений в real world, а не на очередной лабе по сетевому программированию,
лучше взять уже имеющийся протоколл, с уже имеющейся реализацией на
твоем_любимом_языке. Прикручивание оно на server side, доточка нужной
функциональности, раздача клиентам и объяснение на какую кнопку Ok надо жать
оставляется читателю в качестве упражнения. ;)

Greetingz Oleg

---
 * Origin: Thou hast seen nothing yet. -- Miguel de Cervantes (2:2432/260.1)
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 4642/4 5000/5000 5001/100 5002/63 5003/58 5010/2 53
SEEN-BY: 5011/13 5012/30 46 5015/28 221 5019/31 5020/545 715 760 1641 1982
SEEN-BY: 5020/2238 2871 4441 5021/29 44 5025/3 5027/12 5028/61 5029/60
SEEN-BY: 5030/115 830 901 1080 1400 5035/38 5036/10 5041/4 5042/12 21 5049/19
SEEN-BY: 5049/164 5053/16 5054/1 8 9 37 45 50 63 67 89 5059/9 5062/10 5063/3
SEEN-BY: 5064/7 5070/156 5071/22 5072/333 5077/70 5078/20 5080/111 147 239
SEEN-BY: 5080/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: 2432/260 5080/1003 5020/545 5054/1 37