Интерфейс потока данных (DSI) — это сеансовый уровень, используемый для передачи трафика Apple Filing Protocol по протоколу управления передачей .
Когда Apple представила TCP с MacTCP и Open Transport в System 7 в 1990-х годах, им нужно было, чтобы их протокол обмена файлами (AFP) работал как на TCP, так и на AppleTalk . Они представили AppleTalk Session Protocol (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 | Флаги | Команда | Запросить идентификатор | |||||||||||||||||||||||||||||
32 | Код ошибки/смещение вложенных данных | |||||||||||||||||||||||||||||||
64 | Общая длина данных | |||||||||||||||||||||||||||||||
96 | Сдержанный | |||||||||||||||||||||||||||||||
128 | Полезная нагрузка |
Поля:
Существует семь возможных команд: [2]
Имя | Код | Направление | Описание |
---|---|---|---|
DSIЗакрыть сеанс | 1 | Оба | Закрывает установленный сеанс |
DSIКоманда | 2 | От клиента | Прикрепленная полезная нагрузка содержит команду AFP |
DSIGetStatus | 3 | От клиента | Получить информацию о сервере |
DSIOpenSession | 4 | От клиента | Установить новую сессию |
DSITickle | 5 | Оба | Убедитесь, что соединение активно. |
DSIWrite | 6 | От клиента | Запись данных на сервер |
DSIВнимание | 8 | С сервера | Привлеките внимание клиента |
При получении большинства запросов DSI клиент или сервер отправляет ответное сообщение. Этот ответ содержит:
Команды DSITickle и DSICloseSession не вызывают ответ.
Сеанс устанавливается клиентом, отправляющим DSIOpenSession, который будет включать размер буфера приема, который клиент имеет для пакетов (называемый квантом запроса, обычно 1024 байта). Сервер подтверждает запрос и возвращает размер своего буфера приема данных (обычно 256 КБ в Mac OS X Leopard).
Закрытие сеанса может быть инициировано любой из сторон путем отправки DSICloseSession. Отправителю не нужно ждать ответа, и он должен немедленно закрыть сеанс после отправки сообщения.
Поддержание соединения осуществляется с помощью tickling . DSI предоставляет механизм, гарантирующий, что клиент и сервер знают, что другой все еще активен. Каждые 30 секунд бездействия сервер отправляет клиенту запрос tickle. Аналогично клиент также отправляет свой собственный tickle. (Это НЕ ответный пакет.) Либо клиент, либо сервер могут завершить сеанс DSI, если они не получают ответа от другого в течение 120 секунд. Клиент также может отключиться, если запрос находится в процессе выполнения, а ни ответа, ни tickle не получено в течение 60 секунд (в Mac OS X v.10.2 и более поздних версиях).
Эта команда DSI инкапсулирует пакет FPGetSrvrInfo. Он используется клиентом для получения информации с сервера, на котором он не зарегистрирован.
Элементы данных организованы в пакет с каталогом индексов, указывающих на структурированные данные. [3]
Запрос на DSIGetStatus заставит сервер ответить следующей информацией:
Формат ответа DSIGetStatus идентичен FPGetSrvrInfo AFP и используется для ASPGetStatus. [4]
Возвращаемые коды ошибок являются кодами результатов AFP. [5]
DSI никогда не документируется отдельно и достаточно прост и статичен, чтобы старые ссылки подходили для современных реализаций. Концепции DSI идентичны AppleTalk Session Protocol (ASP), и обзор в Inside AppleTalk, Second Edition может быть полезен.
Наиболее кратким руководством является глава «AFP через TCP» в руководстве по программированию протокола Apple Filing Protocol.
Значительный источник информации для понимания DSI можно найти, проанализировав связь между клиентами и серверами AFP с помощью анализатора пакетов.