データストリームインターフェイス(DSI)は、Apple Filing Protocol のトラフィックをTransmission Control Protocol上で伝送するために使用されるセッションレイヤです。
1990年代にAppleがSystem 7でMacTCPとOpen Transportを導入した際、ファイル共有プロトコル(AFP)をTCPとAppleTalkの両方で動作させる必要がありました。そこで、AFP 2.xと同時に、TCP用のAppleTalkセッションプロトコル(ASP)とDSIを導入しました。
DSIは、Mac OSやafpfs-ngなどのAFPクライアントに直接実装されています。
DSIはクライアントとAFPサーバー間で行われる通信です。すべてのDSI通信には、以下のDSIヘッダーが含まれます。
対象となるフィールドは以下のとおりです。
可能なコマンドは 7 つあります: [ 2 ]
ほとんどのDSIリクエストを受信すると、クライアントまたはサーバーは応答メッセージを送信します。この応答には以下の内容が含まれます。
DSITickleコマンドとDSICloseSessionコマンドは応答を返しません。
セッションは、クライアントが DSIOpenSession を送信することによって確立されます。このセッションには、クライアントがパケット用に持つ受信バッファのサイズ (リクエストクォンタムと呼ばれ、通常は 1024 バイト) が含まれます。サーバーはリクエストを確認し、データ受信バッファのサイズ ( Mac OS X Leopardでは通常 256KB ) を返します。
セッションの終了は、どちらの側からでもDSICloseSessionを送信することで開始できます。送信側は応答を待つ必要はなく、メッセージ送信後すぐにセッションを閉じる必要があります。
接続の維持はティックルによって行われます。DSIは、クライアントとサーバーが互いにアクティブであることを確認するためのメカニズムを提供します。サーバーは、30秒間アクティビティがないと、クライアントにティックル要求を送信します。同様に、クライアントも独自のティックルを送信します(これは応答パケットではありません)。クライアントまたはサーバーは、120秒間相手からの応答がない場合、DSIセッションを終了できます。また、クライアントは、要求が送信中で、60秒以内に応答もティックルも受信されない場合にも切断できます(Mac OS X v.10.2以降)。
このDSIコマンドは、FPGetSrvrInfoパケットをカプセル化します。クライアントがログインしていないサーバーから情報を取得する際に使用されます。
データ要素は、構造化データを指すインデックスのカタログとともにパケット内に整理されています。[ 3 ]
DSIGetStatusリクエストを実行すると、サーバーは以下の情報で応答します。
DSIGetStatus の応答フォーマットは AFP の FPGetSrvrInfo と同一であり、ASPGetStatus に使用されます。[ 4 ]
返されるエラーコードはAFP結果コードです。[ 5 ]
DSIは個別に文書化されることはなく、十分にシンプルで静的なため、古い資料でも最新の実装に十分対応できます。DSIの概念はAppleTalkセッションプロトコル(ASP)と同一であり、『Inside AppleTalk, Second Edition』の概要が参考になるでしょう。
最も簡潔なガイドは、Apple Filing Protocol Programming Guideの「AFP over TCP」の章です。
DSIを理解する上で重要な情報源の一つは、パケットスニファを使用してAFPクライアントとサーバー間の通信を分析することである。