VoIP

Martin Vejnár, xvejnar1@fi.muni.cz

Obsah

Přehled

Pod termínem Voice over IP rozumíme rodinu protokolů, používaných k přenosu mutimediálních dat přes paketovou síť v reálném čase.

Dva soupeřící standady pro přenos VoIP jsou SIP (od IETF) a H.323 (od ITU). Dle Wikipedie se H.323 většinou používá na páteřních sítích telekomunikačních providerů, v menším měřítku se uplatňuje SIP. Budeme se tedy zabývat protokolem SIP.

Chceme-li dělat něco složitějšího, než jen propojovat dva klienty přímo mezi sebou, například chceme vytáčet své kolegy v práci podle jména (nikoliv ale pomocí hostname!), potřebujeme mít buď nějaký proxy server nebo ústřednu (PBX).

SIP

Session Initiation Protocol, jak už název napovídá, je protokol, který se stará o navazování a správu multimediálních spojení. SIP není vázaný na konkrétní síťový prokol a může běžet nad TCP, UDP nebo SCTP.

Protokol SIP je designem podobný protokolu HTTP -- jedná se o textový protokol založený na principu request/response. Kazždý požadavek nebo odpověď s sebou může nést sadu doplňujících atributů.

Při navazování spojení pošle klient požadavek INVITE, buď přímo druhému klientovi, nebo častěji některému proxy serveru. Proxy servery fungují jako ústředny a požadavky směrují správným směrem, například pomocí DNS nebo pomocí své lokální databáze. Požadavek INVITE v sobě nese URI adresáta (například sip:avakar@technika.junior.cz) a také funguje jako nosič pro SDP (Session Description Protocol). SDP v sobě obsahuje detaily o mediálním spojení a nabídku použitelných protokolů a kodeků apod.

Po přijetí požadavku INVITE pošle druhá strana spojení odpověď "ringing" a zobrazí uživateli informaci o příchozím spojení. Je-li spojení uživatelem akceptováno, odešle druhá strana požadavek OK, spolu s SDP popisující vypraný protokol.

Vlastní komunikace potom probíhá po dedikovaném spojení skze RTP (Real-time Transport Protocol).

Pokud je v jádře zapnutá podpora SIP pro iptables, jsou RTP spojení klasifikována jako related a firewallem či NAT prochází bez problém.

Mobilita

Aby se uživatel mohl volně pohybovat a přesto jeho URI zůstávalo stejné, umožňuje SIP protokol registrovat uživatele u svých proxy serverů pomocí požadavku REGISTER. Takto si proxy server může naplňovat databázi svých uživatelů.

SIP klienti

Pro vyzkoušení SIPu je možné použít libovolný SIP softphone, který nevyžaduje použití proxy serveru. Já jsem zkoušel Linphone, zejména proto, že běží i na Windows.

Ústředna

V současné době asi nejoblíbenější implementací PBX je softwarový balík Asterisk. Asterisk je kompletní ústředna, která umí propojovat různé druhy VoIP sítí a dokonce (za pomoci speciálního hardwaru) se připojovat do analogové telefonní sítě. K Asterisku existuje kvalitní (ale rozsáhlá) dokumentace ve formě elektronické knihy.

Po instalaci Asterisku (v gentoo emerge -v asterisk) je akorád potřeba nakonfigurovat, co se má stát, když přijde příchozí volání na adresu sip:neco@moje-domena.cz. Jméno "neco" se v Asterisku nazývá extension, a příslušné akce se konfigurují v souboru extensions.conf.

[globals]

[general]

[default]
exten => _hello!,1,Playback(hello-world)
exten => _hello!,n,Hangup()

Výše uvedená konfigurace nastaví Asterisk tak, aby hovory na adresu sip:hello@moje-domena.cz nebo sip:hellocokoliv@moje-domena.cz byly odpovězeny, byl do nich přehrán soubor hello-world a potom bylo spojení ukončeno.

Chceme-li některým uživatelům umožnit volat jinou množinu čísel, musíme je zaregistrovat. To uděláme v souboru sip.conf.

[general]

[avakar]
type=friend
context=my_context
host=dynamic
secret=heslo

Takto se k Asterisku může připojit uživatel avakar@moje-domena.cz, pokud se mu ovšem podaří autentizovat se heslem. Upravíme-li soubor extensions.conf takto:

[globals]

[general]

[default]
exten => _hello!,1,Playback(hello-world)
exten => _hello!,n,Hangup()

exten => avakar,1,Dial(SIP/avakar)

[my_context]
exten => echo,1,Echo()
exten => echo,n,Hangup()

Zavolá-li uživatel avakar adresu sip:echo@moje-domena.cz, bude slyšet sám sebe. Navíc pokud kdokoliv jiný zavolá adresu sip:avakar@moje-domena.cz, přesměruje Asterisk volání na telefon uživatele avakar. (Ten se předtím ale musel zaregistrovat pomocí SIP požadavku REGISTER.)

 Literatura