これまでのLessonで,SIPを使った接続や切断の基本的なしくみは理解できただろう。しかし,アプリケーションを使うときには,単純につないだり切ったりするだけでは物足りないこともある。例えばIP電話を使っているなら,呼び出し中の着信をほかの端末でピックアップしたり,通信をいったん保留したり,通信をほかの端末に転送するといったことができると便利だ。

リクエストの種類や中身を追加

 そのために,IETFではSIPを利用するさまざまな機能をほかのRFCで定義している。定義の方法は大きく二つ。一つめは,新たな種類のSIPリクエストを追加する方法。もう一つは,SIPリクエストの中で記述する内容を拡張する方法である。

 具体例で見ていこう。まずは,ほかの端末の着信を代わりに取る「ピックアップ」だ(図4-1の(1))。発信側のSIP UAがSIP UAにINVITEリクエストを送り着信音を鳴らしている。その着信を代わりに取ろうとするSIP UAは,着信中のSIP UAに「状態通知の要求」を意味するSUBSCRIBEリクエストを送信する。すると着信を受け付けているSIP UAは,「状態の通知」を意味するNOTIFYリクエストを送信して着信中の接続要求の情報を通知する。

図4-1●SIPを使えば複雑なサービスも実現できる<br>SIPは,リクエストを追加したり,リクエストで記述する中身を拡張することでさまざまな付加機能を実現している。
図4-1●SIPを使えば複雑なサービスも実現できる
SIPは,リクエストを追加したり,リクエストで記述する中身を拡張することでさまざまな付加機能を実現している。
[画像のクリックで拡大表示]

 NOTIFYリクエストを受け取ったSIP UAは,その中に書かれた接続要求の情報を見て,発信元のSIP UAに代理で着信することを連絡する。この連絡にはINVITEリクエストを使用する。このINVITEリクエストのヘッダー部分には「代わりに応答する」という意味のReplace行を追加しておく。Replace行を見た発信側のSIP UAは,送られてきたINVITEリクエストに応答し,自分が送信しているINVITEリクエストをCANCELリクエストでキャンセルする。

 ここまで見てきたやりとりのうち,SUBSCRIBEリクエストとNOTIFYリクエストは,SIPの機能を拡張するために追加されたリクエストだ。さらにINVITEで使っているReplace行も元々の規格では定義されていなかった内容である。

プレゼンスやテキスト交換もできる

 このような拡張は,さまざまな場面で使われている。例えば保留は,本来は接続に使うINVITEリクエストに「保留せよ」という意味のHold行を追加して実現する(同(2))。

 転送は,ピックアップのときに使うNOTIFYリクエストに,REFERリクエストを組み合わせて実現する(同(3))。REFERリクエストは拡張されたSIPリクエストで,相手のSIP UAに対してほかのSIP UAへSIPリクエストを送るように指示する。

 転送しようとするSIP UAは,通話中の相手のSIP UAにREFERリクエストを送信して,ほかのSIP UAにINVITEリクエストを送るように指示する。REFERリクエストを受け取ったSIP UAは,転送先のSIP UAに対して接続を要求する。うまく接続できたら,転送を指示したSIP UAにNOTIFYリクエストでうまく接続できたことを連絡する。転送を指示したSIP UAは,それを見て元の通信を切断する。

 SIPには,今まで見てきた追加リクエストのほかにも,MESSAGE(テキストの送信),PUBLISH(状態の登録)といった追加メソッドが決められている。

 これらの追加リクエストや中身が追加されたリクエストを使うことで,現在多機能電話で実現している機能に加えて,在席情報(プレゼンス)の管理や,短いテキスト・メッセージのやりとりなど,さまざまな付加サービスが実現できるようになっている。