SIPによる呼制御のあらすじ
SIPは基本的にクライアント・サーバ型のプロトコルであり、その仕組みはHTTPやSMTPと言ったプロトコルに非常によく似ています。ただし、似ていると言っても、HTTPやSMTPとは決定的に異なる点があります。
それは、HTTPやSMTPはクライアントとなる端末とサーバとなる端末がはっきりしているのに対して、SIPはひとつの端末がクライアントにもサーバにもなりえるという点です。
つまり、SIP端末同士のピアツーピア通信が可能だということです。
また、HTTPやSMTPがトランスポート層プロトコルにTCPを使用しているのに対し、SIPは主にUDPが使用されることも異なる点です。
TCPに比べて処理負荷が小さいUDPは、リアルタイム性を求められるSIPに適していると言えます。
そのため、UDPが使用されることが多いわけですが、それでもTCPが持ち合わせている信頼性(パケットの到達性、順序保証など)は電話機能を実現するためには必要になります。
特に、セッション確立時は、相手側との確実なネゴシエーションを行わなければなりません。
そこで、SIPでは独自にTCPのような仕組みを構成しています。
上図は、電話発信から切断までの基本的な流れです。
TCPコネクション確立時に行う3ウェイハンドシェイクに非常によく似ているのが伺えます。
まず、発信側はINVITEリクエストを送信します。
そして、着信側がそのINVITEリクエスト(要求)に対するレスポンス(応答)を返すことで通信が始まります。
例えば、着信側が電話を受けられる状態であるならば、上図のように180応答(Ringing)を返し、発信側にリングバックトーン(呼び出し音)を、自身は電話機の呼び出しベルを鳴動させます。
着信側が受話器を上げる(オフフックする)とINVITEリクエストに対する最終応答である200応答を返します。
そして発信側(INVITEリクエスト送信側)では、最終応答を受け取ったことを知らせるACKを送ります。
ここまでのやり取りを行って、相手との通話が始ります。
通話を終えるとき(受話器を置いたとき)は、BYEを送信し、セッションを終了させます。