SIP ( 2 )

July 16, 2018

SIP のメッセージ

SIP のメッセージの種類には、発呼側 UA から着呼側 UA に送信するリクエストと、着呼側 UA から発呼側 UA に返信するレスポンスがある。

  • リクエスト
    主なリクエストメッセージは以下の通りである。

f:id:shiro_kochi:2018××××××××:plain:w100:left

  • レスポンス
    レスポンスメッセージには、次に示す 3 桁のレスポンスコードが含まれている。1 桁目の値によって 6 つのクラスに分類される。

f:id:shiro_kochi:2018××××××××:plain:w100:left

  • メッセージフォーマット

SIP メッセージは以下の図に示す通り、スタートライン、ヘッダ、ボディからなる。ボディは必要に応じて追加されるものであり、ボディを持たないメッセージもある。
ボディは MIME 形式で記述することが定められているが、記述内容に関する規格は SIP では規定されていない。
セッション制御機能の INVITE や ACK などのリクエストでは、ボディにセッションの属性が記述され、その記述に用いられるのが SDP である。
インスタントメッセージ機能の MESSAGE リクエストでは、ボディにテキストの内容が記述される。

f:id:shiro_kochi:2018××××××××:plain:w100:left

SIP のシーケンス (基本)

SIP でセッションを生成するときの基本となるメッセージは INVITE リクエスト、200 OK レスポンス、ACK リクエストの 1 往復半からなるやりとりである (スリーウェイハンドシェイク)。
SIP の基本的なシーケンスは以下のようになる。

f:id:shiro_kochi:2018××××××××:plain:w100:left

1. 発呼側がセッションの生成を要求するため INVITE リクエストを送信する
このボディには、発呼側のセッション情報を記述する。

2. 着呼側は、セッション生成要求に応答するため、200 OK レスポンスを送信する
このボディには、着呼側のセッション情報を記述する。着呼側は INVITE リクエストの SIP メッセージに記載された情報から、発呼側の IP アドレス、通話に使用するポート番号などのセッション情報を知ることができる。
着呼側が 200 OK を返信したことは、これら発呼側のセッション情報を受け付けたことを意味している。

3. 発呼側は、着呼側から成功応答を受信したことを知らせるため、ACK リクエストを送信する
発呼側は 200 OK レスポンスの SIP メッセージに記載された情報から、着呼側の IP アドレス、通話に使用するポート番号などのセッション情報を知ることがでkリウ。
発呼側が ACK を送信したことは、これら着呼側のセッション情報を受け付けたことを意味しており、このフェーズが終了した時点でセッションが生成される。

4. リアルタイムデータの通話を行う
通話に用いるプロトコルは 1 ~ 2 のセッション情報交換で決めたものである。
通常、音声や映像などのリアルタイムデータの通話には RTP が用いられる。
通話に用いる IP アドレスは 1 ~ 2 のセッション情報交換で決めたものである。

5. セッションの切断を要求するため、BYE リクエストを送信する
切断の要求は、発呼側、着呼側のどちらから送信しても良い。

6. 切断要求に応答するため 200 OK レスポンスを送信する

セッション生成時のスリーウェイハンドシェークを通し、両 UA はセッション情報を交換し、かつ双方が合意した属性でセッションを生成する (ネゴシエーション)。
なお、発呼側が INVITE を送信する際、複数のセッション情報の候補を列挙することができる。このとき着呼側はその中から一つを選んで成功応答を返信する。
あるいは、発呼側が INVITE を送信する際、セッション情報を一切記載しないこともできる。この際、着呼側はセッション情報を自由に指定して成功応答を返信する。

SIP のシーケンス (SIP サーバを用いる場合)

UA が互いの IP アドレスを把握していない場合、SIP サーバを仲介してセッションを生成することになる。
各 UA は SIP URI と IP アドレスの対応付けを SIP サーバに初期登録しておく。
SIP サーバを使用した場合のシーケンスは以下のようになる。

f:id:shiro_kochi:2018××××××××:plain:w100:left

1. 発呼側は SIP サーバに INVITE メッセージを送信する
SIP サーバは INVITE リクエスト中の着呼側 SIP URI から IP アドレスを割り出し、着呼側にこれを転送する。

2. SIP サーバは INVITE リクエストの転送を知らせるため、発呼側に 100 Trying (処理中) レスポンスを送信する

3. 着呼側は INVITE メッセージを受信すると、利用者を呼び出す (電話であれば呼び出し音を鳴らす)
呼び出し中であることを知らせるため、着呼側は SIP サーバに、SIP サーバは発呼側に 180 Ringing (呼び出し中) レスポンスを送信する。

4. 着呼側は、セッション生成要求に応答するため、200 OK レスポンスを SIP サーバに送信する
SIP サーバは発呼側にこれを転送する。

5. 発呼側は着呼側から成功応答を受信したことを知らせるため、ACK リクエストを送信する
発呼側は 200 OK レスポンスを受信することで、着呼側の IP アドレスを知ることができる。
そのため、ACK リクエストは SIP サーバを経由せずに直接相手に送信することができる。(SIP サーバを経由しても良い)

6. リアルタイムデータ通信を行う

7. セッションの切断を要求するため BYE リクエストを送信する

8. 切断要求に応答するため 200 OK レスポンスを送信する

Via フィールドの働き

Via フィールドは、リクエストが経由したパスを示している。まず送信元 UA が自分の IP アドレスを格納した Via フィールドを記述する。
SIP サーバはリクエストを中継する際、自分を経由したことを示すために Via フィールドを 1 行追加でする。追加のする位置は既存の Via フィールドの上位である。
宛先 UA はレスポンスを返信する際、受け取った Via フィールドをそのままヘッダに記述し、Via フィールドの最上位に格納されたホストにレスポンスを返す。
SIP サーバはレスポンスを中継する前に Via フィールドの最上位を削除し、その結果新たに最上位となった Via フィールドは SIP サーバがレスポンスを返す相手を示している。

f:id:shiro_kochi:2018××××××××:plain:w100:left


 © 2023, Dealing with Ambiguity