Wavelet Transfer Protocol



Wavelet Transfer Protocol

Протокол WTP относится к прикладному уровню модели OSI и используется для взаимодействия WTP-клиента и WTP-сервера.

В протоколе WTP предусмотрено всего три типа запросов: WTP_BANR, WTP_LIST и WTP_DATA, названия которых говорят сами за себя. В ответ на запрос WTP_BANR сервер пришлет приветственное сообщение наподобие "Welcome to WTP server!". В ответ на запрос WTP_LIST сервер пришлет список файлов и директорий. И, наконец, в ответ на запрос WTP_DATA сервер пришлет указанный файл (изображение).

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

Упрощенно модель взаимодействия клиента и сервера по протоколу WTP выглядит так:

  1. Клиент создает TCP соединение с сервером.
  2. Клиент формирует запрос определенного формата и отправляет его серверу.
  3. Клиент посылает серверу сегмент FIN, как признак конца запроса.
  4. Сервер получает клиентский запрос.
  5. Получив сегмент FIN, сервер начинает обработку клиентского запроса.
  6. Сервер формирует свой ответ и отправляет его клиенту.
  7. Сервер закрывает соединение, что вызывает отправку сегмента FIN клиенту.
  8. Клиент получает ответ сервера.
  9. Клиент получает сегмент FIN как признак конца ответа сервера.

В терминологии протокола TCP, отправка клиентом сегмента FIN в п. 3 называется половинным закрытием соединения. Для этих целей в API сокетов служит функция shutdown(). Сегмент FIN служит в протоколе WTP как маркер конца запроса клиента или ответа сервера. Это существенно, т.к. в самом теле WTP запроса не указывается размер и сервер бы не имел возможности узнать где заканчивается клиентский запрос.

Вообще, всем у кого еще нет книги У. Стивенса "UNIX: разработка сетевых приложений" советую ее обязательно приобрести, ибо лучшей книги по сетевому программированию просто не существует!

Вернемся к протоколу WTP. Как уже было сказано, протоколом определяется три типа запросов, которым соответствуют следующие коды:
Идентификатор Код Размер Описание
WTP_LIST 0x01 1 байт Получить список файлов и директорий с сервера.
WTP_DATA 0x02 1 байт Получить файл (изображение).
WTP_BANR 0x03 1 байт Получить приветственное сообщение (баннер).

Ответ сервера всегда начинается с кода ошибки, который может принимать следующие значения:
Идентификатор Код Размер Описание
WTP_OKAY 0x01 1 байт Все прошло корректно.
WTP_CANT_OPEN 0x02 1 байт Ошибка открытия файла или директории на сервере.
WTP_BAD_REQUEST 0x03 1 байт WTP запрос сформирован некорректно.

За кодом ошибки всегда следует соответствующее текстовое описание вида:
Идентификатор Соответствующая ему строка
WTP_OKAY Okay
WTP_CANT_OPEN Can`t open file or directory
WTP_BAD_REQUEST Bad request

Теперь перейдем к непосредственому описанию формата запроса и ответа в протоколе WTP.

WTP_BANR - запрос

Поле Размер Описание
WTP_BANR 1 байт Запрос на получение приветственного сообщения.

WTP_BANR - ответ

Поле Размер Описание
ERROR_CODE 1 байт ERROR_CODE равен либо WTP_OKAY либо WTP_BAD_REQUEST.
ERROR_SRING переменный (null-terminated string) Соответствующее текстовое описание для ERROR_CODE.
BANNER переменный (null-terminated string) Приветственное сообщение (баннер) с сервера. Данное поле присутствует только если ERROR_CODE был равен WTP_OKAY.

WTP_DATA - запрос

Поле Размер Описание
WTP_DATA 1 байт Запрос на получение файла (изображения).
OFFS 4 байта Начальное смещение в файле (если равно 0, то файл загружается с начала).
LEN 4 байта Количество загружаемых байт (если равно размеру файла, то загружается весь файл). Ограничение на размер файла - 2 Gb.
NAME переменный (null-terminated string) Имя файла на сервере (имя должно начинаться с "/").

WTP_DATA - ответ

Поле Размер Описание
ERROR_CODE 1 байт ERROR_CODE равно WTP_OKAY, WTP_CANT_OPEN или WTP_BAD_REQUEST.
ERROR_SRING переменный (null-terminated string) Соответствующее текстовое описание для ERROR_CODE.
DATA переменный Требуемый фрагмент файла. Данное поле присутствует только если ERROR_CODE был равен WTP_OKAY.

WTP_LIST - запрос

Поле Размер Описание
WTP_LIST 1 байт Запрос на получение списка файлов и директорий.
NAME переменный (null-terminated string) Имя директории, содержимое которой требуется узнать ("/" - корневая директория).

WTP_LIST - ответ

Поле Размер Описание
ERROR_CODE 1 байт ERROR_CODE равен WTP_OKAY, WTP_CANT_OPEN или WTP_BAD_REQUEST.
ERROR_SRING переменный (null-terminated string) Соответствующее текстовое описание для ERROR_CODE.
DIRECTORY переменный Список файлов и директорий (формат см. ниже). Данное поле присутствует только если ERROR_CODE был равен WTP_OKAY.

Формат DIRECTORY

Как видно из предыдущей таблицы, имена файлов и директорий упаковываются в структуру DIRECTORY. Устроена она крайне просто. Если очередной элемент в ней - это директория, тогда вслед за байтом 0x01 (признак директории) следует null-terminated строка с ее именем. Если очередной элемент - это файл, тогда вслед за байтом 0x02 (признак файла) следует 4 байта, содержащие размер файла, а затем уже следует null-terminated строка, содержащая его имя.

Замечание: все многобайтные значения в протоколе WTP сохраняются в т.н. сетевом порядке (network byte order). Другими словами, старший байт сохраняется по младшему адресу.

Скачать

Во время разработки и отладки программ Wavelet Explorer и WTPD появилась необходимость в некоторой простой утилите, позволяющей работать с WTP-сервером на низком уровне. Другими словами, был необходим простой и удобный отладочный инструмент для работы с протоколом WTP. Хотя сейчас необходимость в такой программе отпала, в некоторых ситуациях она может очень пригодиться.

Программа wtp - это очень простой WTP-клиент под windows. Программа работает по следующему принципу: сначала содержимое исходного файла отправляется на указанный сервер, а затем полученный от него ответ сохраняется в целевом файле. Таким образом можно вручную составить любой WTP - запрос (предварительно сохранив его в файле), а затем проследить за реакцией сервера.

Программа wtp доступна для скачивания и распространяется в соответствии с лицензией GNU GPL.


Copyleft © 2003-2008 Александр Симаков
Сыктывкарский государственный университет
Последнее обновление: 15 марта 2008