Seansialustusprotokoll

**Seansialustusprotokoll** (*Session Initiation Protocol* **SIP**) on IETF-i loodud signaliseerimisprotokoll multimeediaseansside algatamiseks ja juhtimiseks internetis.

SIP on rakendustaseme protokoll, mida kasutatakse IP-võrkudes multimeedia seansside algatamiseks, muutmiseks ja lõpetamiseks. SIP-protokoll võimaldab juhtida kõnet (VoIP ehk *Voice over Internet Protocol*), videot, sõnumivahetust (IM ehk *Instant Messaging*), olekuteavet (*presence*) ja muid teenuseid.

SIP kasutab transpordikihis TCP- (*Transport Control Protocol*, usaldusväärne transpordiprotokoll) või UDP- (*User Datagram Protocol*, mitteusaldusväärne transpordi protokoll) protokolli ja võrgukihis IP-protokolli (IPv4 või IPv6). 

SIP on HTTP (*Hypertext Transfer Protocol*) protokollil põhinev tekstipõhine protokoll, mille eesmärk on olla sõltumatu edastatavast meediast. SIP-protokolli eeliseks on lihtsus ja loetavus, puuduseks on tekstipõhisest vormingust tulenev suur andmemaht.

## SIP meetodid

SIP on päring-vastus tüüpi protokoll (nagu HTTP). SIP-päringuid nimetatakse meetoditeks. 2002. aastal kirjeldas IETF esimeses FRC-s (RFC 3261) 6 SIP meetodit:
* **REGISTER** – kasutaja registreerumine SIP teenuste kasutamiseks
* **INVITE** – multimeediaseansside (kõne, kiirsõnumite edastamise vms) algatamine
* **OPTIONS** – serveri või kliendi võimaluste pärimine
* **ACK** – tegevuse kinnitamine
* **CANCEL** – poolelioleva tegevuse tühistamine
* **BYE** – seansi lõpetamine

Hiljem on lisandunud mitmeid SIP meetodeid:
* **PRACK** – esialgne kinnitus eelneva sõnumi kohalejõudmise kohta RFC 3262.
* **SUBSCRIBE** – sündmusest teavitamiseks registreerumine RFC 3265, kasutatakse näiteks olekuinfo vaatamiseks registreerumiseks.
* **NOTIFY** – kasutajate teavitamine sündmusest RFC 3265, kasutatakse näiteks kasutajate teavitamiseks olekuinfo muudatusest.
* **PUBLISH** – serveri teavitamine sündmusest RFC 3903, kasutatakse näiteks olekuinfo serveri teavitamiseks kasutaja olekuinfo muudatusest.
* **MESSAGE** – kiirsõnumi saatmine RFC 3428.

## SIP vastused

SIP-päringutele saadetakse alati vastused, mis koosnevad kolmest numbrist ja tekstilisest selgitusest.
Vastused jagunevad järgmistesse kategooriatesse:
* **1XX** – esialgne vastus, kinnitab päringu kättesaamist (näiteks 100 Trying, 180 Ringing, 183 Session Progress).
* **2XX** – edukas vastus, päring on edukalt kättesaadud ja aktsepteeritud (näiteks 200 OK).
* **3XX** – suunamine, päringu lõpetamiseks on vaja täiendavaid tegevusi (näiteks 302 Moved Temporarily).
* **4XX** – kliendi viga, päring oli vigane või server ei suuda päringut töödelda (näiteks 487 Request Terminated).
* **5XX** – serveri viga, server ei suutnud korrektset päringut töödelda (näiteks 504 Server Time-out).
* **6XX** – globaalne viga, server ei suuda päringut töödelda (näiteks 604 Does Not Exist Anywhere).

## SIP päringu vorming

SIP sõnumi päises märgitakse järgmised väljad:
* **Algusrida** – sisaldab päringu meetodit, SIP URI-t (päringu adressaati) ja protokolli versiooni.
* **To** – päringu saaja URI.
* **From** – päringu saatja URI.
* **Contact** – sõnumi saatja või edastaja kontaktaadress.
* **Via** – Via väljale salvestatakse kõik proksiserverid, mida SIP päring läbib, et saata vastus tagasi läbi samade proksiserverite.
* **Cseq** – unikaalne sõnumi järjekorranumber, mis sisaldab meetodi nime ja mille alusel viiakse vastavusse SIP päring ja vastus.
* **Call-ID** – SIP sõnumi unikaalne tunnus.
* **Route/Record-route** – proksiserverid kasutavad neid välju selleks, et salvestada siia oma aadress ja tagada sellega kogu seansi käigus saadetavate päringute edastamine läbi samade proksiserverite (kasutatakse olekuga prokside korral).

Lisaks päisele on SIP sõnumil ka sisu. Iga SIP sõnum ei pruugi sisaldada sisu. Seansi algatamise päringu (INVITE) sisu osa on reeglina SDP (Session Description Protocol) vormingus ja sisaldab infot algatatava seansi meedia kohta. SDP on spetsifitseeritud dokumendis RFC 2327, mida on hiljem täiendatud dokumendis RFC 3264.
INVITE sõnumi SDP osa sisaldab muuhulgas järgmist infot:
* seansi omaniku aadress; 
* edastatava meedia tüüp, port ja helistaja poolt toetatavate koodekite loetelu (videokõne korral võivad video ja audio koodekid ja pordid olla erinevad);
* QoS (Quality of Service, teenuse kvaliteet) indikaatorit.

SIP päringu näide:

`

Via: SIP/2.0/UDP 195.250.168.178:5060;branch=z9hG4bKo9k1h800cg2ggakqv1g1.1

To: "Testkasutaja" <sip:kasutaja2@domeen.ee;transport=udp>;

From: <sip:kasutaja1@domeen.ee>;

	tag=745694714-1203317338417-

Call-ID: BW0848584171802081154935902@192.168.26.4

CSeq: 363247769 INVITE

Max-Forwards: 7

Content-Length: 131

Contact: 

Content-Type: application/sdp

Allow: ACK, BYE, CANCEL, INFO, INVITE, OPTIONS, PRACK, REFER, NOTIFY

Accept: multipart/mixed

Accept: application/media_control+xml

Accept: application/sdp

Accept: application/x-hotsip-FileTransfer+xml

Privacy: none

Session-Expires: 1800

Min-SE: 900

	v=0

	o=BroadWorks 721590 1 IN IP4 123.456.789.0

	s=-

	c=IN IP4 123.456.789.0

	t=0 0

	m=audio 50402 RTP/AVP 8 18 4

	a=ptime:20
`

## SIP serverid

Kuigi SIP terminalid suudavad omavahel suhelda ilma muude seadmete vahenduseta (P2P SIP ehk *peer-to-peer* SIP), käib reaalselt enamik suhtlusest siiski läbi serverite.
SIP servereid on erinevat tüüpi:
* **SIP Registrar** – tegeleb kasutaja registreerumisega ehk säilitab seose kasutajatunnuse ja kasutaja terminali IP-aadressi vahel.
* **SIP Proxy** – server, mis suunab SIP päringu edasi. Võib muuta päringu adressaati, salvestada enda andmed Route välja vms.
* **SIP Redirect Server** – kasutatakse suunamiste korral. Redirect Server edastab seansi algatajale kasutaja uue asukoha, mille alusel algatatakse seanss uuele aadressile.
* **SIP UA** (User Agent) – server, mis käitub nagu SIP terminal ehk vastab päringule lõpliku vastusega.
* **SIP B2BUA** (Back-to-back User Agent) – server, kus on kaks SIP User Agentit kokku ühendatud. Vastab sisenevale päringule lõpliku vastusega ja algatab ise täiesti uue päringu. Kasutatakse olukordades, kus on vaja rakendada keerulist teenusloogikat ja muuta mitmeid SIP päringu välju (To, From, Call-ID jne) või SIP meetodit.

## SIP URI

SIP URI (Uniform Resource Identifier) on unikaalne kasutajatunnus, mille alusel kasutajat identifitseeritakse. Igal kasutajal on SIP URI, mida kasutatakse seansside ühendamisel sellele kasutajale.
SIP URI kuju on sama mis e-posti aadressil ning see koosneb kasutajatunnusest ja domeenist (näiteks kasutaja@domeen.ee).
Päringute marsruutimiseks võib kasutada SIP URI kujul sip: kasutaja@domeen.ee või sip:kasutaja@193.214.150.100. Esimene variant vajab päringu marsruutimiseks DNS-päringuid, teine variant ei vaja, sest sisaldab juba domeeni IP-aadressi.
SIP-URI võib sisaldada ka telefoninumbrit (näiteks päringute marsruutimiseks telefonivõrgust või mobiilivõrgust). Sel juhul on SIP URI kujul sip: +3721234567@domeen.ee;useer=phone.
Lisaks SIP URI-le võib kasutajal olla ka TEL URI. Sel juhul väljendub kasutajatunnus telefoninumbri kujul, näiteks tel: +3721234567. See on vajalik seansside ühendamiseks telefonivõrgust või mobiilivõrgust.

TEL-URI korral on vaja telefoninumbri ja kasutajatunnuse vastavuse leidmiseks DNS/ENUM funktsiooni (TElephone NUmber Mapping).

## DNS-päringud

Selleks, et kasutajatunnuse või telefoninumbri alusel päringuid marsruutida, on vaja teada servereid, mis antud teenuse või kasutajaga tegelevad. Seda infot hoiavad DNS- (Domain Name System) serverid. 
**NAPTR (NAming Authority Pointer)** päringut kasutatakse, et leida, millist teenust ja protokolli võrk toetab. Näiteks päring NAPTR domeen.ee annab vastuseks _sip._udp.domeen.ee
Järgmisena tehakse **SRV (Service Record)** päring, et leida server/port, kuhu päring ühendada. Näiteks päringule SRV _sip._udp.domeen.ee tuleb vastus proxy.domeen.ee:5060 (5060 on vaikimisi SIP port).
Edasi tehakse päring proxy.domeen.ee IP-aadressi leidmiseks.

Kui päringus kasutatakse TEL URI-t, tehakse esmalt NAPTR päring telefoninumbrile vastava kasutajatunnuse leidmiseks. Selleks viiakse telefoninumber E.164 kujule (+3721234567), pööratakse numbrite järjestus ümber ja lisatakse lõppu e164.arpa. Näiteks numbrist +3721234567 saadakse 7.6.5.4.3.2.1.7.3.2.e164.arpa. Selle alusel tehakse NAPTR päring, millega saadakse teada telefoninumbrile vastav kasutajatunnus (näiteks kasutaja@domeen.ee).

## SIP-sõnumite marsruutimine

SIP-teenuste kasutamiseks peab kasutaja alati registreeruma. Selleks saadab kasutaja REGISTER päringu SIP Registrar serverisse, mis salvestab kasutaja oleku (registreerinud) ning seob kasutaja SIP URI ja terminali IP-aadressi.

Kui kasutaja a@domeen1.ee tahab ühendust võtta kasutajaga b@domeen2.ee, siis saadab kasutaja a päringu (INVITE) enda domeeni (domeen1.ee) teenindavale proksi serverile. Juhul kui SIP sõnumis puudub Route väli, vaatab proksi päringu URI-t. DNS päringutega leitab proksi kasutaja b domeeni teenindava serveri (domeen2.ee) ja edastab selle vastava võrgu proksile. domeen2.ee proksi küsib registrar serverilt kasutaja b asukohta (IP-aadressi) ja ühendab päringu kasutajale b.

SIP päringuid marsruuditakse:

1. Route välja järgi, selle puudumisel

2. SIP-URI järgi kasutades DNS (Domain Name System) päringuid.

Vastused marsruuditakse Via päise järgi:
* proksi lisab päringus enda aadressi Via väljale esimeseks
* vastuse marsruutimisel vaadatakse esimest Via päist: kui seal on antud proksi aadress, siis see eemaldatakse, seejärel saadetakse vastus järgmise Via päisega proksile.

Juhul kui proksi ei soovi jääda päringuid vahendama, siis ta ei lisa enda aadressi päringus Via väljale. Sellisel juhul marsruuditakse päringud vastavalt Contact väljas olevale infole. Selliseid proksisid nimetatakse **olekuta proksideks**. Proksid, mis jäävad päringuid vahendama kogu seansi ajaks, nimetatakse **olekuga proksideks**.

## Viited

1. IETF. SIP: Session Initiation Protocol. RFC 3261. http://www.ietf.org/rfc/rfc3261.txt.

2. Reliability of Provisional Responses in the Session Initiation Protocol (SIP). RFC 3262. http://www.ietf.org/rfc/rfc3262.txt.

3. Session Initiation Protocol (SIP)-Specific Event Notification. RFC 3265. http://www.ietf.org/rfc/rfc3265.txt.

4. Session Initiation Protocol (SIP) Extension for Event State Publication. RFC 3903. http://www.ietf.org/rfc/rfc3903.txt.

5. Session Initiation Protocol (SIP) Extension for Instant Messaging. RFC 3428. http://www.ietf.org/rfc/rfc3428.txt.

6. SDP: Session Description Protocol. RFC 2327. http://www.ietf.org/rfc/rfc2327.txt.

7. An Offer/Answer Model with the Session Description Protocol (SDP). RFC 3264. http://www.ietf.org/rfc/rfc3264.txt

## Kirjandus

* Sinnreich, Henry ja Johnston, Alan B. Internet Communications using SIP. Indianapolis : Wiley, 2006
* Camarillo, Gonzalo ja Miguel, Garcia-Martin A. The 3G IP Multimedia Subsystem (IMS) : merging the Internet anf cellular worlds. 3rd. West Sussex : John Wiley & Sons Ltd, 2008.

## Välislingid
* SIP
* SIP Introduction
* SIP Center