サービス・ロケーション・プロトコル

サービスロケーションプロトコル (Service Location Protocol, SLP) は IETF のドキュメント 2165 および 2608 によって標準化されたサービス発見のための通信プロトコルである。

**概要**
SLP においては、サービスの種類や属性を指定してネットワーク・サービスを検索することができる (属性指定の検索には 3059 によって標準化された属性リスト拡張を使用する)。SLP は企業内ネットワークのようにきちんと管理されたネットワーク上で使用することを前提としていて、大域的なインターネットにおいて使用することはできない。SLP は単純なバイナリ・プロトコルだが、サービス名や属性などとしては可変長の文字列を指定するので、HTTP などに匹敵する拡張性がある。SLP はサービスに使用されるプロトコルには依存しないので、Web、電子メール、リアルタイム通信をはじめとする様々なサービスの発見のために使用することができる。特定の仕様をみたすサービスを検索するのが本来の用法だが、リアルタイム通信などにおいて特定の利用者やメディアを検索するような場合にも使用可能だと考えられる。
サービス検索のもっとも基本的な方法はつぎの 2 とおりである。いずれにおいても検索をおこなうのはユーザ・エージェントであり、サービスを広告するのはサービス・エージェントである。

**ディレクトリを使用しない分散型の方法**
下図 のようにマルチキャストを使用することによってユーザ・エージェントが未知のサービス・エージェントに質問をおくり、サービス・エージェントが直接こたえる方法である。
+------------+ ----Multicast SrvRqst----> +---------------+

+------------+  +-----------+  +--------+
　ユニキャストを使用したサービス検索
なお、これらの 2 方法をくみあわせて、マルチキャストを使用した質問にディレクトリ・エージェントがこたえる方法もある。
サービス・エージェントは、サービスをサービス URL とサービス・テンプレートを使用して宣伝することができる。ネットワーク・プリンタのサービス・テンプレートの例を前記の C. Bettstetter らの論文から引用する。
service:printer://lj4050.tum.de:1020/queue1
scopes = tum, bmw, administrator
printer-name = lj4050
printer-model = HP LJ4050 N
printer-location = Room 0409
color-supported = false
pages-per-minute = 9
sides-supported = one-sided, two-sided
SLP は要求ドリブンのプロトコルである。つまり、ユーザ・エージェントが要求を送信しないかぎりはサービス・エージェント側に変化が起っても通知されない。しかし、2001 年 3 月に発行された 3082 において実験された notification / subscription の機能を使用すればイベントドリブンでサービスを発見することも可能である。ただし、notification / subscription の機能は標準化されていない。

**SLP の API**
1999 年 6 月に発行された 2614 には C による SLP の API (アプリケーション・プログラミング・インタフェース) の例が紹介されている。主要な関数の仕様は下記のとおりである。

**サービス登録関数 SLPReg()**
管理情報にサービスを登録するために次の関数が用意されている。
SLPError SLPReg(SLPHandle   hSLP,		 // SLP の管理情報
const char  *pcSrvURL,		 // サービス URL
const unsigned short usLifetime,
const char  *pcSrvType,	         // サービス型
const char  *pcAttrs,		 // 宣伝の属性
SLPBoolean  fresh,
SLPRegReport callback,           // 操作終了時に呼ばれるコールバック
void *pvCookie);                 // コールバック時に使用されるメモリ
指定された URL およびサービス型をもつサービス宣伝を登録 (register) する。

**サービス登録解除関数 SLPDereg()**
管理情報からサービス登録を解除するために次の関数が用意されている。
SLPError SLPDereg(SLPHandle  hSLP,   // SLP の管理情報
const char *pcURL,	// サービス URL
SLPRegReport callback, // 操作終了時に呼ばれるコールバック
void *pvCookie);   // コールバック時に使用されるメモリ
指定された URL をもつサービス宣伝の登録を解除 (deregister) する。

**サービス属性削除関数 SLPDelAttrs()**
管理情報からサービス属性を削除するために次の関数が用意されている。
SLPError SLPDelAttrs(SLPHandle   hSLP,		// SLP の管理情報
const char  *pcURL,	// サービス URL
const char  *pcAttrs,	// 削除する属性
SLPRegReport callback,     // 操作終了時に呼ばれるコールバック
void *pvCookie);           // コールバック時に使用されるメモリ
指定された URL をもつサービス宣伝から指定された属性を削除する。

**サービス検索関数 SLPFindSrvTypes()**
管理情報においてサービスを検索するために次の関数が用意されている。
SLPError SLPFindSrvTypes(SLPHandle hSLP,	// SLP の管理情報
const char  *pcNamingAuthority, // 検索するべき naming authority
const char  *pcScopeList, // 検索するべきスコープのリスト
SLPSrvTypeCallback callback, // 操作終了時に呼ばれるコールバック
void *pvCookie);     // コールバック時に使用されるメモリ
サービス型を検索する。

**サービス検索関数 SLPFindSrvs()**
管理情報においてサービスを検索するために次の関数が用意されている。
SLPError SLPFindSrvs(SLPHandle  hSLP、	   // SLP の管理情報
const char *pcServiceType,  // サービス型
const char *pcScopeList,    // 検索するべきスコープのリスト
const char *pcSearchFilter, // 検索フィルタ
SLPSrvURLCallback callback, // 操作終了時に呼ばれるコールバック
void *pvCookie);            // コールバック時に使用されるメモリ
指定されたサービス型をもつサービスを検索する。	

**サービス属性検索関数 SLPFindAttrs()**
管理情報においてサービス属性を検索するために次の関数が用意されている。
SLPError SLPFindAttrs(SLPHandle hSLP,	   // SLP の管理情報
const char *pcURLOrServiceType, // URL またはサービス型
const char *pcScopeList,  // 検索するべきスコープのリスト
const char *pcAttrIds,    // 検索するべき属性のリスト (フィルタ)
SLPAttrCallback callback, // 操作終了時に呼ばれるコールバック
void *pvCookie);          // コールバック時に使用されるメモリ
サービス属性を検索する。

**SLP の実装**
SLP Version 1 は Hewlett Packard (HP) 社による JetSend 技術においてプリンタやデジタル・カメラなどの製品に採用され、他社の製品にも使用されている。
SLP Version 2 も HP 社の Web JetAdmin や Sun Microsystems 社の Solaris 8 などの製品に採用されている。
Mac OSでは初期のバージョンからAppleTalkによりサービス発見が可能であったが、Mac OS 8.5からSLP Version 1も採用された。Mac OS 9ではSLP Version 2に移行した。Mac OS X v10.2 JaguarからはRendezvous(Bonjour)も実装されたためSLPの重要性が希薄になり、Mac OS X 10.5 LeopardでSLPは廃止された。
オープンソースの実装としては OpenSLPがある。