Data Stream Interface

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Data Stream Interface (с англ. — «Интерфейс потока данных») или DSI — сеансовый уровень, разработанный компанией Apple, который отвечал за перемещение трафика AFP (Apple Filing Protocol) через TCP.

Краткий обзор[править | править код]

Когда в 1990-х годах Apple представила свою реализацию TCP в виде MacTCP и Open Transport для Mac OS 7, им потребовалось, чтобы их протокол распространения файлов (AFP) работал одновременно и с TCP, и с AppleTalk. По совпадению, они представили протокол ASP (AppleTalk Session Protocol) и DSI с выпуском версии aFP 2.x.

DSI встроен напрямую в AFP-клиенты, как, например, используемые в Mac OS и afpfs-ng.

Протокол[править | править код]

DSI обеспечивает разговор между клиентом и сервером AFP. Все коммуникации DSI содержат в себе следующие заголовки:

Структура пакета[править | править код]

Заголовок DSI[1]
Место бита Биты 0–7 8-15 15-23 24-31
0 Флаги Команда ID запроса
32 Код ошибки/ сдвиг содержащихся данных
64 Общая длина данных
96 Зарезервировано
128 Полезная нагрузка

Значения полей:

  • Флаги: является ли этот пакет запросом (0x00) или ответом (0x01).
  • Команда: одна из 7 возможных команд (см. ниже).
  • ID запроса: Идентификационная последовательность в случае запроса и его копия в случае ответа.
  • Код ошибки/ сдвиг содержащихся данных:
    • Для запросов: значение поля равно 0, за исключением использования команды DSIWrite.
    • Для ответов: код ошибки.
  • Общая длина данных: вся длина данных после заголовка DSI.
  • Зарезервировано: для будущих расширений.
  • Полезная нагрузка: сюда помещаются ограниченные данные DSI или, чаще всего, заголовок AFP.

Команды[править | править код]

Всего имеется 7 возможных команд:[2]

Команды DSI
Имя Код Направление Описание
DSICloseSession 1 В обе стороны Завершить установленную сессию
DSICommand 2 От клиента Присоединённая полезная нагрузка содержит команду AFP
DSIGetStatus 3 От клиента Получить информацию о сервере
DSIOpenSession 4 От клиента Начать новую сессию
DSITickle 5 В обе стороны Убедиться в активности подключения
DSIWrite 6 От клиента Записать данные на сервер
DSIAttention 8 От сервера Привлечь внимание клиента

Запросы и ответы[править | править код]

При получении большинства запросов DSI, клиент или сервер посылают ответное сообщение. Данное сообщение содержит:

  • поле флага, принявшее значение 0x01 (ответ)
  • поле команды имеет то же значение, что и поле команды запроса
  • в ответе посылается такой же ID, как и в запросе (использовалось для того, чтобы дать понять клиенту, что его запрос был обработан)
  • поле с общей длиной данных принимает значение длины полезной нагрузки (если это применимо)
  • сами данные полезной нагрузки следуют за заголовком DSI, если это применимо (для подробностей см. индивидуальные команды)
  • команды DSITickle и DSICloseSession не вызывают ответа

Создание сессии, её поддержание и завершение[править | править код]

Сессия запускается при помощи команды DSIOpenSession, отправляемой клиентом, которая будет включать в себя размер имеющегося у клиента буфера для приёма пакетов (т. н. квантов запросов, обычно 1024 байта). Сервер обрабатывает запрос и возвращает размер своего буфера приема данных (обычно 256 Кбайт на Mac OS X Leopard).

Закрытие сессии может быть инициировано с любой стороны при помощи команды DSICloseSession. Отправитель не должен в ожидании ответа и должен немедленно завершить сессию после отправки данного сообщения.

Поддержание связи осуществляется при помощи "щекотки" (англ. tickling). DSI предоставляет механизм для того, чтобы и клиент, и сервер знали, что другой всё ещё активен. Каждые 30 секунд отсутствия активности, сервер отправит запрос для привлечения внимания клиента. точно так же, клиент может отправить запрос серверу (это НЕ БУДЕТ являться ответным пакетом). Клиент или сервер могут самостоятельно завершить сессию, если не получат ответ от другого за 120 секунд. Клиент также может завершить сессию в момент отправления запроса, и тогда ни ответ, ни запрос активности не будет получен в ближайшие 60 секунд (начиная с версии Mac OS X v.10.2).

Получение информации от сервера при помощи GetStatus[править | править код]

Данная команда получает пакет типа FPGetSrvrInfo. Он используется клиентом для получения информации с сервера, к которому он не подключён.

Элементы данных собираются в пакет с каталогом индексов, указывающих на структурированные данные.[3]

Запрос на запрос DSIGetStatus приведет к ответу от сервера со следующей информацией:

  • флаги в простейшими характеристиками сервера
  • имя сервера (в 7-битном ASCII или UTF-8)
  • подпись: используется для различия серверов между друг другом
  • тип сервера: обычно, "Macintosh" или "Netatalk"
  • список строк, описывающих версию AFP (напр. "AFP3.2")
  • список МИП: список строк, описывающих Методы Идентификации Пользователя (напр. "DHX2")
  • иконка 64х64 пикселей
  • список серверных директорий

Формат ответа DSIGetStatus идентичен формату FPGetSrvrInfo от AFP и используется для ASPGetStatus.[4]

Коды ошибок[править | править код]

Коды ошибок возвращают коды результатов AFP.[5]

Дальнейшее развитие[править | править код]

DSI никогда не был отдельно задокументирован, и является гораздо более простым и статичным в сравнении с более старыми образцами, что делает его подходящим для современного применения. Концепты DSI идентичны по своему смыслу ASP, и поэтому обзор "Inside AppleTalk, Second Edition" может оказаться полезным.

Самым кратким руководством можно назвать главу "AFP over TCP" из Apple Filing Protocol Programming Guide.

Значительную часть информации для понимания DSI можно найти при анализе передач между клиентами AFP и серверами при помощи анализатора трафика.

Примечания[править | править код]

  1. "DSIHeader" in "Apple Filing Protocol Reference". Дата обращения: 15 января 2020. Архивировано 13 ноября 2009 года.
  2. "DSI Commands" in "Apple Filing Protocol Programming Guide". Дата обращения: 15 января 2020. Архивировано 13 февраля 2010 года.
  3. "FPGetSrvrInfo" in "Apple Filing Protocol Reference". Дата обращения: 15 января 2020. Архивировано 13 ноября 2009 года.
  4. "DSIGetStatus" in "Apple Filing Protocol Reference". Дата обращения: 15 января 2020. Архивировано 13 ноября 2009 года.
  5. "Result Codes" in "Apple Filing Protocol Reference". Дата обращения: 15 января 2020. Архивировано 13 ноября 2009 года.