Интерфейс потока данных - 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:
Структура пакета
Битовое смещение | Биты 0–7 | 8-15 | 15-23 | 24-31 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Флаги | Команда | ID запроса | |||||||||||||||||||||||||||||
32 | Код ошибки / смещение вложенных данных | |||||||||||||||||||||||||||||||
64 | Общая длина данных | |||||||||||||||||||||||||||||||
96 | Зарезервированный | |||||||||||||||||||||||||||||||
128 | Полезная нагрузка |
Поля:
- Флаги: является ли пакет запросом (0x00) или ответом (0x01)
- Команда: одна из 7 возможных команд (см. ниже)
- ID запроса: последовательный идентификатор, установленный в запросе и скопированный в ответ
- Код ошибки / смещение вложенных данных:
- Для запросов остается 0, кроме случаев использования команды DSIWrite.
- Для ответов это код ошибки.
- Общая длина данных: вся длина данных после заголовка DSI
- Зарезервированный: для будущего расширения
- Полезная нагрузка: здесь размещаются ограниченные данные DSI или, чаще, заголовок AFP
Команды
Есть семь возможных команд:[2]
Имя | Код | Направление | Описание |
---|---|---|---|
DSICloseSession | 1 | Обе | Закрывает установленную сессию |
DSICommand | 2 | От клиента | Прикрепленная полезная нагрузка содержит команду AFP |
DSIGetStatus | 3 | От клиента | Получить информацию о сервере |
DSIOpenSession | 4 | От клиента | Установить новую сессию |
DSITickle | 5 | Обе | Убедитесь, что соединение активно |
DSIWrite | 6 | От клиента | Записать данные на сервер |
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 с помощью анализатора пакетов.
Сноски
- ^ «DSIHeader» в «Справочнике по протоколу Apple Filing Protocol»
- ^ «Команды DSI» в «Руководстве по программированию протокола Apple Filing Protocol»
- ^ «FPGetSrvrInfo» в «Справочнике по протоколу Apple Filing Protocol»
- ^ «DSIGetStatus» в «Справочнике по протоколу хранения Apple»
- ^ «Коды результатов» в «Справочнике по протоколу Apple Filing Protocol»
Рекомендации
- Протокол хранения AppleTalk версии 2.1 и 2.2 [1]
- Внутри AppleTalk Sidhu, Gurharan S .; Эндрюс, Ричард Ф .; Оппенгеймер, Алан Б. (май 1990 г.), Внутри AppleTalk, второе издание, Addison-Wesley Publishing Company, Inc., ISBN 0-201-55021-0