tixture55’s diary

主にプログラミング関係の日記です。

SIPプロトコルのおさらい

IP電話障害の案件だと、SIPプロトコルのハンドシェイクでどこでNGになっているのかを切り分ける必要が多々あると思います。HTTPとの大きな違いはどちらの端末もクライアントになるし、サーバにもなるということ。仕様についてまとめてみました。

 

シグナリングとは電話で言うならば、古制御のことで、通信路の確保や切断などの処理を指します。シグナリングとは電話で言うならば、古制御のことで、通信路の確保や切断などの処理を指します。

 

SIPにおけるメッセージはテキストで記述され、HTTPやSMTPを例に設計されたため、シンプルで拡張性が高く、 Inviteリクエストはユーザにセッションへの参加を招待するメソッドです。 inviteリクエストのボディにはセッションの記述を行います。セッションの記述とは、例えば音声セッションに RTPパケットを、あるIPアドレスUDPポートで受信したいと要求するような記述です。  通常このinviteリクエストを受信したUAは、呼び出し中を意味する「180 Ringing」レスポンスを返信します。 SIPのリクエストに対するレスポンスには100〜600番台までの状態番号が割り振られています。
 セッションの招待要求であるinviteリクエストは、セッションの途中で新たにセッションを作成したり、変更したりする 場合にも必要です。つまり新たにinviteリクエストを発行する必要があります。


ACKリクエストはinviteリクエストに対する最終レスポンスを受信したことを知らせる目的で使用するメソッドです。 inviteリクエストを発行したクライアントは
inviteリクエスト以外でのメソッドでは、発行した側はサーバからすばやいレスポンスを期待しています。 例えばinviteリクエストを受け取った人がそれに応答するにはそれ相応の時間が必要です。 発信者が受信者から200 OKレスポンスを受け取ったときに、サーバにACKを送信することで、inviteリクエストが 続いており、その後セッションの確立が成功したことを通知することができるのです。


HTTPサーブレットはjavax.servlet.http.HttpServletを継承します。 これに対してSIPサーブレットはjavax.servlet.SipServletを継承する必要があります。 SipServletクラスはHttpServletクラス同様、javax.servlet.GenericServletクラスを継承しているため、 HTTPサーブレット同様のサーブレット方式の開発を行うことができます。


SIPサーブレットが動作するSIPサーブレットコンテナが起動してから最初のSIPサーブレットがリクエストされた場合 SIPサーブレットから1度だけinitメソッドが呼び出されます。 ●sip.xmlの役割 主な役割はサーブレットの宣言と、サーブレットをいつ呼び出せばよいかを定めたルール定義です。 呼び出しルールはSIPアプリケーションが受信したSIP要求を元に対応するサーブレットを呼び出すための マッチングを行います。すなわち、着信した要求はその要求に当てはまるルールを持つサーブレットに渡されます。 アプリケーションからアプリケーションの設定がアプリケーションサーバへデプロイされてアプリケーションが 実行される。

SIPサーバとHTTPサーバの相違はプロトコルにもあります。SIPサーブレットの各doXxxメソッドには引数が1つしか ありません。

 

HTTPサーブレットでは、トランザクションは1対のリクエストとレスポンスから構成されているため、doXxxメソッド の引数でリクエスト(HttpServletRequest)とレスポンス(HttpServletResponse)を指定します。 これに対して、SIPサーブレットは1つのリクエストに対して複数のレスポンスを返すことができます。 例えばサーバが1つのinviteリクエストに対して、3つの応答100 , 180 , 200を返すことができます。 doXxxメソッドではリクエストのみを指定し、オーバーライドしたメソッドで必要なレスポンスを生成して返します。

 

SIPの重要な特徴としてクライアントとサーバが固定されないというのがあります。 HTTPの場合は必ず固定されています。 例えば、HTTPクライアントは必ずHTTPリクエストを出して、HTTPレスポンスを受け取ります。 しかし、SIPでは電話をかけたり、うけたりするので両方の端末がクライアントとサーバの機能を持っている必要があります。

 

結構、シンプルですよね。レスポンスを返すメソッドは継承されたメソッドとか、たぶん私が実装者でも同じ作り方をするんじゃないでしょうか。