데이터 스트림 인터페이스
Data Stream InterfaceDSI(Data Stream Interface)는 전송 제어 프로토콜을 통해 Apple 파일링 프로토콜 트래픽을 전달하는 데 사용되는 세션 계층이다.
개요
애플이 1990년대 시스템 7에서 MacTCP와 Open Transport를 탑재한 TCP를 도입했을 때 TCP와 AppleTalk에서 모두 실행하기 위해서는 AFP(파일 공유 프로토콜)가 필요했다.이들은 AFP 2.x와 우연히 TCP용 애플토크 세션 프로토콜(ASP)과 DSI를 도입했다.
DSI는 맥 OS나 afp-ng와 같은 AFP 클라이언트에 직접 구현된다.
프로토콜
DSI는 클라이언트와 AFP 서버 사이에서 사용된다.모든 DSI 통신에는 다음과 같은 DSI 헤더가 포함되어 있다.
패킷 구조
비트 오프셋 | 비트 0-7 | 8-15 | 15-23 | 24-31 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 깃발 | 명령 | 요청 ID | |||||||||||||||||||||||||||||
32 | 오류 코드/밀폐된 데이터 오프셋 | |||||||||||||||||||||||||||||||
64 | 총 데이터 길이 | |||||||||||||||||||||||||||||||
96 | 예약됨 | |||||||||||||||||||||||||||||||
128 | 페이로드 |
필드는 다음과 같다.
- 플래그: 패킷이 요청(0x00)인지 또는 응답(0x01)인지 여부
- 명령: 7개의 가능한 명령 중 하나(아래 참조)
- 요청 ID: 요청에 설정되고 응답에 복사된 순차적 식별자
- 오류 코드/ 동봉된 데이터 오프셋:
- 요청의 경우 DSIWrite 명령을 사용할 때를 제외하고 0으로 유지된다.
- 회신의 경우, 이것은 에러 코드다.
- 총 데이터 길이: DSI 헤더 이후의 전체 데이터 길이
- 예약됨: 향후 확장을 위해 사용 가능
- 페이로드: 제한된 DSI 데이터 또는 더 일반적으로 AFP 헤더가 배치되는 위치
명령
다음 7가지 가능한 명령이 있다.[2]
이름 | 코드 | 방향 | 설명 |
---|---|---|---|
DSICloseSession | 1 | 둘 다 | 설정된 세션 닫기 |
DSICommand | 2 | 고객으로부터 | 첨부된 페이로드에 AFP 명령 포함 |
DSIGetStatus | 3 | 고객으로부터 | 서버에 대한 정보 가져오기 |
DSIO펜세션 | 4 | 고객으로부터 | 새 세션 설정 |
DSITickle | 5 | 둘 다 | 연결이 활성 상태인지 확인하십시오. |
DSIWrite | 6 | 고객으로부터 | 서버에 데이터 쓰기 |
DSIAttention | 8 | 서버로부터 | 고객의 관심 받기 |
요청 및 응답
대부분의 DSI 요청을 수신하면 클라이언트나 서버가 회신 메시지를 보낸다.이 회신 내용은 다음과 같다.
- 0x01로 설정된 깃발 필드(응답)
- 요청의 명령 필드와 동일한 값으로 설정된 명령 필드
- 요청에서 보낸 동일한 요청 ID(승인된 요청을 클라이언트가 찾는 데 사용)
- totalDataLength를 페이로드 길이로 설정(해당하는 경우)
- 해당되는 경우 DSI 헤더를 따르는 데이터 페이로드 자체.(자세한 내용은 개별 명령을 참조하십시오.)
DSITickle 및 DSICloseSession 명령은 응답을 트리거하지 않는다.
세션 생성, 유지 관리 및 해체
세션은 클라이언트가 DSIOpenSession을 보내면서 설정되는데, 여기에는 클라이언트가 패킷에 대해 가지고 있는 수신 버퍼 크기(요청 퀀텀, 일반적으로 1024바이트라고 함)가 포함된다.서버는 요청을 승인하고 데이터 수신 버퍼 크기(일반적으로 Mac OS X Leopard의 경우 256k)를 반환한다.
세션 폐쇄는 DSICloseSession을 전송하여 어느 한쪽이 시작할 수 있다.발신인은 회신을 기다릴 필요가 없으며 메시지를 보낸 후 즉시 세션을 닫아야 한다.
연결을 유지하는 것은 간지럼을 타면서 이루어진다.DSI는 클라이언트와 서버가 다른 서버가 여전히 활성 상태임을 알 수 있는 메커니즘을 제공한다.30초마다 서버가 클라이언트에게 티클 요청을 보낸다.마찬가지로 클라이언트도 자체 티클을 보낸다. (이것은 응답 패킷이 아니다.)클라이언트 또는 서버가 120초 동안 다른 클라이언트로부터 수신하지 못할 경우 DSI 세션을 종료할 수 있다.요청이 전송 중이고 응답과 간지럼이 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 응답 형식은 AFP의 FPGetSrvrInfo와 동일하며 ASPGetStatus에 사용된다.[4]
에러코드
반환되는 에러 코드는 AFP 결과 코드다.[5]
추가 연구
DSI는 결코 별도로 문서화되지 않으며, 이전의 참조가 현대적 구현에 적합할 정도로 간단하고 정적이다.DSI의 개념은 AppleTalk Session Protocol(ASP)과 동일하며 Inside AppleTalk, Second Edition의 개요가 도움이 될 수 있다.
가장 간결한 가이드는 Apple Fileing Protocol Programming Guide의 "AFP over TCP" 장이다.
패킷 스나이퍼를 사용하여 AFP 클라이언트와 서버 간의 통신을 분석함으로써 DSI를 이해하는 데 중요한 정보원을 찾을 수 있다.
각주
참조
- AppleTalk 파일링 프로토콜 버전 2.1 및 2.2 [1]
- AppleTalk 내부Sidhu, Gurharan S.; Andrews, Richard F.; Oppenheimer, Alan B. (May 1990), Inside AppleTalk, Second Edition, Addison-Wesley Publishing Company, Inc., ISBN 0-201-55021-0