2007年3月24日土曜日

HTTP/1.1のメソッド

SIPプロトコルは、HTTPをベースに開発したと、RFC3261にもうたわれている。そこで、SIPのルーツを理解するため、今回は、HTTPに規定されているメソッドを調べてみた。

HTTPの最新版であるHTTP/1.1は、RFC2616で規定されている。RFC2616には、「OPTIONS」「GET」「HEAD」「POST」「PUT」「DELETE」「TRACE」「CONNECT」という8つのメソッドが規定されている。それぞれのメリクエストのソッドの概要は以下のとおりである。

メソッドの名前が決められていて、それがリクエストメッセージの最初に書かれるという点は、HTTPとSIPで共通している。Request-URIという言葉も共通で、HTTPをベースに開発といわれている意味が理解できる。ただ、HTTPで規定されている「OPTIONS」メソッドは、SIPにも同じ名前、同じ用途で引き継がれているものの、(用途が違うので当然といえば当然だが)ほとんどのメソッド名は共通してない。

以前、IETFのSIPワーキンググループで、デバックの目的で、受け取ったメッセージ内容をそのままボディ部に載せて発信者に返すというアイデアをだしていた人がいたが、考え方としては、HTTPの「TRACE」メソッドを踏襲したものなのでしょう。(具体的な検討はすすんでないようですが。)IETFでのSIPプロトコルの標準化の動きを見るうえでは、ベースとしているHTTPの歴史は参考になるように思います。


『HTTP/1.1 で規定されるメソッド』

●OPTIONS
サーバやRequest-URIで指定されるリソースで、利用可能なオプション一覧を取得するためのメソッドである。応答をキャッシュに保存してはいけない。

●GET
Request-URIで識別される情報を取り出すためのメソッド。

●HEAD
Request-URIで識別されるエンティティのメタ情報を取得するためのメソッド。応答のメッセージボディが空である点以外は、GETメソッドと同じ動作。

●POST
POSTリクエストのメッセージボディに添付したエンティティを、Request-URIで指定したリソースに従属するものとして受け入れることをサーバに要求するためのメソッド。

●PUT
Request-URIで示される場所に、PUTリクエストに含まれる内容を置くことを要求するためのメソッド。

●DELETE
Request-URIで識別されるリソースを削除することを要求するメソッド。

●TRACE
アプリケーションレイヤでのループバック試験を行うためのメソッド。応答のボディ部には、最終的にサーバに届いたリクエストの内容がそのまま含められる。

●CONNECT
プロキシでの利用のために"CONNECT"というメソッド名が予約されている。

【以下参考:RFC2616(http://www.ietf.org/rfc/rfc2616.txt)より抜粋】

9.2 OPTIONS

The OPTIONS method represents a request for information about the
communication options available on the request/response chain
identified by the Request-URI. This method allows the client to
determine the options and/or requirements associated with a resource,
or the capabilities of a server, without implying a resource action
or initiating a resource retrieval.

Responses to this method are not cacheable.

(中略)

9.3 GET

The GET method means retrieve whatever information (in the form of an
entity) is identified by the Request-URI. If the Request-URI refers
to a data-producing process, it is the produced data which shall be
returned as the entity in the response and not the source text of the
process, unless that text happens to be the output of the process.

(中略)

9.4 HEAD

The HEAD method is identical to GET except that the server MUST NOT
return a message-body in the response. The metainformation contained
in the HTTP headers in response to a HEAD request SHOULD be identical
to the information sent in response to a GET request. This method can
be used for obtaining metainformation about the entity implied by the
request without transferring the entity-body itself. This method is
often used for testing hypertext links for validity, accessibility,
and recent modification.

(中略)

9.5 POST

The POST method is used to request that the origin server accept the
entity enclosed in the request as a new subordinate of the resource
identified by the Request-URI in the Request-Line. POST is designed
to allow a uniform method to cover the following functions:

- Annotation of existing resources;

- Posting a message to a bulletin board, newsgroup, mailing list,
or similar group of articles;

- Providing a block of data, such as the result of submitting a
form, to a data-handling process;

- Extending a database through an append operation.

(中略)

9.6 PUT

The PUT method requests that the enclosed entity be stored under the
supplied Request-URI. If the Request-URI refers to an already
existing resource, the enclosed entity SHOULD be considered as a
modified version of the one residing on the origin server. If the
Request-URI does not point to an existing resource, and that URI is
capable of being defined as a new resource by the requesting user
agent, the origin server can create the resource with that URI. If a
new resource is created, the origin server MUST inform the user agent
via the 201 (Created) response. If an existing resource is modified,
either the 200 (OK) or 204 (No Content) response codes SHOULD be sent
to indicate successful completion of the request. If the resource
could not be created or modified with the Request-URI, an appropriate
error response SHOULD be given that reflects the nature of the
problem. The recipient of the entity MUST NOT ignore any Content-*
(e.g. Content-Range) headers that it does not understand or implement
and MUST return a 501 (Not Implemented) response in such cases.

(中略)

9.7 DELETE

The DELETE method requests that the origin server delete the resource
identified by the Request-URI. This method MAY be overridden by human
intervention (or other means) on the origin server. The client cannot
be guaranteed that the operation has been carried out, even if the
status code returned from the origin server indicates that the action
has been completed successfully. However, the server SHOULD NOT
indicate success unless, at the time the response is given, it
intends to delete the resource or move it to an inaccessible
location.

(中略)

9.8 TRACE

The TRACE method is used to invoke a remote, application-layer loop-
back of the request message. The final recipient of the request
SHOULD reflect the message received back to the client as the
entity-body of a 200 (OK) response. The final recipient is either the
origin server or the first proxy or gateway to receive a Max-Forwards
value of zero (0) in the request (see section 14.31). A TRACE request
MUST NOT include an entity.

(中略)

9.9 CONNECT

This specification reserves the method name CONNECT for use with a
proxy that can dynamically switch to being a tunnel (e.g. SSL
tunneling [44]).

SIPandVoIPトップに戻る

2007年3月23日金曜日

通話中呼を保留するためのメッセージは?

●質問
通話中の呼を保留する場合、どのようなメッセージを送信すればよいのか?

●回答
RFC上、以下の3通りの実現方法が規定されている。

1.SDPのc=行に"0.0.0.0"設定したRe-INVITE/UPDATEを送信
2.SDPに"a=sendonly"が設定されたRe-INVITE/UPDATEを送信
3.Contactヘッダの+sip.renderingパラメータの設定値が変更されたRe-INVITE
/UPDATEを送信

いずれも、自らがメディアを受け付けないことを意味するメッセージを送ることで、通話中の呼の保留を表現しているが、表現の仕方が異なっている。

SIPandVoIPトップに戻る

プロキシサーバのダウン時の408応答について

●質問
プロキシがダウンしている状態で、UACからプロキシに対してリクエストを送信したが、タイムアウトになったケースを考える。この場合、408応答がTU(Transaction User)に返されるはずだが、プロキシはダウンしていて応答を返すことはできない。どうすればよいのか。

●回答
408応答は、クライアントトランザクションが生成する。クライアントトランザクションは、INVITEなどのリクエストを送信した後、応答がない場合には、タイマAに基づいてリクエストの再送を行い、応答を受け取るか、タイマB(デフォルト32秒)が満了した時に再送を止める。再送を止めるタイミングで、UACのクライアントトランザクションで408応答が生成され、TUに渡される。

SIPandVoIPトップに戻る

UA(User Agent/ユーザ・エージェント)

SIPのメッセージを送受信するEndのエレメントをUA(User Agent/ユーザ・エージェント)と呼ぶ。SIPの信号手順は、リクエストとその応答で構成されるトランザクションと呼ばれる単位の組み合わせで構成されるが、トランザクション内において、リクエストを送信する側のUAをUAC(User Agent Client/ユーザ・エージェント・クライアント)、リクエストを受けて応答を返す側のUAをUAS(ユーザ・エージェント・サーバ)と呼ぶ。

initial-INVITEリクエストの場合、発信者がUAC、着信者がUASとなる。ダイアログ内で着信側からリクエストが送られた場合(Re-INVITEやUPDATE等が典型的な例として考えられる)は、着信側がUACで発信者がUASとなる。UACかUASかの区別は、リクエストごとに、リクエストをどちらが送ったかで判断されるので、かならずしも呼の発信者と着信者には対応しない点には注意が必要である。

図

 UAC                                 UAS
  |                                   |
  | リクエスト                          |
  | (INVITE, UPDATE, MESSAGE etc.)    |
  |---------------------------------->|
  |                         応答       |
  |                        (200OK 等) |
  |<----------------------------------|


SIPandVoIPトップに戻る

B2BUA (Back-to-Back User Agent)

B2BUAは、Back-to-back User Agentの略。SIPプロキシと同じく、UAC(User Agent Client)からUAS(User Agent Server)の間の中間エンティティの一つだが、SIPプロトコルを終端する点がSIPプロキシと異なる。B2BUAはRFCのプロキシサーバに関する動作規定の適用外になる。

B2BUAは、論理的にUASとUACの機能を含む。下図にB2BUAの概念図を示す。B2BUAという名称は、2つのUAを背中合わせに持つことに由来する。B2BUAはUACにはUASに見え、UASにはUACに見える。

B2BUAの具体的な例としては、呼処理サーバの一部やネットワークの境界等におかれるSBC(Session Border Controller)がある。

B2BUAの概念が登場した背景としては、SIPプロトコルのP2Pの思想と、3GPP等の電話会社との間での思想の違いを埋めるための折衷的案としての意味合いがあると想像される。P2P(Peer-to-Peer)でのセッション開始のために作られたSIPプロトコルでは、プロキシなどの中間エンティティが、End-End間でのネゴシエーションに介入することに対しては禁止的であるが、3GPPでの利用を考えるとこれでは実用に耐えなかったのだろう。

図

     +-----------------------------------+
     | B2BUA(Back-to-back User Agent)    |
     |+-------+                 +-------+|
     ||logical|  +-----------+  |logical||
 UAC-|| UAS   |--| Interwork |--| UAC   ||-Proxy-UAS
     ||       |  +-----------+  |       ||
     |+-------+                 +-------+|
     +-----------------------------------+


SIPandVoIPトップに戻る

2007年3月20日火曜日

Open SourceのSIPスタック(Javaベース)

JavaベースのOpen SourceのSIPスタックの調査結果を下記にまとめた。
各SIPスタックの名称、入手先のURL、特徴などを以下に記載する。

●MjSip(http://www.mjsip.org/)
・2007年3月19日時点での最新版は1.6版。
・JavaベースのSIPスタックの実装。
・GNU GPL licenseに基づいた提供が行われている
・パルマ大学(University of Parma)とローマ大学(University of Roma)で研究用に使用されている
・下記の4種類のファイルと2種類のドキュメントをダウンロード可能である。

<ファイル>
◇mjserver(mjsipサーバのバイナリファイル)
http://www.mjsip.org/download/mjserver_1.6.zip
◇mjua(mjua(User Agent)のバイナリファイル)
http://www.mjsip.org/download/mjua_1.6.zip
◇mjsip(mjsipのSIPスタックおよびmjserver/mjuaのソースコード)
http://www.mjsip.org/download/mjsip_1.6.zip
◇mjsipME(J2ME/CLDC1.1/MIDP2.0上での開発用ツールとソースコード)
http://www.mjsip.org/download/mjsip2me_1.6.zip
<ドキュメント>
http://www.mjsip.org/download/mjsip_doc_1.6.zip
http://www.mjsip.org/download/mjsip_doc_apps_1.6.zip

●NIST SIP(http://snad.ncsl.nist.gov/proj/iptel/)
・米国商務省配下のNIST(National Institute of Standards andTechnology)が開発したSIPスタック
・改善されたVoIPのトランスポートメカニズムの開発の促進のために配布を行っているとホームページに記載がある
<最新版ダウンロード URL>
http://download.java.net/communications/jain-sip/nightly/last/jain-sip-1.2.jar

SIPandVoIPトップに戻る

第68回IETFのアジェンダ変更(speermint⇔geopriv)

3月18日に第68回IETFのアジェンダ変更が周知された。
変更により、speermint-wgとgeopriv-wgの日時が入れ替えになる。

●新アジェンダ
geopriv-wg 日時:3月22日(木)9:00~11:30 場所:Congress I
sppermint-wg 日時:3月20日(火)9:00~11:30 場所:Congress I

●旧アジェンダ
geopriv-wg 日時:3月20日(火)9:00~11:30 場所:Congress I
sppermint-wg 日時:3月22日(木)9:00~11:30 場所:Congress I

SIPandVoIPトップに戻る

2007年3月19日月曜日

第68回IETF会合のアジェンダ(3月19日)

本日(3月19日)は、RAIエリア関連のミーティングとして、下記の4つのセッションが開催される予定である。開催時間、場所、資料、ストリーミング配信およびテキストカンファレンスのURLを下記にまとめた。

●発表用のスライド:
全セッション共通で下記のURLからダウンロードできる。
https://datatracker.ietf.org/public/meeting_materials.cgi?meeting_num=68

●SIPPING-WG:
・時間:09:00~11:30(日本時間 17:00~19:30)
・場所:CongressII
・アジェンダ:
http://www3.ietf.org/proceedings/07mar/agenda/sipping.html
・ストリーミング配信のURL:
http://videolab.uoregon.edu/events/ietf/ietf684.m3u
・テキストカンファレンスログのURL:
http://www.ietf.org/meetings/ietf-logs/sipping/
 
●AVT-WG
・時間:13:00~15:00(日本時間 21:00~23:00)
・場所:Roma/Vienna/Madrid
・アジェンダ:
http://www3.ietf.org/proceedings/07mar/agenda/avt.txt
・ストリーミング配信のURL:
http://videolab.uoregon.edu/events/ietf/ietf686.m3u
・テキストカンファレンスログのURL:
http://www.ietf.org/meetings/ietf-logs/avt/

●RTPSEC-BoF
・時間:15:20~17:20(日本時間 23:20~3/20 1:20)
・場所:Congress II
・アジェンダ:
http://www3.ietf.org/proceedings/07mar/agenda/rtpsec.html
・ストリーミング配信のURL:
http://videolab.uoregon.edu/events/ietf/ietf684.m3u
・テキストカンファレンスログのURL:
http://www.ietf.org/meetings/ietf-logs/rtpsec/

●MMUSIC-WG
・時間:17:40~19:50(日本時間 3/20 1:40~3:50)
・場所:Congress I
・アジェンダ:
http://www3.ietf.org/proceedings/07mar/agenda/mmusic.txt
・ストリーミング配信のURL:
http://videolab.uoregon.edu/events/ietf/ietf681.m3u
・テキストカンファレンスログのURL:
http://www.ietf.org/meetings/ietf-logs/mmusic/

●ストリーミング配信された音声ファイルは、下記のURLから明日以降ダウンロード可能になる予定。
過去ログ(http):
http://limestone.uoregon.edu/ftp/pub/videolab/media/ietf68/
過去ログ(ftp):
ftp://limestone.uoregon.edu/pub/videolab/media/ietf68/


SIPandVoIPトップに戻る

2007年3月17日土曜日

SIP入門 (第3回 基本シーケンス)

●基本シーケンス

次にSIPを使ったセッションの制御の手順を見てみることにする。

セッションの確立までの手順は、以下のようになる。

①発信者から着信者に、セッションを開始する要求(INVITE)が送られる
②着信者から発信者に、今呼び出し中(電話ならベルが鳴ってる!)ことを知らせる
(180 Ringing)
③着信者から発信者に、セッション開始要求を受け入れたことを知らせる(200OK)
④発信者から着信者に、200OK応答を受け取ったことを通知(ACK)する

 発信者           着信者
  | ① INVITE                 |
  |-------------------->|
  | ②180 Ringing           | 電話のベルが鳴る!!
  |<--------------------|
  | ③200 OK                  | 受話器を上げる
  |<--------------------|
  | ④ACK          |
  |-------------------->|
  |               |
  |<=== 通話開始 ===>|


180 Ringingは呼び出し中であることを意味する応答信号で、200OKはINVITEの要求を受け入れたことを意味する応答信号である。ACKは応答信号を受け取ったことを意味するメソッド(リクエスト)である。

「要求(①INVITE)→受諾(②200OK)→受諾確認応答(③ACK)」
の3つの手順を踏んでから通信を開始することから、この手順は3ハンドシェークと呼ばれている。


※要求(通信してよ)→受諾(いいよ)で事が足りそうなところ、あえてACK(いいよというのを確かに聞いたよ)というのを伝えるのは、発信者と着信者の間はネットワークで結ばれていて、応答がなくなってしまうかもしれないし、そこまでいかなくても届くのが遅れるかもしれないということを考慮したためである。着信者の立場からすると、『OKしたけど、本当に届いているのか』ということがわからない。だから、必ず発信者は、INVITEに対する200OKを受けた場合には、ACKを相手に送るというルールとなっている。また、着信者が200OKを送ったのにいつまでたってもACKがこない場合には、200OKはなくなったんだ、と理解して、同じ200OKを再度送る(再送)ということが決められている。


SIPandVoIPトップに戻る

SIP入門 (第2回 リクエストと応答)

●SIPメソッド(リクエスト)

SIPは『通話を始めたい』とか、『通話終了』などの意味をテキスト文字列によって伝える。このため、テキストベースプロトコルと呼ばれる。そして、SIPにはメソッドと呼ばれる信号が決められている。

<SIPメソッド(リクエスト)>
 ・INVITE (セッションへの招待)
 ・ACK  (応答信号受信)
 ・BYE  (セッションの終了)
 ・CANCEL (セッションへの招待の取り消し)
 ・OPTIONS(能力問い合わせ)
 ・UPDATE (セッションの更新)
 他

セッションとは、とりあえず、ここでは電話における通話状態をイメージしてほしい。(厳密には違うが大体合ってる。詳しくは後で述べていくことにする)これらのメソッドは、信号の受け手に要求を行うものであることからリクエストとも呼ばれる。

●応答

SIPの場合、信号機と異なる点がある。信号機の場合には、赤信号で『停止』という意味を、信号機からドライバーや歩行者に一方的に伝えればよかった。逆に歩行者から信号機に対して、『今、急いでいるから、青信号に変えてくれ』ということを伝えることはできない。

しかし、SIPの場合には、『セッションへの招待』を意味するリクエストは、あくまで依頼を行う信号なので、この信号を受けた側には、受け入れるか、拒否するかを選択する権利がある。そうなので、リクエストを受けた人から、リクエストを送った人に対して、『承諾』『拒否』という応答も伝える必要がある。そこでSIPでは、リクエストに対する応答信号が下記のように決められている。

<応答信号>
100~199:暫定応答
200~299:成功
300~399:リダイレクト(他の場所を指し示す)
400~699:失敗

SIPではセッションの開始、変更、終了などの要求を意味するリクエストとそれに対する応答信号をお互いに送りあうことによって、セッションの制御を行っている。