Интерфейс потока данных - Data Stream Interface

В Интерфейс потока данных (DSI) - это сеансовый уровень, используемый для передачи Протокол хранения Apple движение за Протокол управления передачей.

Обзор

Когда Apple представила TCP с MacTCP и Открытый транспорт в Система 7 в 1990-х им требовалось, чтобы их протокол обмена файлами (AFP) работал как на TCP, так и на AppleTalk. Они представили Протокол сеанса AppleTalk (ASP) и DSI для TCP совпадают с AFP 2.x.

DSI реализован непосредственно в клиентах AFP, таких как Mac OS и afpfs-ng.

Протокол

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

Структура пакета

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

Поля:

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

Команды

Есть семь возможных команд:[2]

Команды DSI
ИмяКодНаправлениеОписание
DSICloseSession1ОбеЗакрывает установленную сессию
DSICommand2От клиентаПрикрепленная полезная нагрузка содержит команду AFP
DSIGetStatus3От клиентаПолучить информацию о сервере
DSIOpenSession4От клиентаУстановить новую сессию
DSITickle5ОбеУбедитесь, что соединение активно
DSIWrite6От клиентаЗаписать данные на сервер
DSI Внимание8С сервераПривлечь внимание клиента

Запросы и ответы

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

  • поле флагов установлено в 0x01 (ответ)
  • поле команды установлено на то же значение, что и поле команды запроса
  • тот же идентификатор запроса, отправленный в запросе (используется для клиента, чтобы найти запрос, который подтверждается)
  • totalDataLength устанавливается равным длине полезной нагрузки (если применимо).
  • там, где это применимо, сама полезная нагрузка данных после заголовка DSI. (Подробности см. В отдельной команде.)

Команды DSITickle и DSICloseSession не вызывают ответа.

Создание, обслуживание и отключение сеанса

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

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

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

Получение информации о сервере с помощью GetStatus

Эта команда DSI инкапсулирует пакет FPGetSrvrInfo. Он используется клиентом для получения информации с сервера, на который он не вошел.

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

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

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

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

Коды ошибок

Возвращаемые коды ошибок - это коды результатов AFP.[5]

Дальнейшие исследования

DSI никогда не документируется отдельно, он достаточно прост и статичен, поэтому старые ссылки подходят для современных реализаций. Концепции DSI идентичны протоколу сеанса AppleTalk (ASP), и обзор в Внутри AppleTalk, второе издание может быть полезным.

Самый емкий справочник - «AFP через TCP» глава Руководство по программированию протокола Apple Filing Protocol.

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

Сноски

Рекомендации

  • Протокол хранения AppleTalk версии 2.1 и 2.2 [1]
  • Внутри AppleTalk Sidhu, Gurharan S .; Эндрюс, Ричард Ф .; Оппенгеймер, Алан Б. (май 1990 г.), Внутри AppleTalk, второе издание, Addison-Wesley Publishing Company, Inc., ISBN  0-201-55021-0
  • Руководство по программированию протокола Apple Filing Protocol [2]
  • Справочник по протоколу хранения Apple [3]