Voice over IP - ICT a elektro pro praxi

Transkript

Voice over IP - ICT a elektro pro praxi
Výukový program:
ICT a elektrotechnika pro praxi
Voice over IP
Miroslav Vozňák
Filip Řezáč
2010
© Miroslav Vozňák a Filip Řezáč, 2010
Fakulta elektrotechniky a informatiky
Vysoká škola báňská – Technická univerzita Ostrava
17. listopadu 15, 708 00 Ostrava Poruba
Výukový program:
ICT a elektrotechnika pro praxi
Název modulu:
Voice over IP
Název:
Autor:
Vydání:
Místo:
Rok:
Vydavatel:
Počet stran:
Voice over IP
Miroslav Vozňák, Filip Řezáč
první
Ostrava
2010
VŠB – Technická univerzita Ostrava
110
Neprodejné
2
PŘEDMLUVA
Výukový text s názvem Voice over IP reflektuje na současný trend hlasových komunikačních
systémů. VoIP lze chápat jako technologii, která využívá prostředky sítě Internet k přenosu hlasu,
v aplikační rovině pak vidíme IP telefonii jako aplikaci nad VoIP. První pokusy s přenosem hlasu,
tehdy v prenatálním věku Internetu, uskutečnil Danny Cohen v roce 1977. Komerční úspěch
Internetu znamenal podnět k intenzivnímu vývoji v této oblasti a přijetí mezinárodně uznávaných
standardů, a to především H.323 v roce 1996 z organizace ITU-T a SIP doporučení v roce 1999
z dílny IETF. V naší publikaci se budeme orientovat na SIP, a to vzhledem k faktu, že SIP se stal defacto stěžejním protokolem pro IP telefonii a s přihlédnutím k rozsahu publikace a užitné hodnotě
informací byl pro autory jednoznačnou volbou. V první části se čtenář seznámí s nezbytnými
teoretickými základy VoIP technologie a SIP protokolu, které zužitkuje v druhé části věnované
Asterisku. Tak jako je Apache symbolem úspěšného projektu webového serveru, tak analogicky
Asterisk představuje v IP telefonii uznávané komunikační řešení pro nasazení IP telefonie. Autorský
kolektiv si je vědom, že nejlepší cestou k pochopení výkladu a souvislostí je experiment, a proto je
třetí část publikace věnována praktickým příkladům.
Na publikaci se podíleli Miroslav Vozňák a Filip Řezáč. Prvně uvedený je garantem publikace a
je na pozici docenta na Fakultě elektrotechniky a informatiky VŠB-Technické univerzity v Ostravě.
Filip Řezáč je asistentem na stejné fakultě, oba autoři působí na Katedře telekomunikační techniky.
Poděkování za pomoc při realizaci publikace patří Martinu Tomešovi, který se jako student
Fakulty elektrotechniky a informatiky v Ostravě podílel na tvorbě obrázků publikace a praktických
příkladech konfigurace Asterisku.
Miroslav Vozňák a Filip Řezáč
V Ostravě, Listopad 2010
3
OBSAH
1 Přenos sítí Internet v reálném čase
7
1.1 Real Time Protocol
7
1.2 Timestamp a rozptyl zpoždění
9
1.3 Stanovení zpoždění z RTP
10
1.4 Řídící protokol RTCP
11
1.5 Zabezpečení přenosu RTP
11
1.5.1 Zabezpečení pomocí SRTP
11
1.5.2 Návrh vylepšení SRTP pomocí ZRTP
16
1.6 Přenos DTMF a jiných tónů přes RTP
17
1.7 Audio v přenosovém řetězci od odesílatele k příjemci
17
1.8 Nároky na přenos audia v IP sítích
19
1.9 Kodeky
20
1.9.1 PCM
21
1.9.2 ADPCM
22
1.9.3 LPC
22
1.9.4 CELP
23
2 Protokol SIP
26
2.1 Základní popis protokolu SIP
26
2.2 Prvky SIP řešení
28
2.2.1 User Agent a Back to Back User Agent
28
2.2.2 SIP Proxy Server
30
2.2.3 SIP Registrar Server
32
2.2.4 SIP Redirect Server
32
2.3 SIP žádosti a odpovědi
33
2.3.1 Základní popis SIP hlavičky typické žádosti
33
2.3.2 SIP metody
35
2.3.3 SIP odpovědi
36
2.3.4 Transakce
39
2.3.5 Dialog
40
2.3.6 Transakce a dialog v příkladu
42
2.3.7 SIP časovače a retransmise
44
2.3.8 Zabezpečení v SIPu
45
2.4 Registrace
46
2.5 Směrování
47
2.5.1 Směrování dle RURI a Via
48
2.5.2 SIP trapezoid
49
2.5.3 Udržení SIP Proxy v signalizační trase
53
4
2.6 SDP- protokol popisu relace
54
2.6.1 Konstrukce položek SDP pro komunikaci SIP/SDP
56
2.6.2 Offer/Answer model
57
3 Asterisk
59
3.1 Popis Asterisku
59
3.1.1 Režimy Asterisku
60
3.1.2 Kodeky a prokoly Asterisku
61
3.1.3 Verze Asterisku
62
3.2 Instalace Asterisku
62
3.2.1 Instalace pomocí balíčku s příponou .deb
63
3.2.2 Instalace pomocí balíčku s příponou .rpm
63
3.2.3 Instalace pomocí kompilace zdrojových kódů
64
3.3 Úvod do konfigurace SIPu a plánu volby
67
3.3.1 Konfigurace Asterisku
68
3.3.2 Spuštění, zavolání „Hello—World“ a zastavení Asterisku
68
3.3.3 Volání „Hello-World“ pomocí SIP telefonu
69
3.3.4 Minimální konfigurace Asterisku se dvěma SIP účty
70
3.3.5 Nastavení práv na základě kontextů
71
3.4 Dialplan
72
3.4.1 Kontexty - Contexts
72
3.4.2 Pravidla - Extensions
72
3.4.3 Priority - Priorities
73
3.4.4 Vzory – Pattern Matching
74
3.4.5 Vložené kontexty – Include Statements
75
3.4.6 Časové Vložené kontexty
75
3.4.7 Proměnná ${EXTEN} a funkce ${CALLERID(num)}
76
3.4.8 Programová struktura
76
3.4.9 Aplikace Set ( )
77
3.4.10 Štítky a Goto ( )
77
3.4.11 Smyčky a While ( )
78
3.4.12 Podmínka a Gotoif ( )
78
3.4.13 Podprogramy a Gosub ( )
79
3.4.14 Proměnné
79
3.4.15 Makra
81
3.5 Asterisk Extension Language (AEL)
82
3.5.1 CLI příkazy pro AEL
82
3.5.2 Aelparse
82
3.5.3 Srovnání extensions.conf s extensions.ael
82
3.5.4 Kontexty, extensions a priority v AEL
83
3.5.5 Vložené kontexty – Include Statements v AEL
83
5
3.5.6 Štítky, goto a přeskakování v AEL
84
3.5.7 Podmínky v AEL
85
3.5.8 Smyčky v AEL
87
3.5.9 Makra
88
3.5.10 Filtrování na základě ID volajícího
89
3.6 Voicemail
89
3.7 IVR – Interactive Voice Reponse
90
3.7.1 Jednoduché IVR
91
3.7.2 Neplatný vstup (extension i)
91
3.7.3 Pauzy
91
3.7.4 Víceúrovňové IVR
92
3.8 Databáze Asterisku
93
3.8.1 Zápis hodnot do databáze
93
3.8.2 Čtení hodnot z databáze
94
3.8.3 Mazání hodnot z databáze
94
3.8.4 Přístup do databáze z CLI
94
3.8.5 Zápis hodnot do databáze pomocí CLI
94
3.8.6 Čtení hodnot z databáze pomocí CLI
94
3.8.7 Mazání hodnot z databáze pomocí CLI
95
3.8.8 Zobrazení obsahu databáze v CLI
95
3.8.9 Přístup do databáze z příkazové řádky
95
3.8.10 Záloha databáze
96
3.8.11 Příklad přesměrování
96
3.9 Služby Asterisku
97
4 Asterisk v praktických příkladech
99
4.1 Nastavení SIP účtů
99
4.2 Nastavení IAX účtů
100
4.3 Dialplan a jeho nastavení
100
4.4 Další užitečná nastavení pro Asterisk
101
4.4.1 Rozšířené nastavení SIP – povolení videopřenosu
101
4.4.2 Peering mezi dvěma Asterisky
101
4.4.3 Zabezpečení médií v Asterisku pomocí SRTP
104
4.4.4 Zabezpečení signalizace v Asterisku pomocí SIPS
105
5 Literatura
107
6 Rejstřík
109
6
Přenos sítí Internet v reálném čase
1
Transportní protokoly Internetu nabízí spolehlivou službu s potvrzováním doručených datagramů
pomocí spojově orientovaného protokolu TCP (Transmission Control Protocol) anebo nespolehlivou
službu na nespojově orientovaném protokolu UDP (User Datagram Protocol). UDP protokol přidává k
IP záhlaví důležitá pole, kterými jsou: zdrojový a cílový port služby, délka přenášených dat včetně
záhlaví a kontrolní součet pseudozáhlaví. Nepochybně stojí za zmínku, že UDP nezaručuje doručení
ve správném pořadí, což některým aplikacím přináší komplikace. Je zřejmé, že u požadavku na realtime přenos není možné použít službu s potvrzováním datagramů, neboť informace pozbývá svou
platnost s časem a pro IP telefonii je nutné použit transportní službu zajišťovanou UDP [voz92]. UDP
protokol je vhodnější pro Real-time aplikace, umožňuje sice nespolehlivé, ale rychlé doručování. I
tady ovšem najdeme nedostatky a potřebu adaptace pomocí dalšího protokolu nad UDP, řešením je
protokol přenosu v reálném čase RTP, struktura zprávy je na zobrazena na obr. 1. [voz92].
Obr.1. Struktura zprávy pro real-time přenos.
1.1
Real Time Protocol
Real Time Protocol je označován jako protokol aplikační vrstvy, který využívá transportní protokol
UDP, ale dle účelu a obsahu polí hlaviček nese důležité znaky transportního protokolu a tak se jeví
logičtější ho zařadit na transportní vrstvu hned nad UDP, jehož přenos vylepšuje. Tento pohled je ale
spíše filozofický a neřeší nic zásadního, pojďme se podívat na jednotlivá pole RTP a způsob
adaptace real-time aplikací na přenos v Internetu, viz. obr. 2. RTP protokol především zajišťuje
seřazení zaslaných paketů (Sequence Number) a jejich časové značkování (Timestamp), další
vlastnost, která ho řadí do transportní vrstvy je multiplexování a demultiplexování. Pokud si vezmeme
postup odesílání hlasu v IP sítí, tak tok bitů digitalizovaného hlasu ve zvoleném formátu (např. PCM)
je naporcován do bloků (typicky 20 B až 160 B) a každý blok je opatřen hlavičkou RTP o velikosti 12
B, dále se před hlavičku zařadí 8 B hlavičky UDP, viz. obr. 1. Tím je datagram připraven ke vstupu do
vrstvy síťové, kde dostane IP hlavičku o velikosti 20 B, celkově tedy bylo k užitečné zátěži přidáno 40
B. Jednotlivá pole RTP obsahují tyto položky, viz. obr.2 :
•
•
V je verze. Určuje verzi RTP,
P je doplnění. Pokud je nastaveno, paket obsahuje na konci jeden či více doplňkových oktetů,
které nenesou užitečná data,
7
•
•
•
•
•
•
•
•
X je rozšiřující bit. Pokud je nastaven, pak pevné záhlaví je následováno právě jedním
rozšířením záhlaví, které má definovanou strukturu,
CC je CSRC count obsahuje číslo identifikátoru příspěvku zdroje,
M je značka. Interpretace značky je různá. Lze jí použít např. jako označení konce rámce v
paketovém toku, na své využití ještě čeká.
Payload Type určuje formát užitečného zatížení RTP a stanovuje jeho význam pro aplikaci.
Další kód typu užitečného zatížení je definován dynamicky, ale ne již přes RTP,
Sequence number se zvyšuje o jeden pro každý vyslaný RTP paket Přijímač jej využívá pro
určení případné ztráty paketu a pro obnovení souslednosti paketu,
Timestamp vyjadřuje vzorkovací značku prvního oktetu v RTP paketu. Vzorkovací značka
musí být odvozena od lineárního časovače z důvodu synchronizace a korekce rozptylu
zpoždění (jitter). Rozlišení časovače musí být dostatečné pro požadovanou synchronizační
přesnost a pro zjištění jitteru příchozího paketu (např. jeden kmit za videosnímek není
dostačující),
SSRC identifikuje synchronizační zdroj. Tento identifikátor je zvolen náhodně s tím, že žádné
dva synchronizační zdroje v rámci jedné RTP relace nemají stejný SSRC identifikátor,
CSRC je identifikační seznam přispívajících zdrojů. Identifikuje přispívající zdroj z důvodu
užitečné informace obsažené v tomto paketu.
Obr.2. Jednotlivá pole RTP dle specifikace RFC 1889.
Samotný přenos audia/videa v RTP bývá doplněn o dohledový protokol RTCP (Real Time
Control Protocol), který nese statistické informace o průběhu přenosu. Port pro RTCP je nastaven o
jedničku vyšší než RTP, minimální doba pro odeslání RTCP je stanovena na 2 sec., např. u G.711 by
to znamenalo jeden paket RTCP na sto paketů RTP, pro čísla portů platí (1), přičemž portům RTP
jsou přidělována sudá čísla.
port_RTCP=port_RTP+1
(1)
V současné době prošel Real-Time protokol třemi verzemi, a to:
•
•
•
RFC 1889, z roku 1996 (Transport Protocol for Real-Time Applications), původní doporučení;
RFC 3550, z roku 2003, drobná vylepšení oproti RFC 1889 především v části dohledu nad
RTP tokem, tím původní RFC 1889 zastaralo;
RFC 3711, z roku 2004, specifikuje zabezpečený přenos RTP jako SRTP (Secure Real-time
Transport Protocol).
8
Hlavička RTP může být komprimována ze 40B na 2-3B s použitím kompresního protokolu cRTP
(compressed RTP), jelikož je vyžadována podpora na obou stranách, tak je použití víceméně
omezeno na dvoubodové spoje a cRTP není příliš rozšířen [coli]. Typickým portem RTP je 5004 a
RTCP tím pádem 5005, ale v zásadě může být použit jakýkoliv port vyšší než 1024, např. Cisco
zařízení alokují pro RTP porty v rozmezí 16384 až 32767.
1.2
Timestamp a rozptyl zpoždění
RTP pakety jsou odesílány obvykle v pravidelných intervalech ∆t [s]. Pokud zachytíme RTP tok, tak
tento interval zjistíme z časových značek (timestamp). Pro timestamp platí, že údaje v políčku jsou
odvozeny od lineárního časového zdroje. Interval odesílání (timing) se z RTP paketů vypočte ze
dvou po sobě jdoucích časových značek dle rovnice (2).
∆t=
timestamp{N+1} − timestamp{N}
(2)
sampling_frequency
Vzorkovací kmitočet je obvykle 8KHz, na obrázku níže jsou zachyceny RTP pakety s PCM
kódováním G.711-Alaw. Rozdíl dvou po sobě jdoucích údajů zachycených na obr.3. v položce Time
úplně vpravo (timestamp) je 160, pochopitelně odcházejících ze stejné IP adresy (source). Po
vydělení vzorkovacím kmitočtem 8KHz dostáváme 20 ms, což je časování odesílání paketů ze zdroje.
V uvedeném případě můžeme očekávat tedy 50 paketů za sekundu.
Obr. 3. Inkrementace hodnoty pole timestamp.
Ačkoliv datagramy byly odeslány v intervalech 20 ms, tak pokud bychom určili rozdíly mezi
vyslanými na straně odesílatele a srovnali je s rozdíly mezi přijatými datagramy na straně příjemce,
zjistili bychom, že se liší. Jelikož pakety neměly stejné podmínky přenosu, způsobené především
odlišným časem stráveným ve frontách na směrovačích, tak došlo k rozdílu mezi časem skutečného
a očekávaného příchodu, tento rozdíl označujeme jako rozptyl (jitter).
Označme Si jako hodnotu časové značky v i-tém RTP paketu (timestamp) a Ri čas skutečného
doručení paketu i příjemci, potom pro dva dva pakety i a i-1 bude platit pro výpočet rozptylu jejich
doručení příjemci rovnice:
Di = (R i − R i −1 ) − (Si − Si −1 ) = (R i − Si ) − (R i −1 − Si −1 )
(3)
Podmínkou platnosti vztahu je, že RTP pakety jsou přijaty z jednoho zdroje synchronizace (SSRC
pole v RTP hlavičce).
9
Obr. 4. Rozptyl zpoždění zjištěný při příjmu RTP toku.
Zatímco Di [ms] představuje okamžitý jitter, tak v praxi se využívá k sledování rozptylu klouzavý
průměr, který reflektuje jeho dosavadní průběh, na druhé straně je ale potřebnost rychlé
konvergence k aktuálním hodnotám [cad]. Pro tento účel se nejčastěji používá následující vztah pro
výpočet sledované hodnoty rozptylu Ji, přičemž empiricky získaná hodnota 16 zahrnující průměr 16-ti
předchozích rozptylů reflektuje vlastnosti zmíněné v předchozí větě.
J i = J i −1 +
1.3
[ Di − J i −1 ]
15 D
= J i −1 ⋅ + i
16
16 16
(4)
Stanovení zpoždění z RTP
RCTP XR definuje rozšířené posílání zpráv XR (Extended Reports) v rámci dohledu nad RTP tokem,
které zajišťuje protokol RTCP (Real Time Control Protocol). RTCP XR je obsažen v doporučení RFC
3611 z konce roku 2003, XR pakety jsou složeny z jednotlivých bloků oznámení (report blocks) a
jedním z těchto bloků je i VoIP Metrics Report Block, který uceleně informuje o kvalitativních
parametrech VoIP [voz70], [voz73] a [voz92].
OWPD =
RTD + ESD(A) + ESD(B)
2
(5)
Jednosměrné síťové zpoždění OWPD (5) může být stanoveno z RTD (Round Trip Delay) [ms],
což je doba oběhu zprávy od odesílatele k příjemci a zpět neboli odezva. Jelikož je nutné vyjádřit
celkové E2E zpoždění, tak RFC 3611 zavádí parametr odhadu systémového zpoždění ESD
(Estimated System Delay) [ms], který je definován součet všech přírustků zpoždění na zařízení.
RTCP-XR stanovuje, že na straně vysílací je v ESD(A) zahrnuto celkové zpoždění vzniklé
kódováním a paketizací, na straně přijímací je ESD(B) tvořenou součtem nastavené doby
mezipaměti vyrovnání rozptylu (de-jitter buffer) a zpožděním při dekódování. Je zaveden parametr
jednosměrného symetrického zpoždění hlasové cesty OWPD (one way symmetric voice path delay),
který je vyjádřen vztahem (5).
10
1.4
Řídící protokol RTCP
Původní RFC 1889 pro RTP z ledna 1996 vydrželo poměrně dlouho a další RFC pro RTP bylo
uvolněno až v červnu roku 2003. Implementace RTP dle RFC 3550 si dokáže poradit se starší RFC
1889, neboť ve formátu paketu či v obsahu hlaviček nedošlo ke změnám, změny jsou v RTCP, čili
v protokolu dohledu toku médií. Změnila se pravidla a algoritmy užití protokolu, nejvýznamnější
změnou je specifikace typů zpráv RTCP a rozšíření týkající se pravidel odesílání RTCP (jedná se o
algoritmus časování odesílání RTCP). RTCP shromažďuje statistiky přenosu na RTP, informace o
množství odeslaných bajtů a počtu paketů, ztracených paketů, rozptylu zpoždění. Dle RFC 3550 je
definováno celkem pět typů zpráv:
•
•
•
•
•
1.5
SR (Sender Report) – soubor statistik od odesílatelů, posílá se aktuální identifikace zdroje
synchronizace (SSRC), časová značka (timestamp), počet odeslaných paketů a odeslaných
bajtů,
RR (Receiver Report) – soubor statistik od příjemců, obsahuje jednak podíl ztracených paketů
k celkovému množství očekávaných, počet ztracených paketů, aktuální sekvenční číslo (SN),
jitter, poslední timestamp a čas, který uběhl od poslední zprávy SR,
SDES (Source DEScription) – vlastnosti odesílatelů RTP komunikace (jejich „vizitky“), jednak
je to SSRC a jméno (obvykle URI),
BYE (End message) – signalizuje ukončení relace;
APP – funkce specifické pro jednotlivé aplikace.
Zabezpečení přenosu RTP
Použitím nešifrovaného přenosu pomocí RTP zvyšujeme riziko odposlechu hovoru [voz191],
[voz193]. Oblíbený síťový softvérový analyzátor Wireshark umí ze zachyceného RTP toku
rekonstruovat původní zvukovou stopu. Získání zvukové stopy z RTP paketů a její následné přehrání
či uložení, je v aplikaci Wireshark možné pouze u kodeků PCM A-law a µ-law, ovšem existuje řada
placených analyzátorů, které zpracují pro přehrání audio signál i s jinými kodeky (např. Observer).
Nešifrovaný přenos RTP je proto velkým hazardem a zabezpečení je nezbytné. U transportních
protokolů užívaných pro multimédia musíme hlavně brát zřetel na to, že komunikace pomocí těchto
protokolů probíhá v reálném čase, proto i zabezpečovací techniky musí byt implementovány tak, aby
vznikalo minimální časové zpoždění [voz138], [voz166] a [voz194].
1.5.1
Zabezpečení pomocí SRTP
Stejně jako u signalizačních protokolů, tak ani nejpoužívanější protokol RTP neobsahuje ve svém
základu žádné ochranné metody či mechanizmy, a proto byl v roce 2004 v RFC 3711 definován
protokol SRTP (Secure Real-time Transport Protocol). Formát paketu SRTP je odvozen od RTP,
šifrován je přenášený obsah užitečné informace (payload) a integrita polí hlaviček je zajištěna
pomocí autentizační značky (authentication tag), která je získána algoritmem HMAC-SHA-1. Do této
hašovací funkce vstupuje klíč auth_key a užitečná zátěž RTP, výstupem je autentizační značka,
která je přidána do poslední položky zabezpečeného SRTP datagramu.
11
Obr. 5. HMAC-SHA1 funkce
Použití SRTP autentizační značky je v RFC 3711 doporučeno vždy, zatímco další značka SRTP
MKI je nepovinná. MKI (Master Key Identifier) je prezentován jako hlavní klíč a může být použit pro
správu klíčů (key management), využití je pro účely obměny klíčů během relace, identifikuje
konkrétního hlavní klíč (master_key) užívaného v SRTP, z něj jsou odvozeny další důležité klíče, což
je zobrazeno v obr. 10. MKI zvyšuje bezpečnost, protože během jedné relace mohou být klíče
střídány [voz120].
Obr. 6. Obsah polí hlavičky SRTP
Podívejme se nyní na kryptografické mechanizmy užité v RFC 3711. SRTP definuje používání
režimu šifrování AES-CTR (Counter Mode) anebo AES-f8, přičemž výchozím módem je AES-CTR.
Povinně implementováno musí být šifrování AES-CTR a případně může být nepovinně podporován i
algoritmus AES-f8. Zatím jsme se s implementací algoritmu AES-f8 v SRTP dosud nesetkali, všichni
implementují AES-CTR. V případě f8 jde o aplikaci módu OFB (Output Feedback) a používá se pro
šifrování v UMTS sítích. U OFB se otevřený text sčítá na členu nonekvivalence s výstupním blokem
získaným aplikací blokové šifry, viz. obr. 7.
12
Obr. 7. Režim šifrování OFB.
První výstupní blok je vytvořen šifrovací funkcí CIPHK z inicializačního vektoru a je zároveň
vstupem do druhého bloku, kde po aplikaci šifrovacího algoritmu získáme druhý výstupní blok, který
je opět vstupem do dalšího.
Obr. 8. CTR režim šifrování.
Šifrový text získáme operací exkluzivní disjunkce, vstupními hodnotami jsou jednak bity
otevřeného textu a jednak bity z jednotlivých výstupních bloků. Jedná se o režim proudové šifry
(stream cipher mode) anebo exaktně řečeno, u OFB dochází k převodu blokové šifry na proudovou.
13
Čítačový režim CTR, viz. obr. 8, je zjednodušenou verzi zpětnovazební šifry OFB, kdy při
šifrování je namísto vazby na předchozí blok použita vazba s hodnotou inkrementálního čítače, viz.
obrázek. Opět dochází převodu blokové šifry na proudovou. CTR rovněž využívá inicializační
hodnotu, která se načte do vstupního registru (Counter 1) a po zašifrování funkcí CIPHK dostáváme
první výstupní blok, který se sčítá na členu XOR s otevřeným textem. Poté doje k aktualizaci čítače
(obvykle přičtením jedničky) a získáváme Counter 2, opět se opakuje jeho šifrování a operace
operací exkluzivní disjunkce s otevřeným textem. Aktualizace čítače je definována poměrně volně,
hodnota nemusí být inkrementována o jedničku, musí být ovšem splněna podmínka, že obsah čítačů
nesmí být stejný.
Obr. 9. Blokové schéma šifrování obsahu RTP
Podívejme se nyní na aplikaci AES-CTR v SRTP, viz. obr. 9. Důvěrnost přenášených dat v
paketu zajišťuje kryptografický primitiv AES, který funguje v tomto případě jako generátor
pseudonáhodných klíčů. Vstupem do generátoru je šifrovací klíč encr_key a inicializační vektor IV,
který sestává z kontrolního součtu salt key, SSRC a indexu paketu. Výsledný klíč je pomocí logické
operace XOR aplikován na nezašifrovaný obsah paketu, což odpovídá CTR režimu šifrování.
Inicializační vektor IV je získán z rovnice (6), ve které SSRC je identifikátor synchronizace, ks je sůl a
i je index SRTP paketu odesílatele
IV = (k s ⋅ 216 ) ⊕ (SSRC ⋅ 2 64 ) ⊕ (i ⋅ 216 )
(6)
Šifrovací klíče encr_key a salt_key, jsou získány opět pomocí AES-CTR, přičemž jsou odvozeny
z hlavního klíče master_key, viz. obr. 10. Problém je ovšem v distribuci hlavního klíče, který je
distribuován během sestavení spojení, v signalizaci SIP se používá SDP (Session Description
Protocol).
Pokud je šifrování provedeno na úrovni SIP, není pochopitelně nutné používat silné
kryptografické algoritmy pro přenášení informací uvnitř SIP, sice je to možné, ale je to zbytečné
plýtvání výpočetním výkonem. Jako ukázku naprosto nevhodného přenosu důležitého klíče
master_key uvádíme příklad zachycený při použití MS Messenger, pod obr. 10. Pro přenos klíče bylo
použito kódování base64, což je triviální způsob, který lze dekódovat ručně s papírem, tužkou a
ASCII tabulkou po ruce a navíc interoperabilita s dalšími zařízeními bude problematická.
14
Obr. 10. Odvození klíčů pro šifrovací schéma.
Použití base64 k ochraně hesla je přípustné pouze v případě zabezpečení SIP pomocí TLS
anebo S/Mime, což je vysvětleno v kapitole věnované zabezpečení SIPu.
k=base64:D0c7ni7jtkF+mJJY7bfXioIhnJe6rrckZ46GSTvXElE=
Použití v dalším příkladu je ukázkou správné implementace ochrany master_key v nešifrovaném
SIP protokolu. Pro utajení hlavního klíče během přenosu je použita kryptografická hašovací funkce
HMAC-SHA1. Využívá se způsobu vyjednávání klíčů popsaného v RFC 4568 z roku 2006, jedná se
o SDES (Security Descriptions for Media Streams) .
Session Description Protocol Version (v): 0
Owner/Creator, Session Id (o): 9911 8000 8000 IN IP4 158.196.81.105
Session Name (s): SIP Call
Connection Information (c): IN IP4 158.196.81.105
Time Description, active time (t): 0 0
Media Description, name and address (m): audio 5004 RTP/SAVP 0
Media Attribute (a): sendrecv
Media Attribute (a): crypto:1 AES_CM_128_HMAC_SHA1_80
inline:NUC6m+o/EO+BEJIVQDtOzO4j3pb4awZyQ05Z07QD
Media Attribute (a): rtpmap:0 PCMU/8000
Media Attribute (a): ptime:20
Se způsobem distribuce master_key ovšem nebyl spokojen Philip Zimmermann, který přišel
s dalším vylepšením zabezpečení transportu dat v reálném čase. Philip Zimmermann již zanechal ve
světě sítí důležitou stopu v oblasti šifrování emailové komunikace a proslavil se protokolem PGP
(PGP Pretty Good Privacy). Jelikož produkt svého intelektu poskytl v roce 1991 k volnému použití
pro tehdy rodící se Internet, tak si zasloužil v USA obvinění z nelegálního vývozu kryptografického
softvéru, na který se tehdy stahovalo embargo a tři roky byl vyšetřován a pronásledován FBI, než byl
15
zbaven tohoto absurdního obvinění. Návrhem nového zabezpečení RTP s označením ZRTP se bude
zabývat další podkapitola.
1.5.2
Návrh vylepšení SRTP pomocí ZRTP
ZRTP (Zimmermann Real-time Transport Protocol) neslouží jako náhrada za SRTP, ale pouze
jako nadstavba pro jeho lehčí použití a implementaci. ZRTP rozšiřuje SRTP protokol o mechanismus
pro počáteční dohodu na klíčích a dokáže chránit i proti útokům zvaných jako MiTM (Man in the
middle). Zimmermann si všiml způsobu distribuce hlavního klíče v SRTP, ve kterém viděl slabinu a
možnost prolomení šifrované komunikace třetí stranou. Zásadním rozdílem je, že výměna probíhá v
dohodnuté trase pro média a zprávy jsou transportovány přes stejné porty jako RTP. Návrh ZRTP
používá při dohodě na klíčích Diffie-Hellmanův algoritmus, komunikující strany si vyměňují řetězce,
ze kterých je odvozen utajený šifrovací klíč, tento klíč se přitom nepřenáší, jeho získání z
přenášených zpráv třetí osobou je velmi časově náročným matematickým problémem řešení
diskrétního logaritmu s velkými čísly. Detekce MiTM útoků se řeší zobrazováním krátkých
autentizačních řetězců SAS (Short Authentication String). ZRTP užívá tři fáze k tomu, aby zjistil a
nastavil potřebné klíče a přešel na SRTP mód [voz142]:
•
•
•
detekce, zda-li účastníci podporují ZRTP implementaci,
výměna hodnot pro dohodu na klíčích s využitím DH algoritmu
přepnutí do SRTP módu a úspěšné používání SRTP.
V první fázi si oba ZRTP účastníci vymění mezi sebou informace o šifrování, dohodnutých klíčích
a způsoby autentifizace, které budou používat. Současně ZRTP specifikace tyto šifrovací režimy:
•
•
AES Counter Mode s délkou klíče 128 bit,
AES Counter Mode s délkou klíče 256 bit.
Pro dohodu na klíči se používá ZRTP Diffie-Hellmanův algoritmus. Pro tento algoritmus ZRTP
může využívat dva různé módy:
•
•
3072 bit Diffie - Hellman hodnoty,
4096 bit Diffie - Hellman hodnoty.
Jakmile se pomocí ZRTP vyjednají klíče, tak je nastavena v SRTP kryptografická souvislost a
komunikace se přepne do SRTP módu. Nakonec ZRTP změní některé kontrolní informace, aby si
mohl ověřit, zda celá operace proběhla úspěšně. ZRTP řeší také ochranu proti útoku MITM, kde se
případný útočník snaží řídit a kontrolovat spojení mezi komunikujícími stranami. Pro zamezení
tohoto útoku ZRTP používá metody Short Authentication String (SAS) a Retained Secrets (RS).
Zajímavým projektem implementace ZRTP je Zfone [zph]. Philip Zimmermann udělal svým
návrhem ZRTP velký krok jiným směrem, než by chtěla jakákoliv vláda, regulátor či úřední moc.
Dosud bylo možné spojení odposlechnout a pokud bylo šifrováno SRTP, tak výměnu klíče odchytit a
rozšifrovat, případně šifrovat spojení hop-by-hop. ZRTP zaručuje šifrování end-to-end a v případě
MITM budou jeho uživatelé aspoň upozorněni, že spojení není bezpečné. ZRTP je významný krok
v bezpečném přenosu médií a bude mít značný dopad zvláště v USA, kde platí od roku 2007
rozšíření CALEA (The Communications Assistance for Law Enforcement Act) i na IP telefonii.
CALEA jsou pravidla právně vynucovaného nahrávání hovorů, které stanovily Ministerstvo
16
spravedlnosti a FBI. V USA platí CALEA pro všechny poskytovatele telefonních služeb a od roku
2007 nevyjímaje poskytovatele hlasových služeb na VoIP. I tito poskytovatelé musí v USA
poskytnout asistenci při nahrávání hovorů, to platí i např. pro Skype, pokud je alespoň jeden účastník
spojení v USA.
1.6
Přenos DTMF a jiných tónů přes RTP
V roce 2000 bylo uvolněno RFC 2833 (RTP Payload for DTMF Digits, Telephony Tones and
Telephony Signals), které specifikuje způsob přenášení tónové volby a obecně tónů pomocí RTP
protokolu. Dnes je RFC 2833 nejpoužívanější způsob pro přenos DTMF (tónové volby). Pomocí RFC
2833 lze obecně přenášet tóny, jde o způsob přenosu out-of-band, čili mimo hovorové pásmo, tóny
jsou popsány určitou formou (u DTMF postačí čísla, lze i kmitočet) a příjemce je generuje z popisu.
Druhý způsob přenosu in-band vyžaduje použití PCM a tóny v pásmu 300-3400 Hz jsou
přenášeny v digitalizované podobě dané standardem ITU-T G.711. Třetím způsobem je přenos
pomocí SIP metody INFO, který je používán zřídka. Pro přenos DTMF se dle výše uvedeného
používají tři způsoby:
•
•
•
1.7
in-band, v pásmu 300-3400 Hz pomocí PCM (G.711)
out-band, pomocí RFC 2833 (modifikovaný RTP)
out-band, pomocí SIP metody INFO
Audio v přenosovém řetězci od odesílatele k příjemci
V řetězci cesty audia od odesílatele k příjemci nacházíme tři podstatná místa, viz. obr. 11 [voz111]:
•
•
•
u odesílatele dochází k paketizaci audia a odeslání RTP paketů,
IP sítí probíhá přenos RTP v Internetu,
a nakonec u příjemce se opětovně získávají hlasové informace z RTP paketů.
Místa výše uvedená jsou zdrojem zpoždění, které může zásadním způsobem ovlivnit výslednou
kvalitu řeči. Komponenty zpoždění v souladu s jejich umístěním můžeme klasifikovat následovně:
•
•
•
paketizační zpoždění (packetization) a zpoždění v kodéru (coder),
zpoždění čekáním ve frontách (queuing), serializační (serialization) způsobené odesíláním
přes rozhraní síťových zařízení a propagační (propagation) způsobené šířením signálu
přenosovým prostředím
nakonec zpoždění v mezipaměti přijímače (De-jitter) a zpoždění při zpracování přijaté
informace na dekodéru (decompression).
17
Obr. 11. Cesta audia od odesílatele k příjemci.
Při zpracování audio signálu na straně odesílatele dochází k následujícím operacím [voz111]:
•
•
•
•
audio je kódováno na kodéru (např. do formátu PCM),
bitový tok z kodéru je doslova naporcován do balíčků o konstantní velikosti (u PCM jsou to
balíčky o velikosti 160B),
k užitečné zátěži s audio informací dochází k přidání RTP hlavičky (12B) a UDP hlavičky (8B)
a IP hlavičky (20B), audio je enkapsulováno napříč jednotlivými protokolovými vrstvami ,
nakonec dojde k vytvoření rámce (doplnění fyzických adres a kontrolního součtu) a jeho
odeslání.
Audio Signal
Voice Encoder
Packetizer
RTP Packets
Obr. 12. Cesta audia od odesílatele a jeho zpracování u příjemce.
Při přenosu audia IP sítí dochází k časovému posunu mezi RTP pakety především vlivem jejich
řazení ve frontách na směrovačích, viz. obr. 13 a vzniká jitter, což bylo již vysvětleno v kapitole 1.2.
Na tento problém bylo pamatováno při návrhu standardu RFC 1889 pro RTP protokol a v hlavičce
paketu je přenášena položka Timestamp vyjadřující vzorkovací značku v RTP paketu odvozenou od
lineárního časovače. Díky této značce je možné jitter přesně rozpoznat a jeho vliv eliminovat. Na
straně příjemce je přijatý paket zařazen do vyrovnávací mezipaměti (de-jitter buffer neboli playout
buffer), tím je minimalizován vliv rozptylu zpoždění, viz. obr. 12. Následně jsou data z mezipaměti
18
předávány k dekódování, mezipaměť je vhodné nastavit na násobky dob trvání kódovaných
hlasových fragmentů při paketizaci (např. 60 ms je nejvhodnější, neboť vyhovuje pro kódování G.711,
G.729 i G.723.1.), některá zařízení umožňují samokorekci velikosti mezipaměti a pomocí adaptivních
algoritmů přizpůsobují její hodnotu aktuální situaci.
Obr. 13. Řazení ve frontách směrovačů.
1.8
Nároky na přenos audia v IP sítích
Základními kroky předcházející odeslání hlasu v RTP paketu je kódování určitým typem kodeku a
paketizace. RTP pakety jsou odesílány v dedikovaných intervalech a načasování odeslání bude
záviset jednak na velikosti užitečné zátěže a jednak rychlosti výstupního toku z kodéru. Základní
rovnice, která vyjadřuje časování odesílání RTP je vyjádřena jako
∆t=
kde
∆t
PS
CR
(7)
PS [b] je velikost užitečné zátěže a CR [bit/s] představuje rychlost
[s] je časování,
proudu bitů z kodéru. Informace o časování jsou uloženy v RTP paketech v časových značkách
(timestamp) a mohou být zpětně získány, viz. vztah (1). Na aplikační vrstvě můžeme do vztahu (8)
vyjádřit jednak payload PS a velikost RTP hlavičky H RTP , což je 12B.
S AL = H RTP + PS
(8)
Nyní je důležité vyjádřit velikost dalších hlaviček v jednotlivých vrstvách OSI modelu, což je
3
provedeno jako suma
∑H
j =1
j
. Jednak se jedná o 8B na UDP, 20B na IP poté 26B v případě
Ethernetu jako velikost polí v rámci IEEE 802.3. Nyní můžeme vyjádřit hodnotu BW M nárokovaného
pásma RTP toků pro M hovorů jako sumu jednotlivých příspěvků velikosti rámců SFi , které je nutné
přenést v intervalu ∆t :
19
M
BWM = ∑
i =1
SFi
∆t i
(9)
Pokud všechny hovory používají stejný kodek,
kodek tak (7) a (8) do vztahu (9)) získáváme pro výpočet
výpo
nároků všech RTP toků (10).
3


H
+
H 

RTP ∑
j
j =1

BWM = M ⋅ C R ⋅  1 +


PS




(10)
Z výše uvedené rovnice můžeme
ůžeme graficky vyjádřit,
vyjád it, jak závisí nárokované pásmo na velikosti
užitečné zátěže v RTP a počtu
čtu hovor
hovorů, obr. 14. V 3D zobrazení vidíme, že s klesající velikostí
užitečné zátěže
že rostou nároky na pásmo, což je způsobeno
sobeno režií hlaviček, jejichž poměr
pom vůči
klesajícímu množství přenášené
enášené informaci roste.
Obr. 14.
1.9
Závislost pásma na velikosti zátěže
zát
a počtu hovorů
Kodeky
Kodek je zařízení
ízení nebo algoritmus, který slouží ke zmenšení jinak zbytečně
zbyteč
zbyte
velkého objemu
audiovizuálních dat. Slovo kodek vzniklo složením slov kodér a dekodér, tj. zařízení
zař
jež je na jedné
straně schopné data zakódovat a na druhé stran
straně opět rozkódovat. Při
ři použití osobního po
počítače je
typicky vstupem kodeku zvuková karta, data získaná z mikrofonního vstupu kodér zpracuje a předá
p
je RTP vrstvě,, vzniklé protokolové datové jednotky se enkapsulují v jednotlivých vrstvách OSI
modelu, až jsou nakonec vyslána příjemci.
př
Přijatá data převede do původní
ůvodní podoby dekodér a pošle
na audio výstup zvukové karty. Kodeky velmi často používají ztrátovou
ou kompresi a proto dekódovaná
data nejsou totožná s daty, která byla zakódována [voz142].
[voz
20
Tato kapitola je věnována popisu kodeků, které se v IP telefonii nejčastěji vyskytují. Zdrojem
hovorového signálu jsou řečové orgány, které se skládají z hlasivek, hrdelní dutiny, ústní dutiny,
nosní dutiny, měkkého a tvrdého patra, zubů a jazyka. Zdrojem buzení této soustavy jsou plíce ve
spolupráci s dýchacími svaly. Vlivem tlaku proudu vzduchu vycházejícího z plic dochází k jeho
modulaci hlasivkami. Kmitočet závisí na tlaku vzduchu na svalovém napětí hlasivek. Kmitočet
hlasivek je charakterizován základním tónem lidského hlasu, který tvoří základ znělých zvuků.
Kmitočet základního tónu je různý u dětí, dospělých, mužů i žen, pohybuje se většinou v rozmezí 150
až 400 Hz. V klidu je štěrbina hlasivek otevřena a proud vzduchu volně prochází hlasivkami.
Vytvářený zvuk je po průchodu hlasivkami formován ústní dutinou a je vyřazován do volného
prostoru. Sdělení zprostředkované řečovým signálem je diskrétní, tzn. může být vyjádřeno ve tvaru
posloupnosti konečného počtu symbolů. Každý jazyk má vlastní množinu těchto symbolů - fonemů,
většinou 30 až 50. Lidská řeč je souvislý časově proměnný proces, z toho plyne i náročnost popisu
lidské řeči a jejího modelování. Hovorový signál snímáme mikrofonem, který převádí modulovaný
proud vzduchu na elektrický signál. Přístupy ke kódování jsou následující:
•
•
•
1.9.1
kódování vlny (waveform coding), zpracování vychází z přeměny hovorového signálu ve tvaru
elektrického signálu. Tento signál je vzorkován, kvantován a následně kódován,
kódování parametrů zdroje hovorového signálu (Source Coding),
a hybridní, do této kategorie patří kodeky založené na adaptivních predikčních metodách, na
metodách vektorové kvantizace, složkovém kódování anebo adaptivním transformačním
kódování.
PCM
Nejznámější a nejpoužívanější kodek je PCM ITU-T G.711, výstupem kodéru je bitový tok 64 kbit/s.
Kódování PCM (Pulse Code Modulation) se sestává ze tří kroků:
•
•
•
vzorkování 8KHz, hodnoty spojitého analogového signálu ve frekvenční oblasti 300-3400Hz
se odečítají v diskrétním čase,
kvantování, ke každému vzorku získanému v předchozím kroku se přiřadí bitová sekvence z
možných diskrétních úrovní,
a nakonec kódování.
Vzorkuje se 8KHz a jednotlivé vzorky jsou reprezentovány osmibitovými sekvencemi. Při
kvantování ovšem vzniká kvantizační zkreslení, protože každému vzorku je přiřazen jemu nejbližší
kvantizační stupeň a počet hodnot je omezený. Kodér přiřadí každému kvantizačnímu stupni
číselnou kódovou kombinaci a kvantovaný vzorek do ní zakóduje. Příčinou kvantizačního zkreslení je
rozdíl mezi nekonečným počtem vstupních a konečným počtem výstupních hodnot, nižší hodnoty
budou u lineární stupnice více zkresleny. Proto se u digitálních modulací používá komprese, výšky
malých vzorků se zvýrazní a výšky velkých vzorků se ponechají tak, aby útlum kvantizačního
zkreslení byl konstantní. Pomocí expanze v přijímači se vzorkům vrátí původní rozsah a poměr
jednotlivých výšek. Pro zajištění rovnoměrné hodnoty odstupu kvantizačního zkreslení se v
pracovním rozsahu kodéru PCM používají logaritmické křivky A-law a µ-law (Severní Amerika).
Použítí logaritmické kvantizační stupnice namísto lineární nízké hodnoty vzorků se na vysílací straně
zesílí a vysoké naopak zeslabí. Na přijímací straně proběhne inverzní proces.
21
1.9.2
ADPCM
Kódování ADPCM (Adaptive Differential Pulse Code Modulation) vychází z DPCM. Kódování DPCM
(Differential Pulse Code Modulation) je modifikací PCM kódování, nekódují se navzorkovaná data,
ale jejich rozdíl oproti odhadnutému průběhu signálu, průběh signálu je možné částečně odhadnout,
navzorkovaný průběh a odhadnutý průběh jsou si podobné, výsledný rozdíl má mnohem menší
dynamický rozsah a je možné ho zakódovat pomocí menšího počtu bitů, tedy množství přenášených
dat se snižuje. ADPCM je vylepšeno tak, že generátor srovnávacího průběhu je adaptivní a
přizpůsobuje se konkrétní řeči, která se kóduje. Výsledkem je ještě menší dynamický rozsah než v
případě DPCM a tedy opět menší počet bitů nutný k zakódování. Kromě toho se mění i vlastnosti
kvantifikace pro charakteristiku konkrétní řeči. Nejznámějším představitelem ADPCM je ITU-T G.726
(32 kbit/s), ale jsou možné i jiné rychlosti výstupního toku z kodéru v závislosti na použitém
adaptivním algoritmu, G.726 a G.727 umožňují 40, 32, 24 a 16 kbit/s. Vůbec prvním standardem
ADPCM bylo doporučení ITU-T G.721 pro 32 kbit/s.
MOS
4,2
G.711
4,1
4,0
G.729
3,9
G.726
G.723.1/6,3
3,8
G.729A
3,7
G.723.1/5,3
3,6
3,5
G.728
GSM 06.10
3,4
0
Obr. 15.
1.9.3
10
20
30
40
50
60
70
Rychlost kodeku [kbit/s]
MOS v závislosti na bitové rychlosti kodeků.
LPC
LPC (Linear Predictive Coding) je způsob kódování založený na úplně jiném principu než PCM nebo
ADPCM, ty vycházely z kvantifikace průběhu signálu. Metoda LPC vychází naopak ze znalostí o
mluvícím traktu (tj. hlasivkách a krku). Tato metoda se snaží vytvořit model hlasového ústrojí člověka.
LPC využívá předpokladu že hlasový signál je generován bzučákem na konci trubky, štěrbina mezi
hlasivkami produkuje bzukot, který je charakterizován hlasitostí a frekvencí. Mluvící ústrojí (krk, ústa)
vytváří trubku, která je charakterizována svými rezonancemi nazývanými formanty. LPC analyzuje
řeč aproximováním formantů, odstraněním jejich působení z hlasového signálu a odhadem intenzity
a frekvence zbývajícího signálu, který je generován hlasivkami. Proces odstranění formantů se
nazývá inverzní filtrování. LPC vytváří signál řeči obráceným procesem, vygeneruje se signál s
příslušnou hlasitostí a frekvencí a z formantů se vytvoří filtr. Tímto filtrem se potom vygenerovaný
22
signál zpracuje a výsledkem je signál podobný původnímu
p
signálu řřeči.
či. Protože vstupní signál se
mění v závislosti na čase,
ase, je nutné tento proces opakovat pro kratší časové
asové intervaly, tzv. rámce. Pro
rozumnou kvalitu výsledné řeči
ř či se používá 30 až 50 rámc
rámců za vteřinu. Představitelem
ředstavitelem je LPC kodek
s výstupním tokem 4,8 kbit/s nebo kodek LPC-10
LPC
s tokem 2,4 kbit/s.
1.9.4
CELP
Kódování CELP (Code Excited Linear Prediction) zásadně
zásadn vylepšuje LPC. Problém metody LPC je v
tom, že to, co zbude po odfiltrování formantů,
formant není pouze signál bzučáku.
čáku. Dů
Důvodem je, že v řeči se
vyskytují složky reprezentující třeba
eba sykot. Takovéto zvuky nebudou jednoduchým
jednoduch
LPC kodekem
správně aproximovány. Nepřesnosti
řesnosti při
p odhadu formantů způsobí,
sobí, že více informací o signálu
zůstane
stane v reziduu (zbytek po odfiltrování formant
formantů).
). To platí pro zvuky které neodpovídají
jednoduchému LPC modelu, platí to například
nap
pro zvuky generované různou
ůznou pozicí jazyka atd. Tedy
reziduum obsahuje důležité
ležité informace o tom, jak má řeč znít, tyto informace se zakódováním pomocí
LPC ztratí, protože reziduum se zakóduje pouze pomocí dvou parametrů,
parametrů, frekvence a amplitudy
signálu. Vzniká tedy otázka, jak reziduum zakódovat lépe tak, aby se příliš
příliš nezvýšil nárok na ší
šířku
pásma a tyto důležité
ležité informace se p
přitom neztratily.
Jednou z nejúčinnějších
jších metod je použití codebooku. Kódová kniha je tabulka obsahující typické
průběhy
hy rezidua. Kodér potom porovn
porovnává průběh
h rezidua s hodnotami v tabulce a použije tu, která
odpovídá nejvíc, index této hodnoty z tabulky se potom přenáší.
p enáší. Druhá strana má stejnou tabulku a
po příjmu indexu dokáže průběh
ů ěh
h rezidua z tabulky obnovit, toto reziduum potom slouží jako budič
budi pro
filtr aproximující formanty. Výsledkem je lepší aproximace hlasového signálu než v případě
p
jednodušší metody LPC. Tato metoda se nazývá Code Excited Linear Prediction, zkratka CELP. Aby
metoda CELP správně fungovala, tabulka obsahující typické pr
průběhy rezidua
ezidua musí být velmi
rozsáhlá, pokud je ale tabulka velká, bude vyhledávání v tabulce trvat rovněž
rovněž velmi dlouho. Dalším
problémem je, že tabulka by musela obsahovat vzorky pro různě
r
vysoký hlas, taková tabulka by však
byla extrémně rozsáhlá. Tento problém se řeší vytvořením
ením dvou tabulek. Jedna tabulka je vytvo
vytvořená
při tvorbě kodeku a obsahuje vzorky pro právě
práv jednu výšku hlasu. Druhá tabulka je adaptivní, ze
začátku je prázdná a průběžně
ů ě ě se plní předešlými
p
vzorky rezidua zpožděnými
ěnými o určitou
ur
hodnotu.
Právě hodnota zpoždění určuje
čuje
uje výšku hlasu, popsaný algoritmus poskytuje dobrou kvalitu p
přenášené
řeči už při šířce pásma 4,8 kbit/s. Typickými představiteli
edstaviteli jsou ACELP dle G.723.1 s tokem 5,3 kbit/s,
CS-ACELP dle G.729 s tokem 8kbit/s anebo LD-CELP
LD
dle G.728 s tokem 16 kbit/s.
Tab. 1 Typ kódování, MOS, rychlost
rych
a náročnost na výpočetní výkon.
23
Mezi modifikace CELP patří ACELP (Algebraic Code Excited Linear Prediction), LD-CELP (Low
Delay Code Excited Linear Prediction) a CS-ACELP (Conjugate Structure Algebraic Linear Code
Prediction). Následně si popíšeme nejpoužívanější
nejpoužívan jší kodeky, ty jsou specifikovány v doporučeních
doporu
ITU-T:
•
•
•
•
•
•
•
G.711 je základní kodek PCM,
PCM, který se používá i v klasické telefonní síti. Kvalita přenášeného
p
hlasu je totožná s kvalitou hlasu při
p běžném telefonním
lefonním hovoru, MOS má hodnotu 4,2, rámec
trvá 0,125 ms;
G.723.1 používá buď
ď kódování MP
MP-MLP
MLP nebo ACELP. První typ kódování vyžaduje šířku
ší
pásma 6,3 kbit/s, druhý typ 5,3 kbit/s. Jeden rámec obsahuje úsek trvající 30 ms a MOS
skóre je 3,9 při použití kódování
ování MP-MLQ
MP
a 3,65 při použití ACELP;
G.726 kodek používá kódování ADPCM, potřebná
pot
šířka
ka pásma je 16, 24, 32 a 40 kbit/s.
Kodek může
že zpracovávat bloky rrůzné
zné délky podle toho, jak velké zpožd
zpoždění je požadováno,
pro 32 kbit/s se uvádí MOS=3,85;
G.728 používá kódování LD-CELP.
LD
Potřebná šířka
ka pásma je 16 kbit/s, MOS skóre je p
přibližně
3,6;
G.729 Použité kódování je CS-ACELP
CS
- Conjugate Structure Algebraic Code Excited Linear
Prediction. Rámec trvá 10 ms a potřebná
pot
šířka
ka pásma je 8 kbit/s, MOS je hodnocen 3,92;
GSM kodek, šířka
ka pásma je 13 kbit/s (Full Rate GSM FR). Kodek je založen na kódování LPC.
Dalším rozšířením
ením v roce 1997 byl kodek GSM EFR (Enhanced Full Rate) s rychlostí 12,2
kbit/s a rámcem 20 ms (obsahuje 244 bitů).
bit
V roce 1998 přišlo
išlo další kódovací schéma,
sch
a to
AMR kodek (Adaptive Multi-Rate),
Multi Rate), který je používán i v UMTS. AMR používá ACELP techniku
kódování a rychlosti se pohybují od 4,75 (AMR 4,75) do 12,2 kbit/s (AMR 12,2). AMR 12,2 je
kompatibilní s GSM EFR.
iLBC - internet Low Bit Rate Codec, tento
tento kodek byl vyvinut firmou Global IP Sound, potřebná
pot
šířka
ka pásma je 13.33 kbit/s, rámec obsahuje úsek trvající 30 ms. Kodek umožňuje
umož
elegantní
snížení kvality přenášeného
řenášeného signálu v p
případě zpoždění
ní nebo ztráty paket
paketů. Použitý
algoritmus je Block Independent
Independent Linear Predictive Coding. Každý rámec je komprimován na
399 bitů,, které se potom př
přenáší.
V tabulce 2 můžeme vidět
ět srovnání nejpoužívanějších
nejpoužívan
kodeků, ve čtvrtém sloupci tabulky je
uvedena typické časování
asování odesílání paket
paketů,, v dalším sloupci je doba trvání rámce a po sečtení s
look-ahead (dopředným výpočetním
četním zpožděním
zpožd
u kodeků pracujících s predikcí) dostaneme celkové
minimální zpoždění,
ní, které lze u kodeku teoreticky dosáhnout.
Tab. 2 Typ kódování, rychlost, typická paketizace, rámec a zpoždění.
zpožd
V posledním řádku
ádku je použit kodek G.729A, což je dodatek ke kodeku G.729, tento dodatek
implementuje G.729 s nižší výpočetní
výpoč
náročností,
ností, G.729A vyžaduje pouze 11 MIPS, klesá ale MOS
24
na 3,6. Dalším používaným dodatkem G.729 je implementace detekce ticha VAD s označením
G.729B, často najdeme i kodek s oběma dodatky s označením G.729AB.
Implementace VAD do G.723.1 je označována jako G.723.1A. VAD (Voice Activity Detection)
nebo taky někdy označována jako SS (Silence Suppression) je funkce potlačení ticha, ticho během
hovoru se nepřenáší, neboť nenese žádnou informaci. V průměrném hovoru ticho tvoří 40-60%
celkové doby spojení. Během ticha se tedy nebudou přenášet RTP pakety a u příjemce se zapne
generování šumu CNG (Comfort Noice Generator). Princip aktivace a deaktivace SS je založena na
překročení prahových úrovní odstupu signálu od šumu, pokud se detekuje úroveň signálu
setrvávající stanovený čas pod či nad prahovou úrovní, tak se aktivuje či deaktivuje SS. V praxi je
ovšem zkušenost taková, že funkce VAD může způsobovat ořezávání prvních slabik slov po
odmlkách, jelikož aktivace je záležitostí typicky cca 20 ms, funkce VAD proto není používána při
broadband konektivitě. Cisco IOS má pro aktivaci a deaktivaci jednoduché příkazy , a to VAD a no
VAD, pokud ovšem není použita G.729B či G.723.1, potom je VAD součástí kodeku a funkce se
nedá řídit.
25
2
Protokol SIP
SIP (Session Initiation Protocol) je protokolem pro sestavení, modifikaci a terminaci obecné relace v
Internetu a nejčastěji je používán pro audio. Byl vyvíjen od roku 1996 pracovní skupinou MMUSIC
(Multiparty Multimedia Session Control) v rámci IETF (Internet Engineering Task Force). V roce 1999
byl předložen ve formě navrhovaného standardu (Proposed Standard) v RFC 2543. Téhož roku na
popud IETF vznikla nová pracovní skupina, nazvaná příznačně SIP, která převzala vývoj hlavního
jádra protokolu. Její práce v květnu roku 2002 vyústila v nový standard RFC 3261. Dnes existuje
kolem stovky dalších RFC, které se přímo týkají SIPu nebo na něj navazují, ať už jde přímo o nové
metody komunikace anebo např. rozšíření položek v hlavičkách.
2.1
Základní popis protokolu SIP
SIP pracuje na aplikační vrstvě, byl navržen tak, aby byl snadno implementovatelný, rozšiřitelný a
dostatečně flexibilní. Protokol je užíván pro sestavení, modifikaci a ukončení spojení s jedním nebo
více účastníky, ale není jediným protokolem, který je potřebný pro audiovizuální komunikaci, ve
spojení se SIPem jsou nejčastěji používány ještě dva další protokoly, RTP (Real-Time Protocol) pro
přenos vlastního obsahu a SDP (Session Description Protocol) pro popis přenášeného obsahu [sin1],
[sin2].
SIP je end-to-end orientovaný signalizační protokol, což znamená, že veškerá logika je uložená v
koncových zařízeních, koncová zařízení znají i jednotlivé stavy komunikace, chování lze popsat
stavovým diagramem, ve kterém se v rámci dialogu (spojení) probíhají jednotlivé transakce (žádosti
a odpovědi). Tím je zvýšena odolnost komunikace proti chybám. Cena, která se musí zaplatit za
decentralizaci a dostupnost služby, je vyšší režie hlaviček zpráv. Nepochybně stojí za zmínku, že
end-to-end koncept SIPu je zásadně odlišný od klasického řešení PSTN (Public Switched Telephone
Network), kde logika je uložena v síti a koncová zařízení jsou primitivní. Jedním z cílů SIPu je zajistit
stejnou funkcionalitu jakou mají klasické PSTN, ale end-to-end návrh umožňuje v SIPu podstatně
snadnější implementaci nových služeb a některé z nich mohou být jen stěží nasazeny v klasických
PSTN.
SIP je textově orientovaný protokol z rysy podobnými HTTP a SMTP protokolu. HTTP a SMTP
jsou nepochybně nejúspěšnějšími a nejpoužívanějšími protokoly v Internetu, volba osvědčeného
modelu komunikace zaručuje SIPu robustnost a nadčasovost. Klient posílá požadavky na server,
který zasílá odpovědi obdobně jako u HTTP, v hlavičkách najdeme položky From, To či Subject jako
u mailové komunikace pomocí SMTP. SIP entita je vázána k doméně obsluhovanou SIP Proxy a
26
mezidoménová komunikace je tedy mezi různými SIP Proxy, výjimkou je multidoménová SIP Proxy.
SIP entity jsou identifikovány použitím SIP URI (Uniform Resource Identifier), řekli bychom
jednoduše jmennými identifikátory, jejich obecný tvar je uveden níže.
sip:user:password@host:port;uri-parameters?headers
SIP URI se skládá jednak z části username identifikující uživatele a jednak z host vztažené k
doméně neboli hostiteli, který poskytuje uživateli určité prostředky k zajištění komunikace, následuje
pole password jehož použití není doporučeno. Port je standardně 5060 na UDP, případné parametry
se oddělují středníkem a pokud je potřebné přímo do URI zadat i nějaké parametry hlavičky, tak se
uvádějí za otazníkem. Většinou ale uvidíme SIP URI v podobě jednoduché konstrukce
sip:user@host , což nápadně připomíná emailovou adresu. Příkladem SIP URI může být:
•
•
sip:[email protected]
sip:[email protected]
SIP tedy pracuje se jmennými identifikátory a číslo můžeme přeložit na URI pomocí DNS, kde
jsou k tomu určeny záznamy NAPTR (Name Authority Pointer) a technika mapování URI na tel. čísla
(standard ITU-T E.164) se nazývá ENUM (E.164 NUmber Mapping). URI je obecně prezentováno
řetězcem znaků, jehož cílem je umožnit interakci se zdrojem pomocí určitého protokolu, tzn. musí
nutně obsahovat název schématu (protokol) a adresu zdroje, za schématem následuje dvojtečka.
URI dle RFC 3986 je definováno následovně:
<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]
Příklady pro scheme name jsou:
•
•
•
sip, sips, h323, tel, http, https,
ftp, imap, ldap, mailto, telnet, im,
pop, news, atd...
Hierarchical part nese informaci o identifikaci zdroje, obvykle začíná dvojitým lomítkem “ // „ a
následuje např.:
•
•
•
•
domain name,
IP address,
username:password@,
user@host.
Pokud je specifikováno číslo portu, tak se začíná znakem „:“, např. :5060, :8080, :8085, atd...
Query je nepovinná část, která obsahuje doplňující informace, obecná syntaxe není definována,
obvykle se objevuje ve formě <key>=<value>, kde jednotlivé hodnoty jsou odděleny znakem „&“ ,
např. key1=value1&key2=value2&key3=value3 . Fragment je nepovinná část umožňující nepřímo
identifikovat další zdroj a začíná znakem „#”.
SIP adresa je vázána k doméně, a proto následuje několik základních informací k DNS. Jména
domén jsou vyjádřena pomocí adres 32-bitových (IPv4) A záznam nebo 128 bitových (IPv6) - AAAA
záznam. Systém DNS zajišťuje překlad doménových jmen na IP adresy, stejně tak zajišťuje zpětný
překlad IP adresy na doménové jméno - PTR záznam. Doménová jména jsou vytvářena hierarchicky,
27
stejně jako jsou hierarchicky organizovány DNS servery. Prostor doménových jmen tvoří strom, jeho
kořenem je kořenová doména, která se zapisuje jako samotná tečka, pod ní se v hierarchii nacházejí
tzv. domény nejvyšší úrovně (Top-Level Domain, TLD).
Při vyhledávání v DNS provádějí klienti obvykle dopředné vyhledávání, což je hledání založené
na názvu DNS jiného počítače, který je uložen v záznamu o prostředku hostitele (A). U odpovědi na
tento typ dotazu se jako údaj o prostředku očekává adresa IP. Systém DNS poskytuje rovněž zpětné
vyhledávání, při kterém klienti používají známou adresu IP a hledají název počítače na základě jeho
adresy, pro tento účel byla ve standardech DNS definována speciální doména in-addr.arpa. V rámci
domény in-addr.arpa jsou pomocí opačného pořadí čísel adres IP v desítkovém formátu s tečkou
vytvořeny subdomény, které tvoří obor názvů pro zpětné dotazy. Stromová struktura domény inaddr.arpa integrovaná do systému DNS vyžaduje definování dalšího typu záznamu o prostředku záznamu o prostředku ukazatele (PTR). Tento záznam o prostředku vytváří v zóně zpětného
vyhledávání mapování, které obvykle koresponduje se záznamem prostředku hostitele (A) pro název
počítače DNS hostitele v jeho zóně dopředného vyhledávání.
Strom je administrativně rozdělen rozdělit do zón, které spravují jednotliví správci. Obsah zóny
(domény či několika domén) je uložen v tzv. zónovém souboru, skládá se z jednotlivých záznamů
(resource records, RR) obsahujících dílčí informace. Zónový soubor vždy musí začínat záznamem
typu SOA. Nejčastěji se používají následující typy záznamů:
•
•
•
•
•
2.2
A (address record) obsahuje IPv4 adresu přiřazenou danému jménu, například neco.vsb.cz
má IP adresu 1.2.3.4, zónový soubor pro doménu vsb.cz bude obsahovat záznam,
neco IN A 1.2.3.4,
CNAME (canonical name record) je alias - jiné jméno pro jméno již zavedené, jeho definice
pomocí přezdívky umožňuje jej později snadno přestěhovat na jiný počítač, např. neco.vsb.cz
má sloužit zároveň jako nic.vsb.cz, v zónovém souboru přibude
nic
IN CNAME neco,
SOA (start of authority record) je zahajující záznam zónového souboru. Obsahuje jméno
primárního serveru, adresu elektronické pošty jejího správce a další údaje (serial, refresh,
retry, expire a TTL).
Prvky SIP řešení
Ačkoliv v nejjednodušší konfiguraci je možné použít dva UA posílající si navzájem SIP zprávy,
typická SIP síť bude obsahovat více než jeden typ prvků.
2.2.1
User Agent a Back to Back User Agent
Základními SIP prvky jsou:
•
•
SIP user agent (UA), který je prezentován koncovým terminálem,
SIP proxy, registrar, redirect a location servery, často označováno jako SIP server.
Jednotlivé servery jsou většinou stavěny jako logické části SIP serveru, jelikož z pohledu nákladů
je efektivnější jejich provoz na jednom společném HW, každopádně filozofie návrhu SIP architektury
28
umožňuje jejich plnou dekompozici, což je výhodou pro velká řešení, distribuovaná architektura vede
ke zvýšení robustnosti.
Koncové body, kde vzniká a je terminována SIP relace, jsou nazývány jako user agents (UA). UA
obvykle jsou představovány koncovými terminály ve formě HW SIP telefonu nebo aplikace, SIP UA
mohou být IP telefony, Smartphones, PSTN brány (GW), IVR systémy, atd. UA jsou vztaženi k User
Agent Server (UAS) a User Agent Client (UAC). UAS a UAC jsou pouze logické entity, každý UA
obsahuje UAC a UAS:
•
•
UAC je část vysílající požadavky a přijímající odpovědi,
UAS je část přijímající požadavky a odesílající odpovědi.
IN
V
IT
E
Žádost a odpověď jsou dva základní typy SIP zpráv. Protože koncové zařízení téměř vždy
obsahuje UAC a UAS, tak používáme pouze označení UA namísto UAC a UAS. Například, volající
UA funguje jako UAC, když odesílá zprávu INVITE (požadavek na sestavení spojení) a přijímá
odpověď na požadavek. Volaný UA se chová jako UAS, když obdrží zprávu INVITE a odesílá
odpověď. Ale tato situace se mění, když volaný se rozhodne zavěsit a odesílá se zpráva BYE a
ukončuje spojení. V tomto případě se volající chová jako UAC a volaný jako UAS.
V
IN
E
IT
Obr. 16.
Rozeslání INVITE více příjemcům.
Obr. 16 ukazuje tři UA a SIP Proxy. UAC inicializuje spojení odesláním žádosti INVITE na
SIP Proxy, ta je přeposlána adresátovi, jelikož je příjemců více, tak dochází k rozeslání na dva UAS
(forking). Na prvním z nich, který přijme volání, tak je sestaveno spojení. Při ukončení spojení
odesílá UAC zprávu BYE přímo na UAS.
B2BUA je speciální typ UA vkládaného do cesty a vytvářejícího dvě spojení, na B2BUA je
ukončeno jedno spojení a sestaveno nové na cíl, B2BUA zprávy a odpovědi narozdíl od SIP Proxy
nepřeposílá, ale vytváří nové směrem k oběma komunikujícím stranám. Koncový terminál ovšem
nerozezná rozdíl mezi voláním přes B2BUA a SIP Proxy. B2BUA má rozsáhlejší možnosti než SIP
Proxy, ovšem výkon vyjádřený počet obsloužených požadavků na spojení za jednotku času je
podstatně menší oproti klasickým SIP Proxy, což vyplývá z rozdílného přístupu k obsluze SIP zpráv
[voz188] a [voz191].
29
Použití B2BUA je poměrně časté, typickým příkladem je ASTERISK, který má rozsáhlé možnosti
doplňkových služeb pro koncové uživatele, je používán jako pobočková ústředna do velikosti řádově
tisíců uživatelů. Jako představitele klasické SIP PROXY si uveďme KAMAILIO, řešení je vhodné i pro
velké poskytovatele s dimenzování až pro stovky tisíc uživatelů [voz133], [voz146] a [voz191].
2.2.2
SIP Proxy Server
SIP umožňuje vytvořit infrastrukturu sítě hostitelů nazývaných jako SIP Proxy servery. Koncové
terminály UA mohou odesílat zprávy na SIP Proxy server. SIP Proxy servery jsou důležité entity
infrastruktury. Zajišťují směrování žádostí o spojení dle aktuálního umístění adresáta, mohou
provádět autentizaci, účtování a realizovat doplňkové služby (např. přesměrování). Nejdůležitější
úloha SIP Proxy serveru je směrovat žádosti o sestavení spojení blíž k volanému. Při inicializaci
sestavení spojení je základní úlohou SIP Proxy nalézt další SIP Proxy, která obslouží požadavek a
na tuto danou zprávu odeslat. K nalezení SIP proxy pro next hop může kromě statického záznamu i
vyhledávat v DNS. Požadavek na sestavení spojení je tedy směrován přes jednotlivé SIP Proxy a
volaný nakonec žádost akceptuje nebo odmítne. Máme dva základní typy SIP proxy serverů:
•
•
stateless (bezestavový),
stateful (a s informací o stavech).
Kromě SIP Proxy serveru máme následující servery:
•
•
•
•
Redirect Server slouží pro přesměrování, vrací nové URI uživatele,
Registrar Server přijímá požadavky na registraci, aktualizuje lokalizační databázi a mapuje
logickou URI uživatele (user URI) na fyzickou URI zařízení (device URI), user URI je taky
označována jako AOR (Address of Record),
Location Server je úložištěm informací o umístění uživatelů a SIP Proxies,
posledním případem je B2BUA, který je používán v režimu SIP serveru.
Stateless SIP Proxy jsou poměrně jednoduché a pouze přeposílají zprávy nezávisle na jejich
vzájemné vazby. Zprávy jsou většinou v pořádku z hlediska souslednosti a významu v signalizaci,
bezestavové SIP Proxy servery neumí kontrolovat jejich výměnu z hlediska smysluplnosti, nezachytí
replikaci zpráv, detekce nekonečných smyček jim trvá déle, nejsou srovnatelné se stateless SIP
Proxy do rozsahu možností, neumí např. větvení či přesměrování. Stateless SIP Proxy servery jsou
jednoduché, ale rychlejší než Stateful SIP Proxy . Využití mají jako balanční servery, pro jednoduché
překládání zpráv a směrování.
Stateful SIP Proxy servery jsou mnohem komplexnější. Po přijetí požadavku, server vytvoří záznam
stavu a drží důležité informace, dokud nedojde k ukončení transakce či dialogu, dělí se tak na dva
typy.
•
•
transakční, drží stavy k žádosti (dokud není definitivně vyřízena),
dialogové, drží stavy dialogu (dokud neskončí celé spojení).
Některé transakce, zejména vytvořené zprávou INVITE, mohou trvat poměrně dlouho (dokud
volaný nevyzvedne nebo se neukončí volání). Protože proxy servery s informací o stavech musí
udržovat stav po celou dobu dané transakce, je jejich výkon limitován.
30
Schopnost přiřazovat SIP zprávy do transakcí dává serveru některé zajímavé vlastnosti,
například může provádět větvení, na přijetí jedné zprávy, může být odesláno více zpráv (uživatel má
např. vícenásobnou registraci). Stateful SIP Proxy server může zachytit opakování zpráv, protože
ze stavu transakce ví, jestli byla stejná zpráva už přijata (Stateless Sip Proxy nemůže ověřovat,
protože nedrží stav). Stateful SIP Proxy server může aplikovat komplikovanější metody nalezení
uživatele, například možnost zkusit volat na telefon v zaměstnání a v případě neohlášení volání
přesměrovat na mobilní telefon, zatímco stateless SIP Proxy žádost přepošle a už o nemá k ní
informacemi, čili nemůže tedy provést např. přesměrování po čase. Většina SIP Proxy serverů je
stateful , často nabízejí generování záznamů o spojeních, větvení, některé druhy podporují i NAT.
SIP je připraven na situaci, kdy každá jednotka (např. firma) bude mít vlastní SIP proxy server, který
je užíván všemi UA v rámci administrované jednotky [voz90].
Předpokládejme, že jsou dvě firmy A a B a každá z nich má svůj Proxy server. Obr. 17 ukazuje
situaci, kdy Alice z firmy A inicializuje spojení na Boba z firmy B. Uživatel Alice volá Boba a použije
URI adresu sip:[email protected]. UA neví, kam má poslat žádost o sestavení spojení, ale je
nakonfigurován tak, že veškerý odchozí provoz (outbound traffic) posílá na SIP Proxy server své
firmy A s adresou proxy.a.com. Proxy server zjistí, že uživatel sip:[email protected] je v jiné firmě a tak
vyhledá odpovídající SIP Proxy server, kam pošle žádost. Odpovídajícím serverem je proxy.b.com a
je zadán staticky v proxy serveru firmy A anebo bude Proxy vyhledán pomocí záznamu DNS SRV,
kterým je zjištěno, kdo poskytuje službu SIP v doméně b.com. Žádost tedy dorazí na proxy.b.com.
SIP Proxy ví, že Bob je aktuálně ve své kanceláři a dosažitelný na telefonu na svém stole, jež má IP
adresu 1.2.3.4, takže SIP Proxy přeposílá žádost INVITE.
#1
Obr. 17.
#5
TE
VI
IN
Sestavení spojení přes dvě SIP Proxy.
31
IN
VI
TE
2.2.3
SIP Registrar Server
Zmínili jsme se, že SIP Proxy na proxy.b.com zná současnou polohu Boba, ale neřekli jsme, jak
Proxy může lokalizovat uživatele. Bobův UA (SIP telefon) musí být registrován na SIP Registrar
serveru. Registrar server je speciální část SIP serveru, která přijímá od uživatelů požadavky na
registraci, tím získává informaci o jejich aktuální poloze (IP adresa, port a uživatelské jméno) a
ukládá informaci do lokalizační databáze (location database).
Obr. 18. Průběh registrace.
V lokalizační databázi v našem případě došlo k namapování adresy User URI sip:[email protected] k
adrese Device URI sip:[email protected]:5060. Lokalizační databáze je pak užívána Proxy serverem.
Když inbound Proxy server obdrží žádost pro sip:[email protected], vyhledá v lokalizační databázi záznam
sip:[email protected]:5060 a na danou IP adresu pošle žádost. Registrar server je velmi často pouze jako
logická část SIP serveru, jelikož je těsně svázán s Proxy serverem. Obr. 18 znázorňuje typickou SIP
registraci. Zpráva REGISTER je vyslána do Registrar serveru a obsahuje adresu záznamu User URI
sip:[email protected] a kontaktní adresu Device URI sip:[email protected]:5060 , kde 1.2.3.4 je IP adresa
telefonu. Registrar zaznamenává tyto informace do lokalizační databáze. Pokud registrace proběhla
správně, tak Registrar server posílá odpověď 200 OK a proces registrace je ukončen. Každá
registrace má limitovanou dobu platnosti, doba platnosti je v hlavičce kontaktu (Expires), do té doby
musí UA obnovit registraci, jinak bude nedostupný.
2.2.4
SIP Redirect Server
Jak již bylo řečeno, SIP URI je vázána k doméně, ta je nezávislá na síťové topologii, a například SIP
server v doméně vsb.cz můžu používat odkudkoliv. Může být ovšem někdy nepraktické jej používat,
pokud jsem v doméně cvut.cz a nabízí se mi možnost využívat jejich SIP Proxy, v tom případě by
ale někdo měl vědět o mém novém SIP URI a zajistit přesměrování, viz. obr. 64. Entita, která přijímá
požadavek a odesílá zpět odpověď obsahující lokalizaci konkrétního uživatele se nazývá Redirect
server. Redirect server přijímá požadavky a vyhledává zamýšlené příjemce v lokalizační databázi
32
si #1
p:
bo IN
b@ VIT
vs E
#2
b.
cz
T e 302
m M
po o
ra ved
ri l
y
vytvořené registrar serverem. Následně vytváří seznam aktuálních lokalizací uživatele a posílá jej
odesílateli požadavku v odpovědi zařazené do třídy 3xx. Odesílatel požadavku poté dostává seznam
destinací a odesílá další požadavky přímo na ně. Obr. 19 ukazuje způsob přesměrování, Alice volá
Boba a odeslaný INVITE přijme Redirect server, který zjistí, že Bob má nový kontakt a vrací odpověď
302 Moved Temporarily, ve které do pole contact zapíše SIP URI, na kterou je Bob přesměrován.
Alice zasílá nový INVITE na URI z kontaktu předaného Redirect serverem a INVITE již s novou
požadovanou URI se dostává na SIP Proxy sip.cvut.cz , kde už o Bobovi vědí a umí INVITE na něj
přeposlat.
Obr. 19. Průběh přesměrování.
2.3
SIP žádosti a odpovědi
Komunikace v SIPu je tvořena zprávami, které jsou obvykle přenášeny v samostatných UDP
datagramech. Každá zpráva obsahuje hlavičku zprávy (header) a může obsahovat vlastní tělo zprávy
s popisem médií (body, většinou SDP), hlavička a tělo jsou odděleny volným řádkem (CRLF).
generic-message = start-line
*header fields
CRLF
[ message-body ]
V prvním řádku zprávy je identifikován její typ. Známe dva typy zpráv, jednak žádost (neboli metoda)
a jednak odpověď.
2.3.1
Základní popis SIP hlavičky typické žádosti
Žádosti jsou obvykle užívány k registraci uživatele, sestavení, modifikaci či ukončení spojení anebo
může jít o další služby (presence, instant messaging). Odpovědi jsou užívány k potvrzení přijetí
žádosti a její vyřízení, obsahují konkrétní status. Typická SIP žádost vypadá následovně:
33
Request-Line: INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 158.196.192.32;branch=z9hG4bK9ec4c0248acd48724710d7;rport
From: "SJphone" <sip:[email protected]>;tag=27df31582de
To: <sip:[email protected]>
Contact: <sip:[email protected]>
Call-ID: C317880624584EB9B1443F8B448CC2830x9ec4c020
CSeq: 2 INVITE
Max-Forwards: 70
User-Agent: SJphone/1.65.377a (SJ Labs)
Content-Length: 321
Content-Type: application/sdp
(v): 0
(o): - 3428274950 3428274950 IN IP4 158.196.192.32
(s): SJphone
(c): IN IP4 158.196.192.32
(t): 0 0
(m): audio 49162 RTP/AVP 18 3 8 0
(a): rtpmap:18 G729/8000
(a): rtpmap:3 GSM/8000
(a): rtpmap:8 PCMA/8000
(a): rtpmap:0 PCMU/8000
•
•
•
•
•
•
•
První řádek nám říká, že se jedná o zprávu INVITE, jež je užívána k sestavení spojení. URI
na prvním řádku sip:[email protected] se nazývá Request URI a obsahuje URI
dalšího skoku zprávy (next hop, směruje se dle RURI). V tomto případě bude hostitelem
asterisk.vsb.cz a hledá se uživatel 0738331699.
SIP žádost obsahuje v hlavičce jedno nebo více polí Via, jež jsou použity k záznamu cesty
žádosti. Následně jsou užívány ke směrování SIP odpovědí přesně takovou cestou, jakou
byly odeslány. Naše INVITE zpráva obsahuje jedno pole Via, to bylo vytvořeno UA, který
odeslal žádost. Z pole Via můžeme říct, že odpověď bude doručena UA na IP adresu
158.196.192.32 a port 5060.
Pole hlavičky From a To identifikuje iniciátora volání (volající) a příjemce (volaného). Pole
From obsahuje parametr tag, který slouží jako identifikátor dialogu a bude popsán později.
Pole hlavičky Call-ID je identifikátor dialogu a jeho cílem je identifikovat zprávy náležející
jednomu volání. Takovéto zprávy mají stejný identifikátor Call-ID.
V rámci dialogu jsou jednotlivé žádosti očíslovány v poli CSeq. Protože žádosti mohou být
odeslány nespolehlivým přenosem, může docházet k opakováním a pořadové číslo je nutné,
aby příjemce mohl detekovat opakování a správně tak selektovat žádosti.
V SIP hlavičce je dále pole Contact obsahující IP adresu a port, na kterém odesílatel očekává
další žádosti odesílané volaným, obě strany si vymění své kontakty v žádosti a odpovědi a
pokud bude chtít jedna ze stran poslat další požadavek, např. ukončení spojení BYE, tak
nemusí posílat žádost na SIP Proxy, ale pošle ji přímo. Samozřejmě že je možnost ovlivnit i
cestu dalších žádostí v dialogu, ale to si vysvětlíme v dalších kapitolách.
Hlavička zprávy je oddělena od těla zprávy prázdným řádkem. Tělo zprávy žádosti INVITE
obsahuje popis médií vyhovující odesílateli a kódované v SDP. Z SDP jsme se dozvěděli,
kdo poslal nabídku SDP a na které IP má být tok médií ukončen. A co se týče vlastní nabídky,
tak ta obsahuje čtyři kodeky seřazené dle preferencí G.729, GSM, PCM (A-law) a PCM (µlaw).
34
2.3.2
SIP metody
Žádosti neboli metody jsou obvykle užívány k inicializaci procedury (sestavení, aktualizaci či
ukončení spojení). V jádru SIP protokolu je dle RFC 3261 specifikováno šest metod, které jsou
následující:
•
•
•
•
•
•
INVITE je žádost o inicializaci spojení nebo změnu parametrů již probíhajícího spojení (reINVITE);
ACK je metoda potvrzující přijetí konečné odpovědi na žádost INVITE. Sestavení relace
používá „3-way hand-shaking“, volaný periodicky opakuje odpověď (např. 200 OK), dokud
nepřijme ACK, což indikuje, že odpověď byla doručena. Metoda ACK má řadu výjimek v
pravidlech gramatice SIPu, které budou zmíněny později;
BYE je zpráva užívána k ukončení sestaveného spojení;
CANCEL se používá ke zrušení sestavovaného spojení, když není sestaven dialog, volaný
ještě nepotvrdil konečnou odpovědí žádost INVITE a volající chce zrušit sestavování spojení;
REGISTER je žádost registrace anebo odregistrování uživatele, sváže se logická jmenná
adresa uživatele s jeho fyzickým umístěním (IP adresa a port), konkrétně jde o položky
FROM a CONTACT ze SIP hlavičky. Registrace jsou časově limitovány a je nutné je
periodicky obnovovat;
OPTIONS je speciální typ metody k zjištění vlastností SIP zařízení, má stejnou strukturu jako
INVITE, ale spojení není sestavováno, pouze se přijme odpověď. Využívá se např. nejen ke
zjištění podporovaných funkcí, ale SIP Proxy může periodickými dotazy zjišťovat mezi
registracemi, zda SIP UA odpovídá a je dostupný anebo naopak SIP UA může periodicky
posílat Options přes NAT k udržení záznamu překladu a tím pádem průchodnosti zvenčí.
Kromě výše vysvětlených šesti základních metod existují i další žádosti, které byly definovány
dodatečně v některých dalších RFC, viz. níže. Kupříkladu vyžadujeme-li funkcionalitu spolehlivé
doručování dočasných odpovědí (PRACK), tak je nutné zjistit, zda konkrétní zařízení podporuje RFC
3262. Pro základní telefonii postačí RFC 3261, pro přehled si uvedeme seznam metod užívaných
SIPem s odkazem na konkrétní RFC:
•
•
•
•
•
•
sestavení relace INVITE RFC 3261,
potvrzení na INVITE ACK RFC 3261,
ukončení existující relace BYE RFC 3261,
zrušení dosud nevyřízené žádosti CANCEL RFC 3261,
registrace (svázáno s URI) REGISTER RFC 3261,
získání schopností entity OPTIONS RFC 3261,
Další metody, které nejsou v RFC 3261, jsou následující:
•
•
•
•
•
•
•
•
přenos informací během relace INFO RFC 2976,
potvrzení dočasné (1xx) odpovědi PRACK RFC 3262,
přihlášení k upozornění na událost SUBSCRIBE RFC 3265,
doručení o události NOTIFY RFC 3265,
aktualizace stavu relace UPDATE RFC 3311,
zprávy pro instant messaging MESSAGE RFC 3428,
požadavek jiného UA k relaci REFER RFC 3515,
aktualizace prezence PUBLISH RFC 3903.
35
2.3.3
SIP odpovědi
Jestliže UAS obdrží žádost, tak na žádost odesílá odpověď. Každá žádost musí být zodpovězena,
výjimkou je metoda ACK, což je žádost, která má význam potvrzení doručení odpovědi na INVITE.
Naproti tomu PRACK (Provisional Acknowledgement) se potvrzuje. Odpovědi jsou svou strukturou
velmi podobné žádostem, kromě prvního řádku [col], [dav]. První řádek odpovědi obsahuje verzi
protokolu (SIP/2.0) a kód odpovědi (reply code). Typická odpověď vypadá následovně:
Status-Line: SIP/2.0 200 OK
Via: SIP/2.0/UDP 158.196.192.32;branch=z9hG4bK9ec4c02048ace1a554;rport=5060
From: "SJphone" <sip:[email protected]>;tag=164235a64f6
To: <sip:[email protected]>;tag=as04503766
Call-ID: 7798248D73F3443CABCD68EE653C791C0x9ec4c020
CSeq: 2 INVITE
User-Agent: Asterisk PBX
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Contact: <sip:[email protected]>
Content-Type: application/sdp
Content-Length: 312
(v): 0
(o): root 4648 4648 IN IP4 158.196.146.12
(s): session
(c): IN IP4 158.196.146.12
(t): 0 0
(m): audio 14290 RTP/AVP 0 8 3
(a): rtpmap:0 PCMU/8000
(a): rtpmap:8 PCMA/8000
(a): rtpmap:3 GSM/8000
Kód odpovědi je celé číslo z rozsahu 100 až 699 a označuje typ odpovědi. Celkem je definováno
6 tříd odpovědí, buď jsou informativní 1xx anebo finální 2xx-6xx:
•
•
•
1xx jsou dočasné informativní odpovědi, které jsou odesílány na žádosti, které byly přijaty,
ale výsledek zpracování ještě není znám, na základě této odpovědi musí odesílatel zastavit
opakování odesílání dané žádosti. Obvykle SIP Proxy servery odesílají odpovědi s kódem
100 (Trying), jestliže začínají zpracovávat INVITE a UA odesílají odpovědi s kódem 180
(Ringing), které oznamují vyzvánění volaného, kód 183 Session Progress má stejný význam
jako 180, ale je doplněn o popis médií (SDP),
2xx jsou pozitivní finální odpovědi, je to poslední odpověď, kterou odesílatel na svou
žádost dostává, vyjadřuje výsledek zpracování konkrétní žádosti. Odpovědi s kódy 200 až
299 oznamují, že požadavek byl akceptován a úspěšně zpracován, například odpověď 200
OK je vyslána, jestliže uživatel akceptuje žádost INVITE. V případě větvení zprávy INVITE
můžeme dosáhnout několik UAS a každý z nich bude akceptovat žádost. V tomto případě je
každá odpověď rozlišena parametrem tag v poli To. Každá odpověď probíhá v odlišném
dialogu s jedinečným identifikátorem dialogu,
3xx odpovědi jsou užívány k přesměrování. Tyto odpovědi dávají informaci o nové poloze
uživatele nebo alternativní službě, která má být použita. Pokud Proxy přijme žádost a
nezpracuje ji z nějakého důvodu, tak vyšle volajícímu v odpovědi požadavek na přesměrování
a vloží do odpovědi jiné umístění, které má být kontaktováno. Může to být jiná Proxy nebo
36
•
•
•
aktuální umístění volajícího (z lokalizační databáze vytvořené registrar serverem). Volající
následně znovu vyšle žádost na nové umístění, odpovědi 3xx jsou konečné,
4xx jsou negativní konečné odpovědi a znamenají problém na straně klienta. Žádost
nemohla být zpracována, protože obsahuje chybnou syntaxi,
5xx znamenají problém na straně serveru. Žádost je zřejmě v pořádku, ale server selhal při
zpracování, klient by měl obvykle požadavek zkusit znovu,
6xx představuje globální chybu a tento kód je vysílán, pokud žádost nemůže být splněna na
žádném serveru, to je odpověď obvykle vysílaná serverem, když má informaci o konkrétním
uživateli, např. UA vysílá 603 Decline response, když odmítá žádost o sestavení spojení,
Kromě odpovědi odpovídající třídy obsahuje první řádka popis reason phrase, obsažený kód je
určen ke zpracování, což je snadno analyzovatelné a popis jasně oznamuje výsledek. UA může
popis zobrazit uživateli. Přiřazení žádosti k odpovědi je na základě pole CSeq v hlavičce, kromě
pořadového čísla obsahuje také metodu korespondující žádosti, v našem případě to byla žádost
INVITE. Níže je uveden seznam odpovědí, se kterými se můžeme setkat v SIP protokolu:
1xx = informational responses
* 100 Trying
* 180 Ringing
* 181 Call Is Being Forwarded
* 182 Queued
* 183 Session Progress
2xx = success responses
* 200 OK
* 202 accepted: Used for referrals
3xx = redirection responses
* 300 Multiple Choices
* 301 Moved Permanently
* 302 Moved Temporarily
* 305 Use Proxy
* 380 Alternative Service
4xx = request failures
* 400 Bad Request
* 401 Unauthorized: Used only by registrars. Proxys should use proxy authorization 407
* 402 Payment Required (Reserved for future use)
* 403 Forbidden
* 404 Not Found: User not found
* 405 Method Not Allowed
* 406 Not Acceptable
* 407 Proxy Authentication Required
* 408 Request Timeout: Couldn't find the user in time
* 410 Gone: The user existed once, but is not available here any more.
* 413 Request Entity Too Large
* 414 Request-URI Too Long
* 415 Unsupported Media Type
* 416 Unsupported URI Scheme
* 420 Bad Extension: Bad SIP Protocol Extension used, not understood by the server
* 421 Extension Required
* 423 Interval Too Brief
37
* 480 Temporarily Unavailable
* 481 Call/Transaction Does Not Exist
* 482 Loop Detected
* 483 Too Many Hops
* 484 Address Incomplete
* 485 Ambiguous
* 486 Busy Here
* 487 Request Terminated
* 488 Not Acceptable Here
* 491 Request Pending
* 493 Undecipherable: Could not decrypt S/MIME body part
5xx = server errors
* 500 Server Internal Error
* 501 Not Implemented: The SIP request method is not implemented here
* 502 Bad Gateway
* 503 Service Unavailable
* 504 Server Time-out
* 505 The server does not support this version of the SIP protocol
* 513 Message Too Large
6xx = global failures
* 600 Busy Everywhere
* 603 Decline
* 604 Does Not Exist Anywhere
* 606 Not Acceptable
INVITE sip:[email protected] SIP/2.0
SIP/2.0 200 OK
Via: SIP/2.0/UDP here.com:5060
From: AG <sip:[email protected]>;tag=123
To: BG <sip:[email protected]>
Call-ID: [email protected]
Cseq: 1 INVITE
Contact: AG <sip:[email protected]>
Content-Type: application/sdp
Content-Length: 147
Via: SIP/2.0/UDP here.com:5060
From: AG <sip:[email protected]>;tag=123
To: BG <sip:[email protected]>;tag=65a35
Call-ID: [email protected]
Cseq: 1 INVITE
Contact: BG <sip:[email protected]>
Content-Type: application/sdp
Content-Length: 134
v=0
o=UserA 28908 28908 IN IP4 here.com
s=Session SDP
c=IN IP4 100.101.102.103
t=0 0
m=audio 49 172 RTP/AVP 0
a=rtpmap:0 PCMU/8000
v=0
o=UserB 28908 28908 IN IP4 there.com
s=Session SDP
c=IN IP4 110.111.112.113
t=0 0
m=audio 3456 172 RTP/AVP 0
a=rtpmap:0 PCMU/8000
Obr. 20. Žádost a odpověď
Na obr. 20 jsou pole žádosti INVITE a konečné odpovědi na ni 200 OK, zobrazeny jsou i obsahy
SDP, obě strany si vyměnily na sebe kontakty, nabídku SDP a odpověď na ní, použit bude kodek
PCM G.711 µ-law.
38
2.3.4
Transakce
Transakce jsou v SIPu velmi důležité pro tok zpráv a zacházení s nimi, neboť většina SIP prvků jsou
transakční stroje. Ačkoliv bylo řečeno, že SIP zprávy jsou posílány sítí nezávisle, tak obvykle jsou
uspořádány do transakcí agenty UA a stavovými SIP Proxy servery.
Obr. 21. Transakce v SIP protokolu.
Transakce je sekvence SIP zpráv vyměňovaných mezi síťovými SIP prvky. Transakce obsahuje
jednu žádost a všechny odpovědi vztažené k této žádosti. To může znamenat žádnou, jednu nebo i
více dočasných odpovědí a jednu nebo více konečných odpovědí (např. při větvení v Proxy na
zprávu INVITE ). Jestliže byla transakce zahájena žádostí INVITE, pak stejná transakce obsahuje i
zprávu ACK, ale dle RFC 3261 pouze tehdy, jestliže finální odpověď nebyla třídy 2xx, potom ACK
není součástí dané transakce. Důvodem je, že odpověď je zpráva 200 OK, viz. obr. 21. Jiná situace
je po přijetí non-2xx odpovědi, např. 407 Proxy Authorization Required, pak by žádost ACK do
transakce patřila a v poli branch byl stejný identifikátor jako u předešlých zpráv stejné transakce.
Především UA jsou zodpovědni za opakování odpovědi 200 OK, dokud nepřijmou ACK.
SIP entity, které sledují tyto transakce, se nazývají stateful, vytvořený stav k žádosti je spojován
s transakcí a je držen po celou dobu trvání transakce. Pokud přichází žádost nebo odpověď, tak je
zkoušeno vždy přiřazení zprávy do probíhající transakce. Aby tato operace byla proveditelná, tak
musí ze zprávy přečíst jednoznačný identifikátor transakce a porovnat jej s identifikátory
probíhajících transakcí. Jestliže takováto transakce existuje, tak dochází k jejímu doplnění o další
informace. V předchozím SIP RFC2543 (SIP 1.0) byl identifikátor transakce odvozován jako hash z
důležitých informací v hlavičce zprávy (zahrnující pole To, From, Request-URI a CSeq), což bylo
komplikované a zpomalovalo zpracování a při testech interoperability bylo zdrojem problémů. V
aktuálně používaném RFC3261 (SIP 2.0) byl způsob výpočtu identifikátoru transakce zásadně
změněn. Namísto komplikovaného určování z polí hlavičky teď obsahuje SIP zpráva identifikátor
přímo v políčku Via s názvem branch. To je významné zjednodušení, ovšem stále existují staré
39
implementace, které nepodporují nový způsob určování identifikátoru transakce, proto musí být
určování zpětně kompatibilní s oběma verzemi, noví UA a SIP Proxy musí rozeznat i předešlý
způsob, skutečnost v praxi je ovšem mnohdy jiná. Způsob nového určení transakce poznáme dle
začátku řetězce z9hG4bK v branch identifikátoru pole Via.
branch=z9hG4bK9ec4c0248acd48724710d7
Stavový transakční stroj okamžitě odpovídá 100 Trying na přijetí INVITE, čímž se potvrdí
přijetí INVITE a zastaví se případné její opakování, pokud už odpověď 100 Trying byla jednou
zaslána, tak se znovu nepřeposílá. Bezestavový stroj má jiné chování a přepošle vše, co dostane,
neboť si nepamatuje stavy transakce. Rozdíl mezi SIP Proxy pracující s transakcemi nebo bez je
vidět na obr. 22.
Alice's
UA
Stateful
Proxy
Stateless
Proxy
Stateful
Proxy
Bob's
UA
INVITE
100 TRYING
INVITE
INVITE
100 TRYING
100 TRYING
INVITE
100 TRYING
180 RINGING
180 RINGING
180 RINGING
200 OK
ACK
180 RINGING
200 OK
200 OK
ACK
200 OK
ACK
Media Session
Obr. 22. Rozdílné zacházení se 100 Trying u stavových transakčních strojů.
2.3.5
Dialog
V předchozím kapitole jsme si ukázali dvě transakce, viz. obr. 21, jedna transakce obsahovala
zprávu INVITE a odpověď, druhá obsahovala zprávu BYE a následnou odpověď. Obě transakce
však spolu souvisejí a náleží tak do jednoho dialogu, v první verzi SIPu RFC 2543 se používal pro
dialog výraz call-leg.
40
Caller
Callee
INVITE
100 TRYING
Transaction #1
180 RINGING
200 OK
Dialog
ACK
BYE
Transaction #2
200 OK
Obr. 23. Dialog.
Dialog bychom mohli definovat jako soubor SIP zpráv peer-to-peer mezi dvěma UA, které mají
vzájemnou spojitost. Dialogy popisují řazení a směrování zpráv mezi dvěma koncovými body.
Dialogy jsou identifikované pomocí pole Call-ID, From (tag) a To (tag). Zprávy, které mají tyto tři
identifikátory stejné, tak náleží jednomu dialogu. Ukázali jsme si, že pole CSeq je užíváno k řazení
zpráv, je používáno k řazení zpráv uvnitř dialogu. CSeq číslo určuje transakci uvnitř dialogu, protože
jsme řekli, že žádost a přidružená odpověď se nazývá transakce. To znamená, že v každém směru
může být uvnitř dialogu aktivní pouze jedna transakce. Mohli bychom také tvrdit, že dialog je
posloupnost transakcí. Pomocí CSeq snadno rozpoznáme zprávy dialogu. Dialogy usnadňují řízení
komunikace, protože UA nedrží stavy dialogu. V uvedeném příkladu zpráva INVITE zahajuje dialog,
neboť inicializuje spojení, všechny zprávy v tomto spojení patří do stejného dialogu, který je ukončen
konečnou odpovědí na žádost BYE.
Dialogy jsou vytvářeny generováním odpovědí typu non-failure (bez návratu chyby), pouze
odpovědi typu 2xx a 101-199 jsou schopny sestavit dialog, neboť vrací značku (tag) v poli To (To tag).
RFC 3261 nepřináší zcela jednoznačnou definici, kdy je dialog přesně sestaven a proto
rozeznáváme dva stavy:
•
•
napůl sestavený (early dialog);
potvrzený dialog (confirmed dialog).
Pokud se hovoří o dialogu, tak jde o potvrzený dialog, zatímco v prvním případě se vždy uvádí
plně jako early dialog. Early dialog je sestaven dočasnou (non-final) odpovědí 101-199, potvrzený
dialog je sestaven pomocí pozitivní konečné odpovědi 2xx. Dialog při typickém sestavení spojení
projde prvním stavem, než je potvrzen. Všimněme si, že dočasná odpověď typu 100 TRYING
neumožňuje sestavit early dialog a v této odpovědi se nepřidává To tag.
41
2.3.6
Transakce a dialog v příkladu
Určení transakce a dialogu si můžeme ukázat v následujícím příkladu, který odpovídá obr. 68, jde
tedy o žádost INVITE s odpověďmi 100 TRYING, 180 RINGING, 200 OK, dále žádost ACK a
nakonec BYE s odpovědí 200 OK. První zpráva #1 INVITE obsahuje branch=z9hG4bK7225f861 ,
který najdeme ve zprávách #1 INVITE, #2 100 TRYING, #3 180 RINGING a #4 200 OK, tím je
určena první transakce. Zpráva #5 ACK obsahuje branch=z9hG4bK57289016 , čili do první
transakce nepatří a ani novou transakci nevytváří, neboť na tuto žádost není odpověď. Druhá
transakce obsahuje branch=z9hG4bK011c16dd a je tvořena #6 BYE a #7 200 OK. Dialog je určen:
•
•
•
pomocí tag=as396d4fbf z pole From,
tag=4227117d4b8 z pole To,
řetězcem v Call-ID: [email protected]
Early dialog je vytvořen přijetím #3 180 RINGING a dialog je sestaven přijetím #4 200 OK. Pole
Cseq se v rámci dialogu inkrementuje s každou novou žádostí (výjimkou je ACK), všechny odpovědi
k žádosti mají stejný Cseq, čili lze jednoduše určit, ke které žádosti odpověď patří a rovněž se
snadno rozpoznají retransmise.
#1
INVITE
Request-Line: INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 158.196.146.12:5060;branch=z9hG4bK7225f861;rport
From: "5779" <sip:[email protected]>;tag=as396d4fbf
To: <sip:[email protected]>
Contact: <sip:[email protected]>
Call-ID: [email protected]
CSeq: 102 INVITE
User-Agent: Asterisk PBX
Max-Forwards: 70
Content-Type: application/sdp
Content-Length: 422
(v): 0
(o): root 4648 4648 IN IP4 158.196.146.12
(s): session
(c): IN IP4 158.196.146.12
(t): 0 0
(m): audio 14252 RTP/AVP 0 8 3 18
(a): rtpmap:0 PCMU/8000
(a): rtpmap:8 PCMA/8000
(a): rtpmap:3 GSM/8000
(a): rtpmap:18 G729/8000
#2
100 TRYING
Status-Line: SIP/2.0 100 Trying
Via: SIP/2.0/UDP 158.196.146.12:5060;branch=z9hG4bK7225f861;rport=5060
From: "5779" <sip:[email protected]>;tag=as396d4fbf
To: "SJphone" <sip:[email protected]>
Call-ID: [email protected]
CSeq: 102 INVITE
Content-Length: 0
Server: SJphone/1.65.377a (SJ Labs)
42
#3
180 RINGING
Status-Line: SIP/2.0 180 Ringing
Via: SIP/2.0/UDP 158.196.146.12:5060;branch=z9hG4bK7225f861;rport=5060
From: "5779" <sip:[email protected]>;tag=as396d4fbf
To: "SJphone" <sip:[email protected]>;tag=4227117d4b8
Contact: <sip:[email protected]>
Call-ID: [email protected]
CSeq: 102 INVITE
Content-Length: 0
Server: SJphone/1.65.377a (SJ Labs)
#4
200 OK
Status-Line: SIP/2.0 200 OK
Via: SIP/2.0/UDP 158.196.146.12:5060;branch=z9hG4bK7225f861;rport=5060
From: "5779" <sip:[email protected]>;tag=as396d4fbf
To: "SJphone" <sip:[email protected]>;tag=4227117d4b8
Contact: <sip:[email protected]>
Call-ID: [email protected]
CSeq: 102 INVITE
Content-Length: 274
Content-Type: application/sdp
Server: SJphone/1.65.377a (SJ Labs)
(v): 0
(o): - 3428314846 3428314846 IN IP4 158.196.192.32
(s): SJphone
(c): IN IP4 158.196.192.32
(t): 0 0
(m): audio 49152 RTP/AVP 0
(a): rtpmap:0 PCMU/8000
#5
ACK
Request-Line: ACK sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 158.196.146.12:5060;branch=z9hG4bK57289016;rport
From: "5779" <sip:[email protected]>;tag=as396d4fbf
To: <sip:[email protected]>;tag=4227117d4b8
Contact: <sip:[email protected]>
Call-ID: [email protected]
CSeq: 102 ACK
User-Agent: Asterisk PBX
Max-Forwards: 70
Content-Length: 0
#6
BYE
Request-Line: BYE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 158.196.146.12:5060;branch=z9hG4bK011c16dd;rport
From: "5779" <sip:[email protected]>;tag=as396d4fbf
To: <sip:[email protected]>;tag=4227117d4b8
Call-ID: [email protected]
CSeq: 103 BYE
User-Agent: Asterisk PBX
Max-Forwards: 70
Content-Length: 0
43
#7
200 OK
Status-Line: SIP/2.0 200 OK
Via: SIP/2.0/UDP 158.196.146.12:5060;branch=z9hG4bK011c16dd;rport=5060
From: "5779" <sip:[email protected]>;tag=as396d4fbf
To: "SJphone" <sip:[email protected]>;tag=4227117d4b8
<sip:[email protected].
Contact: <sip:[email protected]>
Call-ID:
ID: [email protected]
CSeq: 103 BYE
Content-Length: 0
Server: SJphone/1.65.377a (SJ Labs)
2.3.7
SIP časovače
e a retransmise
Jelikož se v SIP signalizaci používá mnohdy nespolehlivý přenos
p enos (UDP), musí být ošet
ošetřeny
retransmise žádostí v transakcích.
Tab. 3 Časovače
e dle RFC 3261.
Po odeslání žádosti INVITE klientem se zprávy v transakcích opakují po dosažení časovače T1 a
následně vždy po dosažení dvojnásobné doby od poslední retransmise, tzn. poprvé T1, podruhé
44
2*T1, dále 4*T1 a 8*T1. Základní časovač T1 je odvozen od RTT (Round Trip Time) a jeho výchozí
hodnota je nastavena na 500 ms. Téměř všechny časovače jsou od T1 odvozeny a změna T1 se tak
do nich promítá.
Retransmise se neuplatňují při použití spolehlivého přenosu (TCP). Přijetí dočasné informativní
odpovědi 1xx zastavuje retransmise žádosti INVITE a UAC musí čekat na přijetí dalších odpovědí.
UAS může opakovat dočasnou odpověď 1xx před zasláním finální odpovědi, pokud se používá
nespolehlivý přenos. Každá finální odpověď na INVITE je potvrzena ACK. Na straně UAC je
dohlížen timeout transakce, žádná transakce by neměla trvat déle než 64*T1 (časovač B). Pokud
vyprší časovač A, tak se provede retransmise a časovač se zvedne na 2*T1, pokud i tento čas
vyprší , tak se zase zdvojnásobí. Níže jsou popsány časovače uvedené v RFC 3261.
2.3.8
Zabezpečení v SIPu
Protokol SIP je přenášen jako otevřený text a je snadněji analyzovatelný než H.323, který je
kódován v ASN.1 PER. Pro zachycení a nahlídnutí do SIPové komunikace nepotřebujeme
analyzátory, vystačíme si např. s linuxovým příkazem ngrep. Principy způsobu komunikace v SIPu
jsou podobné HTTP a díky této podobnosti se využívají stejné bezpečnostní mechanismy, které
používá právě Hypertext Transfer Protocol [voz159], [voz174] a [voz180]..
•
•
•
•
HTTP Basic Authentication je prvním mechanizmem, který zajišťuje autentizaci pomocí
sdíleného hesla. Data nejsou šifrována a není také zaručena integrita zprávy, obsahuje pouze
základní kódování schématem Base64.
HTTP Digest Authentication vychází z předchozí metody s tím rozdílem, že místo přenosu
otevřeného hesla ho šifruje pomocí hashovaní funkce MD5 nebo SHA. Ta funguje tak, že
heslo vytvoří z náhodně generovaného řetězce, loginu a hesla. Tato metoda ověřuje
autenticitu na základě sdíleného hesla. Obsah zprávy se však nijak nešifruje.
Secure MIME (S/MIME) je, jak z názvu vyplývá, zabezpečení tzv. MIME (Multipurpose
Internet Mail Extension). Konkrétně tato metoda zabezpečí obsah zprávy a zaručí i její
integritu. Existuji dva způsoby šifrování obsahu dat MIME. První application/pkcs7-mime
dokáže digitálně podepsat a zašifrovat data. Druhý způsob multipart/signed je podobný
prvnímu s tím rozdílem, že zpráva obsahuje šifrovaná i nešifrovaná data. K ověření
autentizace se používá architektura veřejných klíčů (PKI). Pro utajení obsahu zprávy jsou
využity symetrické kryptografické primitivy (DES, 3DES, AES).
SIPS URI (TLS) využívá architekturu veřejných klíčů pro ověření autentizace. Při použití této
metody se mění prefix identifikační hlavičky na sips. Aby byla zaručena bezpečná
komunikace, používá tato metoda šifrovaný protokol Transfer Layer Security (TLS). Tento
protokol využívá asymetrické šifrování (RSA), symetrické algoritmy (DES, 3DES, AES) a
hashovací funkci. Při použití této metody je kladena podmínka, že protokol TLS je použit na
celé cestě zprávy a pro SIP musí být použit protokol TCP.
Princip používané metody HTTP digest bude prakticky vysvětlen v následující kapitole
zabývající se registrací, u registrace se neautentizovaná zpráva REGISTER odmítá pomocí 401
Unauthorized, v případě INVITE je to 407 Proxy Authentication Required, následně se pošle
REGISTER nebo INVITE s autentizačním řetězcem, který je ověřen. Pokud je použito TLS, tak další
autentizace pomocí HTTP digest je zbytečná a nepoužívá se, neboť už sestavení TLS obsahuje
jeden z kroků, u kterého se klient prokazuje certifikátem a zabezpečení je na mnohem vyšší úrovni.
Řada aplikací volně dostupných na Internetu se dá použít buď ke generování útoků, odposlechu
45
hovoru či modifikaci paketů spojení, proto je otázka zabezpečení nejen signalizace, ale i vlastního
hovoru velmi důležitá, což je argument pro použití TLS. Například aplikace SCAPY umožňuje nejen
prolomení základních způsobů zabezpečení, ale i modifikaci obsahu paketů v reálném čase. SIPp je
open-source generátor provozu, pomocí kterého zvládneme připravit DoS (Denial of Service) anebo
DDOS útok (distribuovaný DoS). Aplikace voipbot umí pět různých typů útoků a sipdump se sipcrack
umožňují uhodnutí hesla v autentizací s MD5. Zajímavou aplikací s použitím pro testování výkonnosti
SIP serveru anebo pro útoky je VoIPER.
2.4
Registrace
Při registraci se sváže User URI z pole From s Device URI z pole Contact hlavičky SIP. Pokud pole
Contact hlavička žádosti Registrace neobsahuje, tak se z Registrar serveru ve 200 OK vrátí seznam
platných registrací k SIP URI z pole From. Device URI nese IP adresu a port, na kterém je uživatel
se svou SIP URI k dosažení, např. pro SIP URI sip:[email protected] může být device URI
sip:[email protected]:5060 . Doba platnosti registrace je dána parametrem expires v hlavičce,
tento čas je Registrar serverem upravován, pokud UAC v návrhu nezadá čas, který by ležel v
povoleném intervalu mezi minimální a maximální dobou registrace na Registrar serveru. Pokud se
pošle nulová hodnota doby registrace expires=0, tak to znamená zrušení registrace, viz. níže.
Request-Line: REGISTER sip:cesnet.cz SIP/2.0
Via: SIP/2.0/UDP 195.168.1.10;branch=z9hG4bK-d8754zdf2acad8754z-;rport
Max-Forwards: 70
Contact: <sip:[email protected];rinstance=45b13194f4a07bb>;expires=0
To: "voznak"<sip:[email protected]>
From: "voznak"<sip:[email protected]>;tag=9043320d
Call-ID: MjY0YzU5OTdiMDYxNTI4YzgzNTIwYzE2NTUzNzgyZGM.
CSeq: 5 REGISTER
User-Agent: X-Lite release 1100l stamp 47546
Authorization: Digest username="voznak",realm="cesnet.cz", nonce="48ad92308a4f8ee",
uri="sip:cesnet.cz",response="6e6f1ca5803c805ac885f8cb4a8a1df1",algorithm=MD5
Content-Length: 0
Odregistrování všech lokalizací konkrétního URI uživatele se docílí tak, že do pole Contact se
zadá znak * a zároveň s nulovou hodnotu do expirace expires=0.
Registrar
Server
UA
A@
B@
C@
REGISTER
401 UNAUTHORISED
REGISTER with AUTH.
200 OK
Obr. 24. Registrace s autentizací.
46
Nepochybně je žádoucí, aby se uživatel při registraci autentizoval. Předpokládejme, že uživatel
obdržel důvěryhodným způsobem uživatelské jméno a heslo, které si uložil ve svém IP telefonu. SIP
používá stejnou metodu autentizace jako HTTP, a to HTTP digest authentication. Metoda spočívá v
tom, že obě strany, jak server tak i klient, mají sdílené tajemství (heslo) a pomocí daných vstupních
parametrů je jednosměrnou funkcí vygenerován otisk (hash). Vlastnost jednosměrné funkce spočívá
v tom, že není možné z otisku zpětně získat vstupní proměnné funkce, přesněji řečeno
pravděpodobnost získání vstupů je mizivá a otisk je jedinečný, tzn. neexistují dva stejné otisky pro
různé vstupy hashovací funkce. Pokud hash zaslaná klientem bude souhlasit s řetězcem, který
spočítal server, tak autentizace bude úspěšná a kladně tak vyřízena.
Na obr. 24 je znázorněna výměna při registraci s autentizací. Žádost INVITE je odeslána bez
autentizačních údajů na SIP Proxy, ta odmítá odpovědí 401 Unauthorized, v odpovědi posílá bližší
informace k autentizaci. Klient akceptuje zaslané informace a vypočte hash, kterou zašle ve zprávě
REGISTER, tentokrát je úspěšně autentizován a dostává 200 OK s potvrzením registrace.
Status-Line: SIP/2.0 401 Unauthorized
Message Header
Via: SIP/2.0/UDP 195.168.1.10:18188;branch=z9hG4bKd8754z-d8754z-;rport=33209
To: "voznak"<sip:[email protected]>;tag=c10ed4fff3e6fb17efd0bfbdcce87ce2.10f8
From: "voznak"<sip:[email protected]>;tag=f861ac5a
Call-ID: Mzg1M2VlZDRkOWQ5NmJlNzA0MTk1OGNhZDE3MjZiNDg.
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="cesnet.cz", nonce="48ad92c"
Server: Sip EXpress router (0.9.6 (i386/linux))
Content-Length: 0
Request-Line: REGISTER sip:cesnet.cz SIP/2.0
Via: SIP/2.0/UDP 195.168.1.10:18188;branch=z9hG4bK-d8bc45e75b347-;rport
Max-Forwards: 70
Contact: <sip:[email protected]:18188;rinstance=8546638886339213>
To: "voznak"<sip:[email protected]>
From: "voznak"<sip:[email protected]>;tag=f861ac5a
Call-ID: Mzg1M2VlZDRkOWQ5NmJlNzA0MTk1OGNhZDE3MjZiNDg.
CSeq: 2 REGISTER
Expires: 3600
User-Agent: X-Lite release 1100l stamp 47546
Authorization: Digest username="voznak",realm="cesnet.cz",nonce="48ad92c",
uri="sip:cesnet.cz",response="1ca1df39a865353b8703343cbdfbb062",algorithm=MD5
Content-Length: 0
Na příkladu výše je odpověď 401 Anauthorized, která obsahuje v odmítnutí výzvu k autentizaci
a podává klientovi realm a nonce pro hashovací funkci. Klient posílá žádost REGISTER znovu, ale
tentokrát již s autentizačními údaji, je použit algoritmus MD5, pro hash se použije username, realm,
nonce a password, což je sdílené tajemství. Výsledný hash je v poli response.
2.5
Směrování
Zásadním problémem směrování je, jak z URI adresy určit cíl. SIP v tomto směru může využít buď
DNS anebo statických směrovacích záznamů a dalších údajů lokalizace UA v databázi, do které se
dostaly přes Registrar server. Pokud se cíl určí a spojení je uskutečněno, tak se objevují další
47
zásadní otázky. Kudy budou směrovány další žádosti, zda by měla SIP Proxy být prostředníkem v
komunikaci a zůstávat v SIP signalizační trase či nikoliv.
Noční můrou každého signalizačního protokolu je vznik nekonečné smyčky (zacyklení), v tomto
ohledu má SIP dva silné nástroje. Prvním je detekce smyček pomocí branch parametru v poli Via,
který si umí zapamatovat ovšem pouze stateful SIP Proxy, pomocí branch zjistí, že zpráva patří do
jedné transakce a může tak limitovat počet zpráv v transakci. Druhým nástrojem je povinné pole
Max- Forwards v SIP hlavičce, které se snižuje o jedničku na každém skoku (výchozí hodnota je
obvykle 70), tzn. s každým průchodem přes SIP Proxy se hodnota sníží, až dosáhne 0, tak SIP Proxy
odešle 483 Too Many Hops a zpráva zanikne.
V obr. 25 je znázorněn tok zpráv v rámci jednoho SIP Proxy serveru, ze kterého je čitelná
souslednost konkrétních žádostí a odpovědí. Směrování mezi SIP Proxy servery je obsahem dalších
kapitol.
Obr. 25. Tok SIP zpráv v rámci SIP Proxy
2.5.1
Směrování dle RURI a Via
Žádosti jsou směrovány dle prvního řádku (RURI) SIP metody a odpovědi na žádost dle prvního
záznamu ve Via., viz. obr. 26. Alice volá Boba, odesílá se INVITE, původní SIP URI se zapisuje do
pole To , kde je logická adresa příjemce AOR (Address of Record) a neměl by ho po cestě nikdo
změnit. První řádek obsahující RURI (Request URI) může SIP Proxy změnit dle aktuálních
směrovacích informací, INVITE nakonec zastihne Boba na sip:[email protected] . Alicin
UA zapisuje do pole Via na první řádek sám sebe (a.example.com nebo svou IP), každá další Proxy
po cestě udělá to samé, opět se vepíše na první řádek, a tak INVITE, který dostane Bob, bude mít
48
čtyři záznamy ve Via, viz. obr. 26. Jelikož odpověď je směrována dle Via, tak prochází stejnou cestou
jako žádost, každý první záznam je z Via odstraněn ihned po přijetí odpovědi SIP Proxy, a tak je
aktuální informace ve Via vždy první. Jakmile si koncové komunikující strany vymění na sebe
kontakty (pole Contact v hlavičce), tak další žádosti mohou být odesílány napřímo. Ovšem i tato
cesta se dá ovlivnit, viz. další kapitola.
[email protected]
INVITE
Via: a.example.com
Via: a.example.com
[email protected]
[email protected]
Via: y1.yahoo.com
Via: a.example.com
Via: y1.yahoo.com
Via: a.example.com
Via: sip.columbia.edu
Via: y1.yahoo.com
Via: a.example.com
Via: sip.columbia.edu
Via: y1.yahoo.com
Via: a.example.com
Via: cs.columbia.edu
Via: sip.columbia.edu
Via: y1.yahoo.com
Via: a.example.com
[email protected].
columbia.edu
[email protected]
200 OK
Via: cs.columbia.edu
Via: sip.columbia.edu
Via: y1.yahoo.com
Via: a.example.com
Obr. 25. Směrování žádostí a odpovědí.
2.5.2
SIP trapezoid
SIPu trapezoid je typickým příkladem směrování zpráv v SIPu, předpokládáme, že Alice
(sip:[email protected]) volá Boba z jiné domény (sip:[email protected]). INVITE je zaslán na SIP
Proxy domény atlanta.com, která vyhledá SIP Proxy obsluhující doménu biloxi.com a tam INVITE
odešle, SIP Proxy domény biloxi.com zná umístění Boba a přepošle tedy INVITE Bobovi. Odpovědi
jdou stejnou cestou jako žádost dle položky Via. ACK je další žádostí (potvrzení doručení finální
odpovědi) a ta je zaslána přímo Bobovi dle pole Contact. Alice provede hovor s Bobem a relaci
ukončí Bob odesláním žádosti BYE, která odchází na Alici přímo dle pole Contact. Tok zpráv
připomíná geometrický útvar trapezoid, viz. obr. 27. Následně se podíváme do hlaviček SIP zpráv při
sestavení spojení a popíšeme si, jak prvky na trase pracují s vybranými položkami hlavičky (bez SDP,
popis médií je obsahem samostatné kapitoly), budeme pracovat se stateful SIP Proxy. První řádek
obsahuje Request-URI a tato URI je zapsána do pole To jako AOR, tam nebude měněna. Do Via se
49
zapíše odesílatel a přidá branch pro identifikaci transakce, když se mu vrátí odpověď se stejným
branch , tak ji zařadí do této transakce.
IN
V
TE
VI
IT
E
IN
Obr. 27. SIP trapezoid.
Do pole From zapíše odesílatel svou logickou SIP URI (AOR), přičemž text před úhlovými
závorkami se zobrazuje na displeji jako textová identifikace odesílatele. Do pole Contact zapíše
odesílatel svou device SIP URI, na které je k zastižení. Je vytvořeno nové jedinečné Call-ID, pořadí
transakce Cesq a za ním název metody, nakonec je v hlavičce odkaz na tělo SDP (v naší ukázce
odebráno).
INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
Max-Forwards: 70
To: Bob <sip:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:[email protected]>
Content-Type: application/sdp
Content-Length: 142
INVITE dorazil na SIP Proxy atlanta.com a jelikož je statefull, tak ihned odesílá 100 TRYING.
Odpověď 100 TRYING obsahuje stejné hodnoty To, From, Call-ID, Cseq jako v přijatém INVITE.
Parametr received je přidán do pole Via , kde SIP Proxy doplní stroj , ze kterého byla žádost přijata
pc33.atlanta.com (může být i IP).
SIP/2.0 100 Trying
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1
To: Bob <sip:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
50
Content-Length: 0
SIP Proxy atlanta.com najde SIP Proxy, která obsluhuje doménu biloxi.com, ve které je volaný
Bob. Nejdříve zjistí, zda už nemá destinaci ve své lokalizační databázi a pokud ne, tak provede
vyhledání v DNS (DNS lookup), bude se hledat SRV záznam, ten obsahuje identifikaci stroje, který
poskytuje službu SIP v dané doméně. INVITE teď SIP Proxy přepošle na zjištěnou cílovou SIP Proxy,
přičemž připíše parametr received do prvního záznamu ve Via, následně zapíše sebe jako první
záznam ve Via a sníží hodnotu v položce Max-Forwards. Další položky SIP hlavičky zůstávají
nezměněny.
INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1
Max-Forwards: 69
To: Bob <sip:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:[email protected]>
Content-Type: application/sdp
Content-Length: 142
INVITE byl přijat SIP Proxy biloxi.com, která ihned odesílá 100 TRYING, obdobně
předchozím kroku je přidán parametr received do Via.
jako v
SIP/2.0 100 Trying
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1
To: Bob <sip:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Content-Length: 0
SIP Proxy biloxi.com vyhledává ve své lokalizační databázi záznam Boba, který byl vložen při
registraci, v lokalizační databázi je device URI z pole Contact svázána s logickou URI
sip:[email protected]. Proxy biloxi.com odesílá INVITE Bobovi, přičemž připíše received do prvního
záznamu ve Via, následně zapíše sebe jako první záznam ve Via a sníží hodnotu v položce MaxForwards, zbytek hlavičky nemění.
INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1
Max-Forwards: 68
To: Bob <sip:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:[email protected]>
Content-Type: application/sdp
Content-Length: 142
51
Dále si ukážeme obsah odpovědi 180 RINGING odesílanou z Bobova UA. Bobův UA vyzvání a
odesílá 180 RINGING, do hlavičky připíše received do prvního záznamu ve Via a přidává tag do
pole To. Ačkoliv dialog není ještě sestaven, tak jsou už definovány všechny tři části, dle kterých se
identifikuje (Call-ID, from Tag a to Tag). Do pole Contact zapisuje Bob svou device URI, na které je k
zastižení, přičemž v příchozím INVITE získal kontakt na Alici.
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1
To: Bob <sip:[email protected]>;tag=a6c85cf
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:[email protected]>
CSeq: 314159 INVITE
Odpověď 180 RINGING je přeposílána přes SIP Proxy Alici, přičemž každá SIP Proxy po přijetí
smaže první řádek v pořadí ve Via, a přepošle na další stroj v pořadí ve Via, odpověď se tak
postupně dostane až k odesílateli žádosti. Bobův UA vyzvání a na displeji zobrazuje text z pole From
přijatý v INVITE, tzn. vidí na displeji nápis Alice. Po přijetí volání odesílá Bobův UA odpověď 200 OK
s obdobnou konstrukcí jako 180 RINGING, akorát se posílá i SDP, což v ukázce teď není. Jelikož
jde o odpověď finální, tak se ukončuje transakce mezi biloxi.com a Bobem identifikovanou
branch=z9hG4bK4b43c2ff8.1, pořadí ukončené transakce je dané polem CSeq: 314159 INVITE.
SIP/2.0 200 OK
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8;received=192.0.2.1
To: Bob <sip:[email protected]>;tag=a6c85cf
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:[email protected]>
Content-Type: application/sdp
Content-Length: 131
Přijatá odpověď 200 OK je přeposlána na SIP Proxy atlanta.com a ukončí transakci mezi
biloxi.com a atlanta.com branch=z9hG4bK77ef4c2312983.1 se CSeq: 314159 INVITE. Nakonec je
200 OK přeposlána ze SIP Proxy atlanta.com Alici a ukončí na obou strojích transakci
branch=z9hG4bKnashds8 se CSeq: 314159 INVITE. Alicin UA přestává indikovat vyzvánění a
kontrolní vyzváněcí tón umlkne, Alice může začít mluvit.
Dokud Bobův UA neobdrží žádost ACK, tak nebude mít jistotu, že odpověď 200 OK byla
doručena a bude opakovaně odesílat 200 OK (retransmise). ACK žádost je zaslána přímo na Bobův
UA a obchází obě SIP Proxy, k tomuto dochází, protože obě strany si uložily na sebe kontakty z pole
Contact SIP hlaviček. Jelikož ACK nepatří do předchozí transakce, tak se vytvoří nový
branch=z9hG4bKnashds9, ale nezvedá se Cseq, neboť na žádost ACK není žádná odpověď a
nevytváří tak novou transakci. Jedná se o stejný dialog, a tak se musí zachovat značky From tag, To
tag a Call-ID.
52
ACK sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9
Max-Forwards: 70
To: Bob <sip:[email protected]>;tag=a6c85cf
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 ACK
Content-Length: 0
Hovor ukončí Bob, zavěsí a jeho UA odesílá žádost BYE, opět přímo na Alici. Jedná o novou
transakci, takže se zvedne Cseq a zachová se From tag, To tag a Call-ID (patří do dialogu). Po
přijetí finální odpovědi 200 OK na BYE se dialog ukončí.
BYE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
Max-Forwards: 70
From: Bob <sip:[email protected]>;tag=a6c85cf
To: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314160 BYE
Content-Length: 0
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
From: Bob <sip:[email protected]>;tag=a6c85cf
To: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314160 BYE
Content-Length: 0
2.5.3
Udržení SIP Proxy v signalizační trase
V předchozí kapitole byly další žádosti v dialogu zasílány přímo mezi koncovými účastníky
spojení a signalizace tak obcházela SIP Proxy. Nástrojem, který v SIPu umožní zachovat libovolný
prvek v signalizační trase během celého dialogu, je pole Record-route SIP hlavičky pro uložení
záznamu o cestě a pole Route, dle kterého se žádost směruje .
Without record routing
UA1
SIP Proxy
With record routing
UA2
UA1
BYE
SIP Proxy
UA2
BYE
BYE
200 OK
200 OK
Obr. 28. Rozdíl v komunikaci při použití Record-route pole
53
200 OK
Do hlavičky žádosti INVITE se vloží pole Record-route obsahující záznam prvku, který chceme
udržet v trase, tzn. že SIP Proxy do INVITE přidá sebe např. p1.atlanta.com a pokud INVITE
prochází další SIP Proxy, která se chce udržet v trase, tak se opět zapíše do hlavičky jako např.
p2.biloxi.com, v INVITE nám tedy přibude:
Record-route: <sip:p2.biloxi.com;lr>
Record-route: <sip:p1.atlanta.com;lr>
INVITE dorazil cílovému příjemci, pokud je detekováno pole Record-route , tak UA si nastaví
cestu odesílání žádostí dle seznamu URI v Record-route seřazeném tak, jak byly zapsány v přijatém
INVITE. Poté UA zkopíruje Record-route položky do odpovědi 180 RINGING a ta putuje původnímu
odesílateli INVITE, v odpovědi nikdo nesmí Record-Route změnit. Příjemce odpovědi si nastaví cestu
odesílání žádostí dle seznamu Record-route v obráceném pořadí. Pro další krok, je nutné vysvětlit
dva přístupy ke směrování SIP žádostí:
•
•
Strict routing přepíše RURI (Request-URI, první řádek SIP žádosti) dle údaje v Route poli
hlavičky, přepisuje RURI na každém skoku a prochází jen přes servery uvedené v Route poli
hlavičky;
Loose routing je metoda která se mnohem více užívá a její aplikaci vyjadřuje parametr lr v poli
Record-Route či Route. V tomto případě se nepřepisuje RURI, ale žádost se směruje dle
URI v Route poli hlavičky, na každém skoku se dané URI z Route hlavičky odstraní, až
neexistuje žádné URI v poli Route a potom se odsměruje dle RURI.
Další žádost (např. ACK) odešle UA tak, že sestaví Request-URI standardně z pole Contact v
odpovědi na INVITE, ale vytvoří Route pole v hlavičce ACK, které bude obsahovat:
Route: <sip:p1.atlanta.com;lr>, <sip:p2.biloxi.com;lr>
Údaje byly získány v Record-route a pořadí bylo obráceno (jelikož údaje byly získány z odpovědi).
Žádost je odsměrována dle prvního URI v route hlavičce. ACK tak dorazí na SIP Proxy
p1.atlanta.com, kde je odstraněn první záznam v pořadí z pole Route a na další je ACK odesláno, a
tak dorazí na SIP Proxy p2.biloxi.com, kde je opět odstraněn první záznam v pořadí, a jelikož je
Route pole prázdné, tak se dále směruje dle RURI.
2.6
SDP- protokol popisu relace
SDP je Session Description Protocol, který obecně slouží k popisu kterékoliv relace a je se
SIP signalizací velmi často používán. Používá se často se SIPem a proto se v souvislosti se SIPem
objevuje označení SIP/SDP. SDP protokol prošel třemi zásadními verzemi:
•
•
•
Session Description Protocol, RFC 2327 z roku 1998 je původní verze;
Support for IPv6 in Session Description Protocol (SDP), RFC 3266 z roku 2002 je aktualizací
RFC 2327 a rozšířením o IPv6;
Session Description Protocol, RFC 4566 z roku 2006 je nahrazením obou předešlých,
uvolněním RFC 4566 zastaraly obě RFC 2327 i 3266, ale je zde zpětná kompatibilita, tzn. že
implementace dle RFC 4566 dokáže porozumět starším verzím.
54
SDP se skládá z řádků obsahující text ve formě položek typ a hodnota oddělených rovnítkem,
položky, u kterých je symbol *, jsou nepovinné:
<type>=<value>
Položky jsou rozděleny do třech skupin:
•
•
•
Session description, popis relace,
Time description, popis časování,
Media description, popis médií.
Následně si projdeme seznam položek SDP dle skupin uvedených RFC 4566. Skupina Session
description obsahuje položky v,o,s,i,u,e,c,b,z,k,a, kde:
•
•
•
•
•
•
•
•
•
•
•
v= (protocol version), vždy je nastaveno v=0,
o= (owner/creator and session identifier), označuje iniciátora relace a má následující syntaxi:
o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
s= (session name), název relace, pole je povinné a nesmí být prázdné, často se do něj
zadává mezera, pomlčka anebo tečka,
i=* (session information), textová informace o relaci,
u=* (URI of description), URI adresa odkazující na dodatečné informace k relaci,
e=* (email address) p=* (phone number), kontaktní e-mail a tel.č.,
c=* (connection information - not required if included in all media), udává informace o
připojovaném koncovém bodu relace ve formátu
c=<nettype> <addrtype> <connectionaddress>,
b=* (bandwidth information), informace o využívaném pásmu,
z=* (time zone adjustments), ošetřuje posuny času, dají se naplánovat opakované přechody
letního a zimního času.
k=* (encryption key), pokud je SDP transportován přes důvěryhodný transportní kanál, tak
může být pole k využito pro zprostředkování výměny klíčů ve formátu
k=<method>:<encryption key>,
a=* (zero or more session attribute lines), rozšiřující atributy ve formátu a=<attribute>:<value>,
např. a=recvonly.
Skupina Time description obsahuje položky t a r, kde :
•
•
t= (time the session is active), řádek specifikuje v relaci časové značky pro start a stop ve
formátu t=<start-time> <stop-time>, pokud jsou značky nastaveny 0 0, tak jde o permanentní
přehrávání relace,
r=* (zero or more repeat times), časy opakování relace ve tvaru r=<repeat interval> <active
duration> <offsets from start-time>,
Skupina Media description obsahuje položky m, c, b, k, a, kde:
•
•
m= (media name and transport address), SDP může obsahovat více m řádků, každý je
chápán jako nabídka jednoho toku, který se udává ve formátu m=<media> <port> <proto>
<fmt> , jako média se uvádí audio, video, text, application nebo message, port udává
transportní port a fmt je popis formátu médií,
c=* (connection information - optional if included at session-level),
55
•
•
•
2.6.1
b=* (bandwidth information) ,
k=* (encryption key) ,
a=* (zero or more media attribute lines).
Konstrukce položek SDP pro komunikaci SIP/SDP
Povinnými položkami hlavičky SDP jsou řádku v, o, s, t, m :
v=0
o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-addr.>
s= název relace
t= 0 0
m=m=<media> <port> <proto> <fmt>
Popis médií v m řádku se obvykle doplňuje nepovinnými atributy, tyto atributy jsou specifikovány v
dalších RFC a jde o tyto atributy:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
a=ptime:<packet time>, [RFC4566]
a=rtpmap:<payload type> <encoding name>/<clock rate> <encoding parameters>, [RFC4566]
a=orient:<orientation>, [RFC4566]
a=framerate:<frame rate>, [RFC4566]
a=quality:<quality>, [RFC4566]
a=fmtp:<format> <format specific parameters>, [RFC4566]
a=maxptime:<maximum packet time>, RFC3267, RFC4566
a=curr:<precondition-type> <status-type> <direction-tag>, [RFC3312]
a=des:<precondition-type> <strength-tag> <status-type> <direction-tag>,[RFC3312]
a=conf:<precondition-type> <status-type> <direction-tag>, [RFC3312]
a=mid:<identification-tags> , [RFC3388]
a=rtcp:<port> , [RFC3605]
a=crypto:<tag> <crypto-suite> <key-params> [<session-param>] , [RFC4568]
a=label:<pointer> , [RFC4574]
a=floorctrl:<role> ,[RFC4583]
a=confid:<conference-id> , [RFC4583]
a=floorid:<token> ,
[RFC4583]
a=content:<mediacnt-tag> , [RFC4796]
Uvedené atributy jsou použity výhradně pro média, dále existují atributy relace, které neuvádím,
neboť v SIP/SDP se s nimi nepotkáme, ale ještě máme atributy používané na obou úrovních, jak pro
popis médií, tak i relace, a ty si uvedeme:
a=recvonly , [RFC4566]
a=sendrecv , [RFC4566]
a=sendonly , [RFC4566]
a=inactive , RFC3108, RFC4566 (and used in RFC3264)
a=sdplang:<language tag> , [RFC4566]
a=lang:<language tag> , [RFC4566]
a=maxprate:<packet-rate> , [RFC3890]
a=setup:<role> , [RFC4145]
a=connection:<conn-value> , [RFC4145]
56
a=key-mgmt:<prtcl-id> <keymgmt-data> , [RFC4567]
a=source-filter:<filter-mode> <filter-spec> , [RFC4570]
a=fingerprint:<hash-func> <fingerprint> , [RFC4572]
Níže je uveden příklad obsahu SDP připojeného k SIP žádosti INVITE, ve kterém jsou nabídnuty
dva RTP toky. První je audio s preferencí kodeků PCM µ-law, A-law, GSM, iLBC a G.729, GSM,
očekávaný na portu 13226 a druhý tok je video H.263 na portu 15014, oba toky mají být zakončeny
na IP 158.196.196.146.12.
INVITE sip:[email protected] SIP/2.0 (SIP hlavička, volný řádek a SDP)
v=0
o=root 3177 3177 IN IP4 158.196.146.12
s=session
c=IN IP4 158.196.146.12
t=0 0
m=audio 13226 RTP/AVP 0 8 3 97 18
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:3 GSM/8000
a=rtpmap:97 iLBC/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=silenceSupp:off - - - m=video 15014 RTP/AVP 34
a=rtpmap:34 H263/90000
Odpověď přišla v SDP připojeného k odpovědi 200 OK na INVITEN. Druhá strana sděluje, že
naslouchá G.729 na portu 49154 a IP 158.196.192.32 a druhý m řádek s videem H.263 je vrácen s
portem 0, což znamená odmítnutí celého m řádku (toku), video tedy odesílatel SDP neumožňuje.
SIP/2.0 200 OK (SIP hlavička, volný řádek a SDP)
v=0
o=- 3428552716 3428552716 IN IP4 158.196.192.32
s=SJphone
c=IN IP4 158.196.192.32
t=0 0
m=audio 49154 RTP/AVP 18
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
m=video 0 RTP/AVP 0
2.6.2
Offer/Answer model
Vyjednávání probíhá v modelu označovaného jako Offer/Answer model specifikovaném v RFC
RFC 3264 z roku 2002. Doporučení zavádí následující pojmy:
•
•
•
•
Offerer, UA zasílající SDP jako požadavek na vytvoření či modifikaci relace,
Offer, nabídka, kterou zasílá offerer,
Answerer, UA přijímací SDP a zasílající na ní odpověď s popisem vlastních médií,
Answer, je SDP odpověď na nabídku,
57
•
Media Stream, je tok médií (např. video, audio, ...), každý media stream je popsán
konkrétním m řádkem a jeho přidruženými atributy.
U SDP řádek s= (subject) nesmí být volný. Jelikož v SIPu relaci vytváříme a ukončujeme pomocí
SIP signalizačních zpráv, tak nepoužíváme start a stop značky v SDP a relaci zde necháváme jako
permanentní pomocí řádku t = 0 0. Pokud odešleme nabídku s SDP, tak dokud není zaslána
odpověď, nesmí se odeslat další SDP nabídka, tzn. probíhá vždy pouze jedno vyjednávání. Jelikož
offer/answer model je řízen protokolem vyšší vrstvy (SIP), tak musí být následující situace ošetřena
na úrovni signalizace SIP:
•
•
UA nesmí generovat novou SDP nabídku, jestliže přijal nabídku, kterou dosud nezodpověděl
nebo neodmítnul;
UA nesmí generovat novou nabídku, jestliže předtím odeslal nabídku a dosud neobdržel
odpověď nebo odmítnutí.
Přesto může dojít výjimečně k situaci, kdy jsou zaslány dvě nabídky (např. INVITE a re-INVITE v
rámci offer/answer), tato situace se označuje jako SIP glare. Jestliže UAS obdržel druhý INVITE,
když předtím odeslal v témže dialogu odpověď na první INVITE s nižším Cseq, tak musí vrátit
odpověď 500 Server Internal Error na přijatý druhý INVITE a do hlavičky odpovědi přidat pole RetryAfter s náhodně zvolenou hodnotou v rozsahu 0 až 10. Jestliže UAS dostane INVITE v dialogu, v
rámci kterého má nevyřízený INVITE (před chvíli sám INVITE odeslal a dosud nedostal odpověď),
tak musí na přijatý INVITE vrátit odpověď 491 Request Pending.
Nabídka buď neobsahuje žádný nebo obsahuje jeden anebo více média toků a každý je popsán
v jednotlivém m řádku s přiřazenými atributy. Pokud neobsahuje žádný, tak si strana nabízející SDP
přeje komunikovat později a až získá odpověď na nabídku, tak bude svou nabídku modifikovat (zašle
novou). Pokud obsahuje více m řádků, tak každý musí popisovat jiný typ toku, neboť nelze žádat o
vícenásobný tok stejného typu (paralell stream), typ toku je určen portem, profilem a kodeky, takže
např. můžu si nechat poslat jeden šifrovaný tok a druhý nešifrovaný RTP či poslat jeden tok audio a
druhý video.
Na nabídku jednotlivých toků druhá strana odpovídá tak, že v odpovědi uvede na základě
nabídky své typy toků (port, kodeky), v odpovědi je uveden stejný počet m řádků obsažených v
nabídce a to i ve stejném pořadí. Nabídka toku může být odmítnuta z jakéhokoliv důvodu
(nepodporovaný tok – např. video), odmítá se konkrétní m řádek a to tak, že v odpovědi se v m
řádku nastaví port na hodnotu 0.
58
3
Asterisk
Asterisk je fenomén posledních let, to co představuje Apache v oblasti webových serverů, tak
obdobné postavení má Asterisk v IP telefonii. Trend nasazování IP telefonie je dlouhodobý a
telefonie se ocitá v roli aplikace na IP sítích. Alfou a omegou IP telefonie ve firemním prostředí je
pobočková ústředna (PBX), v operátorském je to softswitch. V případě pobočkové ústředny se častěji
mluví o komunikačním serveru, protože většina nasazovaných řešení PBX může sloužit jako
aplikační server, překladová média brána či poskytovat podporu dalších služeb. V současné době
nejrozšířenější volně dostupnou softwarovou realizací takové ústředny představuje produkt Asterisk
od firmy Digium ™. V následujících kapitolách provedeme čtenáře jednotlivými konfiguracemi služeb,
tak aby byl po přečtení textu schopen vytvořit fungující systém a infrastrukturu umožňující efektivní
používání VoIP telefonie v praxi. Nejdříve ovšem pár vět k původu Asterisku. Při vzniku Asterisku byl
Mark Spencer, čerstvý absolvent Auburn University v Alabamě, který se v roce 1999 rozhodl napsat
pro linux svůj vlastní softvér realizující pobočkovou ústřednu s hlasovou poštou (voice-mail) namísto
zakoupení komerčního produktu, údajně nebylo na PBX dost prostředků. Výstup své práce zveřejnil
jako open-source a nabídl tím široké komunitě uživatelů, testerů i vývojářů.
“I was so excited the first time I got a phone call delivered through my PC using my
own software.”
Mark Spencer
Nevíme, nakolik je historka pravdivá, ale každopádně v roce 1999 vznikl jeden
z nejvýznamnějších open-source projektů. Mark Spencer založil o tři roky později firmu Digium, která
dlouhodobě stojí za vývojem Asterisku a protože SW Asterisk se prodávat nedá, tak její profit je z
především z technické podpory a z prodeje HW, který je plně kompatibilní s Asteriskem, jedná se o
Digium Cards jako je T1/E1/FXO/FXS. Dnes je vývoj Asterisku z větší části záležitostí open-source
komunity a díky tomu má aktuální vývoj asi 400 přispěvovatelů, což je velká síla, do poslední verze
přispěli více než dvěmi třetinami. Pro ilustraci vývoje uvádíme, že verze Asterisku 1.4 byla uvolněna
v prosinci roku 2006, verze Asterisku 1.6 v roce 2008 a verze 1.8 v roce 2010.
3.1
Popis Asterisku
Asterisk je open-source softwarová PBX určená pro instalaci na standardních PC a spolu se
správným rozhraním může být použita jako PBX pro domácí uživatele, podniky, poskytovatele VoIP
59
služeb a telefonní společnosti. Asterisk je rovněž open-source komunita a komerční produkt od firmy
Digium ™. Systém je navržen tak, aby vytvořil rozhraní mezi telefonním hardwarem či softwarem a
libovolnou telefonní aplikací. S jednotlivými protokoly SIP, IAX, H.323 pracuje Asterisk jako s kanály
navázanými na jádro, DAHDI (Digium Hardware Device Interface) představuje rozhraní směrem k
PSTN, může se jednat o ISDN BRI či PRI karty, FXS, FXO, apod. Příkazový řádek CLI je silným
nástrojem Asterisku, stejně jako Manager Interface. Srdcem Asterisku je Dialplan, kde je definováno
chování v případě obsluhy požadavku, ať už odchozího či příchozího volání anebo požadavku na
vyvolání služby, viz. obr. architektury Asterisku.
Obr. 29. Architektura Asterisku
3.1.1
Režimy Asterisku
Jak již bylo naznačeno v úvodu, Asterisk může mimo jiné sloužit jako:
•
•
•
•
•
•
•
•
•
•
•
Různorodá VoIP gateway mezi protokoly (MGCP, SIP, IAX, H.323).
Pobočková ústředna (PBX).
Voicemail služba s adresářem.
Interaktivní hlasový průvodce (IVR server).
Softwarová ústředna (Softswitch).
Konferenční server.
Packet voice server.
Šifrovací médium telefonních nebo faxových volání.
Překladač čísel.
Aplikace Calling card,
Prediktivní volič,
60
•
•
Vzdálená „kancelář“ pro existující PBX.
A další...
Asterisk také podporuje služby, které byly dříve součástí pouze pokročilých firemních řešení:
•
•
•
•
•
3.1.2
Hudba pro zákazníky v pořadí čekající ve frontě na hovor, podpora streamování médií a
MP3 souborů.
Fronty volajících, kdy tým agentů může odpovědět na volání a může sledovat fronty
(vhodné pro Call Centra).
Integrace Text-to-speech modulů a rozpoznávání hlasu.
Podrobné záznamy o hovorech jsou převáděny do textových souborů a SQL databází.
Propojení s PSTN sítí skrze digitální a analogové linky.
Kodeky a protokoly Asterisku
Obvykle je snaha, aby bylo možné v dané datové sítí realizovat co nejvíce hlasových spojení.
Kodeky poskytují nové možnosti pro digitální přenos hlasu, včetně komprese, která je jednou z
nejdůležitějších vlastností, mezi další vlastnosti patří detekce hlasové aktivity, vyrovnání paketové
ztráty, a generování výplňového šumu. V Asterisku jsou podporovány následující kodeky s uvedenou
šířkou pásma. Ty mohou být samozřejmě transparentně překládány z jednoho na druhý.
•
•
•
•
•
•
•
•
•
•
G.711 ulaw (USA) - (64 Kbps).
G.711 alaw (Europe) - (64 Kbps).
G.722 (širokopásmový kodek) – (64 Kbps).
G.723.1 – pouze pass-through režim
G.726 - (16/24/32/40kbps)
G.729 – nutná licence (8Kbps)
GSM - (12-13 Kbps)
iLBC - (15 Kbps)
LPC10 - (2.5 Kbps)
Speex - (2.15-44.2 Kbps)
Odesílání dat z jednoho telefonu do druhého by mělo být snadné za předpokladu, že si data
samy najdou cestu skrze síť. V praxi je nutné pro toto směrování využívat signalizační protokoly,
dominantním a nejpoužívanějším signalizačním protokolem je SIP. Přesto existuje stále spousta
systémů, které pro signalizaci ve VoIP síti využívají starších protokolů jako jsou např. H.323. Jiný
protokol IAX je zase nativním protokolem Asterisku a výborně prochází NATem. Seznam
podporovaných signalizačních protokolů v Asterisku je uveden níže:
•
•
•
•
•
•
SIP
H323
IAX2
MGCP
SCCP (Cisco Skinny)
Nortel unistim
61
3.1.3
Verze Asterisku
První oficiální funkční
ní verze Asterisku pod ozna
označením
ením 1.0 vyšla 23. zář
září 2004. O rok později,
konkrétně 15. Listopadu 2005 byla p
představena verze 1.2 , která přinášela
inášela oproti verzi 1.0 více než
3000 vylepšení a oprav. Mezi ty největší
nejv
patřily: vylepšení funkcí
nkcí hlasové schránky (voicemail),
přidání
idání DUNDi (Distributed Universal Number Discover) protokol, jednodušší konfigurace Asterisku,
větší
tší podpora pro SIP protokol, využití hudby pro čekání
ekání na hovor, podpora ISDN PRI a mnoho
dalších. Jak už se u firmy Digium
gium stalo zvykem, další verze přišla
p
opětt po roce a to 26. prosince 2006.
Jednalo se o verzi 1.4 a tato se stala nejvíce rozšířenou
rozší enou a používanou i dlouho poté, co byla 2. října
2008 představena
edstavena verze 1.6. Verze 1.6 má již nativn
nativně plně implementovanou podp
podporu pro šifrování
SIPu, podporuje signalizaci SS7 a obsahuje spoustu dalších nových vylepšení. Momentálně
Momentáln je
dostupná verze 1.8, která byla uvolněna
uvoln
na podzim 2010, je označována
čována jako LTS (Long Term
Supported), přibyla v ní především
ředevším SRTP a kalendá
kalendářů.
Obr.30. Loga jednotlivých distribucí
Veškeré výše uvedené verze představují
představují tzv. „klasický“ Asterisk, který se instaluje v podobě
softvérového programu na linuxové distribuce a veškerá jeho nastavení či konfigurace se provádí
přes příkazovou řádku operačního
čního
ního systému tzv. shell, neboli interpret p
př
příkazů. Existují však i
distribuce Asterisku určeny
eny pro za
začínající
ínající uživatele, které jsou instalovány z ISO souboru a
představují celý operační
ní systém založen na Linuxové distribuci a obsahující Asterisk, všechny
vše
potřebné balíčky k jeho provozu a hlavně
hlavn webový server a grafické webové rozhraní (založené na
FreePBX), pomocí něhož
hož se ústředna
ústř
konfiguruje. Těchto distribucí je několik,
ěkolik, společnost
spole
Digium
podporuje vývoj AsteriskNOW v současnosti
souč
dostupné ve verzi 1.7. Verze 1.7 obsahuje Asterisk 1.6
tzn. služby podporované v této verzi jsou dostupné i v AsteriskNOW. Další z grafických distribucí je
například
íklad Trixbox. Jedná se opět
opě o kompletní operační
ní systém velice podobný AsteriskNOW,
používá však vlastní webové rozhraní.
ozhraní. Momentálně
Momentáln je dostupný ve verzi 2.8 a používá taktéž
Asterisk ve verzi 1.6.
Tento text se primárně
ě zaměř
ěřuje
uje na popis konfigurace „klasického“ Asterisku pomocí p
příkazové
řádky a konfiguračních souborů,
ů, jelikož grafické nástavby nakonec využívají právě
p
tento klasický
Asterisk a pouze automatizují proces konfigurace. Pokud tedy budeme znát problematiku
konfigurace „klasického“ Asterisku, budeme znát i způsob
zp sob konfigurace pomocí grafických distribucí.
3.2
Instalace Asterisku
Následující kapitola popisuje instalaci „klasického“ Asterisku ve verzi 1.6 přímo
př
pomocí balíčku
pro jednotlivé linux distribuce a také pomocí kompilace.
62
3.2.1
Instalace pomocí balíčku s příponou .deb
Tato instalace je určena pro Linuxové distribuce, které využívají balíčkovací systém deb. Jedná
se například o distribuce Debian či Ubuntu a jeho deriváty. Ke správě systému využívají nástroj apt
nebo aptitude. Níže popsaná instalace je vyzkoušena na distribucích Debian Squeeze a Ubuntu
10.04(10.10). Pozn.: Starší verze distribucí nemusí mít aktualizované repozitáře a mohou obsahovat
starší verzi Asterisku, například 1.4). Instalace je velice jednoduchá. Do příkazového řádku pod
uživatelem root napište:
apt-get install asterisk
Potvrďte instalaci stiskem klávesy Y a do formuláře vyplňte mezinárodní telefonní předvolbu
české republiky 420 . Po instalaci je jíž ústředna plně funkční a připravena k použití. Zda je Asterisk
funkční můžete otestovat příkazem:
asterisk -vvvgci
Obr.31. Vyplnění mezinárodní předvolby
3.2.2
Instalace pomocí balíčku s příponou .rpm
Tato instalace je určena pro Linuxové distribuce, které využívají balíčkovací systém rpm. Jedná
se například o distribuce Fedora, RedHat,CentOS či Gentoo. K správě systému využívají nástroj yum.
Níže popsaná instalace je vyzkoušena na distribucích CentOS 5 a RedHat Enteprise Linux 5. Před
samotnou instalací je nutno aktualizovat repozitáře systému o nové zdroje. Pomocí textového editoru
dle Vašeho výběru vytvořte nový soubor:
centos-asterisk.repo
v adresáři:
/etc/yum.repos.d
a do vytvořeného souboru vložte následující text:
[asterisk-tested]
name=CentOS-$releasever - Asterisk - Tested
63
baseurl=http://packages.asterisk.org/centos/$releasever/tested/$basearch/
enabled=0
gpgcheck=0
#gpgkey=http://packages.asterisk.org/RPM-GPG-KEY-Digium
[asterisk-current]
name=CentOS-$releasever - Asterisk - Current
baseurl=http://packages.asterisk.org/centos/$releasever/current/$basearch/
enabled=1
gpgcheck=0
#gpgkey=http://packages.asterisk.org/RPM-GPG-KEY-Digium
Uložte soubor a vytvořte další nový s názvem:
centos-digium.repo
a vložte do něj následující text:
[digium-tested]
name=CentOS-$releasever - Digium - Tested
baseurl=http://packages.digium.com/centos/$releasever/tested/$basearch/
enabled=0
gpgcheck=0
#gpgkey=http://packages.digium.com/RPM-GPG-KEY-Digium
[digium-current]
name=CentOS-$releasever - Digium - Current
baseurl=http://packages.digium.com/centos/$releasever/current/$basearch/
enabled=1
gpgcheck=0
#gpgkey=http://packages.digium.com/RPM-GPG-KEY-Digium
Nyní je systém aktualizovaný pro instalaci Asterisku z nových repozitářů. Pro samotnou instalaci
potřebných balíčků i samotné Asterisku zadejte do příkazové řádky:
yum install asterisk16
dahdi-tools libpri
asterisk16-configs
asterisk16-voicemail
dahdi-linux
V průběhu instalace bude potřeba dvakrát potvrdit pokračování klávesou Y. Po instalaci je jíž
ústředna plně funkční a připravena k použití. Zda je Asterisk funkční můžete otestovat příkazem:
asterisk –vvvgci
3.2.3
Instalace pomocí kompilace zdrojových kódů
Instalace pomocí kompilace zdrojových kódů je určena převážně pro zkušenější uživatele,
umožňuje však nainstalovat Asterisk na různé distribuce operačních systémů, bez potřeby určitých
správců systémů typu apt či yum. Níže popsaná instalace je vyzkoušena na distribucích Debian.
Samotná kompilace vyžaduje přítomnost některých balíčků v systému. Ty je nutné nejprve
doinstalovat. Nejdříve se provede instalace kernel hlaviček:
64
apt-get install linux-headers-`uname –r`
ln -s /usr/src/kernel-headers-`uname -r` /usr/src/linux
Poté instalace samotných balíčků potřebných pro kompilaci:
apt-get install bison openssl libssl-dev libusb-dev fxload libasound2-dev libc6-dev libnewt-dev
libncurses5-dev zlib1g-dev gcc g++ make doxygen libxml2-dev
Nyní stáhneme zdrojové kódy z repozitářů Asterisku do adresáře /usr/src. Zkontrolujte prosím
aktuálnost verzí:
cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.6.2.5.tar.gz
wget http://downloads.asterisk.org/pub/telephony/libpri/releases/libpri-1.4.10.2.tar.gz
wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-addons-1.6.2.0.tar.gz
Dále je nutné stáhnout zdrojové kódy DAHDI. Projekt DAHDI vznikl jako následník projektu
Zapata. Projekt Zapata založil Jim Dixon, který byl také zodpovědný za vývoj tohoto revolučního
hardwaru pro použití s Asteriskem. Cílem produktu Zapata byla architektura nazývána Zaptel
(nedávno přejmenována na Digium Asterisk Hardware Driver Interface - DAHDI).
Jednou z hlavních výhod této architektury je schopnost používat procesor počítače pro
zpracování streamovaných médií, eliminaci ozvěny a kódování. Do té doby všechny karty používaly k
plnění těchto úkolů digitální signálové procesory (DSP). Používání CPU místo DSP rapidně snížilo
cenu hardwaru a spousta výrobců začala karty s DAHDI architekturou vyrábět. Na druhou stranu tyto
karty vyžadují velké výpočetní prostředky na CPU a to může při větším zatížení negativně ovlivnit
kvalitu hlasu.
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux/releases/dahdi-linux-2.2.1.tar.gz
wget http://downloads.asterisk.org/pub/telephony/dahdi-tools/releases/dahdi-tools-2.2.1.tar.gz
Všechny stažené soubory dekomprimujeme příkazem:
tar xzvf název_souboru.tar.gz
Po dekomprimaci zkompilujeme DAHDI moduly:
cd /usr/src/dahdi-linux-2.2.1
make
make install
cd /usr/src/dahdi-tools-2.2.1
./configure
make menusect (volitelné, můžete zvolit několik možností)
make
make install
make config (volitelné, nainstaluje inicializační skripty)
Pokud je zadáno make menuselect je možno vybrat pouze nutné moduly pro instalaci.
65
Obr. 32. Volba modulů pomocí DAHDI menuselect
Po zadání make config jsou nainstalovány inicializační skripty a spustí se detekce hardwarové
karty a jejího ovladače. Výpis, který se zobrazí obsahuje informaci o detekovaném hardware a
informaci o změně konfiguračního souboru. V našem případě jsme použili kartu Digium TE121: PCIExpress single-port T1/E1/J1 a závěr výpisu vypadá následovně:
the DAHDI hardware you have on your system is:
pcie:004/002 wcte12xp e2e1:1150 Digium-single no-firmware
Systém kartu detekoval správně a nyní je nutné povolit ovladač wcte12xp v souboru
/etc/dahdi/modules.Ten si otevřeme pro editaci a okomentujeme příslušný řádek s označením
ovladače:
# Contains the list of modules to be loaded / unloaded by #/etc/init.d/dahdi.
#
# NOTE: Please add/edit /etc/modprobe.d/dahdi or /etc/modprobe.conf if you
# would like to add any module parameters.
#
# Format of this file: list of modules, each in its own line.
# Anything after a '#' is ignore, likewise trailing and leading
# whitespaces and empty lines.
# Digium TE205P/TE207P/TE210P/TE212P: PCI dual-port T1/E1/J1
# Digium TE405P/TE407P/TE410P/TE412P: PCI quad-port T1/E1/J1
# Digium TE220: PCI-Express dual-port T1/E1/J1
# Digium TE420: PCI-Express quad-port T1/E1/J1
#wct4xxp
# Digium TE120P: PCI single-port T1/E1/J1
# Digium TE121: PCI-Express single-port T1/E1/J1
# Digium TE122: PCI single-port T1/E1/J1
wcte12xp
# Digium T100P: PCI single-port T1
# Digium E100P: PCI single-port E1
#wct1xxp
66
Restartujte počítač a zkontrolujte, zda se ovladač nainstaloval správně. Nyní již můžeme
zkompilovat samotný Asterisk:
cd /usr/src/libpri-1.4.10.2
make
make install
cd /usr/src/asterisk-1.6.2.5
./configure
make menuselect (volitelné, můžete zvolit několik možností)
make
make install
make samples (volitelné, při zadání vytvoří ukázkové soubory Asterisku)
make config (volitelné, při zadání nastaví startování Asterisku při bootování počítače)
Obr.33. Volba modulů pomocí Asterisk menuselect
Pokud se při kompilaci nevyskytly žádné chyby je jíž ústředna plně funkční a připravena k použití.
Zda je Asterisk funkční můžete otestovat příkazem:
asterisk –vvvgci
3.3
Úvod do konfigurace SIPu a plánu volby
Po úspěšné instalaci by měl adresář /etc/asterisk/ obsahovat potřebné soubory ke konfiguraci a
provozu Asterisku. Pro jednoduchou ukázku konfigurace si vybere jeden: extension.conf. Pokud jsme
prováděli instalaci přes kompilaci, je nutné při kompilaci zadat make samples,aby se daný ukázkový
soubor vytvořil. Veškeré zde uváděné konfigurace jsou prováděny na operačním systému Linux
Debian.
67
3.3.1
Konfigurace Asterisku
Než provedeme základní ukázku konfigurace, je dobré si soubor extensions.conf zálohovat do
vytvořeného adresáře /var/tmp/asterisk-etc-backup:
debian:/usr/src# cd /etc/asterisk
debian:/etc/asterisk# mkdir -p /var/tmp/asterisk-etc-backup
debian:/etc/asterisk# mv extensions.* /var/tmp/asterisk-etc-backup/
debian:/etc/asterisk#
Pomocí oblíbeného textového editoru vytvoříme nový soubor /etc/asterisk/extension.conf a
vložíme do něj následující text:
[default]
exten => 1001,1,Answer()
exten => 1001,2,Playback(hello-world)
exten => 1001,3,Hangup()
3.3.2
Spuštění, zavolání „Hello—World“ a zastavení Asterisku
Nyní spustíme Asterisk příkazem:
asterisk –cvvvvv
Asterisk se spustí a my můžeme zadávat příkazy do jeho příkazové konzole – CLI. Parametr –c
definuje otevření konzole, parametr –v definuje úroveň podrobnosti výpisu. Například pomocí příkazu
console dial 1001 zavoláme na číslo 1001, které jsme si vytvořili v souboru extensions.conf.
Přehraje se nám zvukový soubor hello-world.gsm z adresáře /var/lib/asterisk/sounds.
*CLI> console dial 1001
== Console is full duplex
*CLI> -- Executing [1001@default:1] Answer("Console/dsp", "") in new
stack
<< Console call has been answered >>
-- Executing [1001@default:2] Playback("Console/dsp", "hello-world") in
new stack
-- <Console/dsp> Playing ’hello-world’ (language ’en’)
*CLI> -- Executing [1001@default:3] Hangup("Console/dsp", "") in new
stack
== Spawn extension (default, 1001, 3) exited non-zero on ’Console/dsp’
<< Hangup on console >>
*CLI>
Pravidla pro jednotlivé účty se nazývají extensions. Jedná se o programovou jednotku
v číslovacím plánu. Každá programová jednotka se skládá minimálně z jednoho řádku zapsaného
v následujícím formátu:
exten => název_extension,priorita,aplikace
V našem příkladě má tedy extension název 1001, má tři priority (1,2,3) a používá tři aplikace:
68
•
•
•
Answer() – otevírá nový kanál na Asterisku,
Playback() – přehraje daný zvukový soubor,
Hangup() – zavěsí hovor a uzavře kanál.
Pro zastavení Asterisku zadáme do konzole příkaz:
*CLI> core stop now
debian:/etc/asterisk#
3.3.3
Volání „Hello-World“ pomocí SIP telefonu
Jakmile jsme otestovali extension 1001 pomocí Asterisk konzole, je dalším logickým krokem
otestovat volání pomocí SIP telefonu. Pokud nemáte k dispozici hardwarový SIP telefon, můžete
využít softwarové řešení, například SIP klient X-lite. Pokud chcete předejít možným problémům, tak
instalujte SIP softwarový telefon na jiný počítač,než je nainstalována samotná ústředna Asterisk.
Než však použijeme SIP telefon s Asteriskem, musíme pro něj vytvořit na Asterisku účet. K tomu
použijeme konfigurační soubor /etc/asterisk/sip.conf , který si opět před použitím zálohujeme do
adresáře /var/tmp/asterisk-etc-backup podobně jako extensions.conf.
Pomocí oblíbeného textového editoru opět vytvoříme nový soubor /etc/asterisk/sip.conf a
vložíme do něj následující text:
[general]
port=5060
bindaddr=0.0.0.0
[2000]
type=friend
secret=1234
host=dynamic
Na SIP telefonu poté nastavíme tyto hodnoty:
• Uživatel: 2000
• Heslo: 1234
• SIP registrar: IP adresa počítače, kde je nainstalován Asterisk
• SIP proxy: IP adresa počítače, kde je nainstalován Asterisk
Opět spustíme Asterisk již známým příkazem:
asterisk –cvvvvv
Poté spustíme SIP telefon a zadáme do něj příslušné údaje uvedené výše. Měli bychom vidět,
jak se SIP telefon zaregistruje na Asterisk:
*CLI> -- Registered SIP ‘2000’ at 47.6.3.4 port 5060
expires 120 -– Unregistered SIP ‘2000’
Nyní zavoláme ze SIP telefonu na číslo 1001, přehraje se nám zpráva hello-world.gsm . Pokud
bychom chtěli z Asterisk konzole zavolat na SIP telefon, je nutné přidat do
/etc/asterisk/extensions.conf řádek:
69
exten => 2000,1,Dial(SIP/2000)
Aby se námi provedené změny v číslovacím plánu projevili, musíme restartovat Asterisk, nebo
znovu načíst číslovací plán. Restartování asterisku se provede v CLI Asterisku příkazem:
*CLI> core restart now
Restartování číslovacího plánu se provede:
*CLI> dialplan reload
Nyní můžeme zavolat SIP telefon pomocí:
*CLI> console dial 2000
Aplikace Dial() v číslovacím plánu sestavuje spojení na telefon. Používá parametr složený se
dvou částí: první SIP určuje technologii, která bude využita pro sestavení spojení, v našem případě
tedy SIP VoIP protokol. Druhý parametr definuje cílové zařízení, čili 2000. Pokud je použita aplikace
Dial, aplikace Answer či Hangup se už nepoužívají, jelikož nevíme, zda je cílový účastník dostupný.
V našem případě koresponduje extension 2000 s cílovým zařízením 2000. Můžeme však do
číslovacího plánu zapsat například:
exten => 55,1,Dial(SIP/2000)
Potom bychom SIP telefon volali příkazem:
*CLI> console dial 55
3.3.4
Minimální konfigurace Asterisku se dvěma SIP účty
Nejjednodušší možná konfigurace Asterisku obsahuje dva SIP telefony a jeden Asterisk server.
Nejprve si vytvoříme druhý účet s číslem
2001 pro druhý SIP telefon. Opět editujeme
/etc/asterisk/sip.conf:
[general]
port=5060
bindaddr=0.0.0.0
[2000]
type=friend
secret=1234
host=dynamic
[2001]
type=friend
secret=1234
host=dynamic
Poté je ještě nutné editovat /etc/asterisk/extensions.conf a vytvořit nový řádek pro účet 2001:
70
exten => 2001,1,Dial(SIP/2001)
exten => 2000,1,Dial(SIP/2000)
Zadáme do druhého SIP telefonu příslušné údaje, restartujeme Asterisk a vyzkoušíme volání
z jednoho SIP telefonu na druhý.
3.3.5
Nastavení práv na základě kontextů
Každá pobočková ústředna musí mít možnost nastavovat jednotlivým pobočkám oprávnění, kam se
mohou dovolat. V Asterisku se tyto pravidla definují pomocí kontextů – contexts. Každý kontext
reprezentuje kategorii, která definuje pravidla co může být voláno. K přístupu k pravidlům musí být
telefon součástí kategorie – musí mít přiřazený odpovídající kontext. Pokud nemá účet definován
kontext je automaticky zařazen do kategorie [default]. Pokud mu chceme context definovat v
/etc/asterisk/sip.conf u příslušného účtu zadáváme:
context = Název kontextu
Uveďme příklad. Firma ESF Co. Má SIP telefony 10,11,12 a 20. Telefony 10-12 jsou
standardními telefony firmy s kontextem [esf], telefon 20 je volně dostupný telefon na recepci
s kontextem [navstevnik]. V /etc/asterisk/sip.conf bude zápis vypadat následovně:
[general]
port=5060
bindaddr=0.0.0.0
context=esf ; <-- kontext
[10]
type=friend
secret=1234
host=dynamic
[11]
type=friend
secret=1234
host=dynamic
[12]
type=friend
secret=1234
host=dynamic
[20]
type=friend
secret=1234
host=dynamic
context=visitor ; <-- kontext
Poté v /etc/asterisk/extensions.conf definujeme pravidla pro jednotlivé kontexty:
[default]
exten => 1001,1,Answer()
exten => 1001,2,Playback(hello-world)
71
exten => 1001,3,Hangup()
[esf]
exten => 10,1,Dial(SIP/10)
exten => 11,1,Dial(SIP/11)
exten => 12,1,Dial(SIP/12)
[navstevnik]
exten => 1001,1,Answer()
exten => 1001,2,Playback(hello-world)
exten => 1001,3,Hangup()
3.4
Dialplan
Číslovací plán (dále jen Dialplán) je srdcem Asterisku, a všechno zde začíná.V Asterisku 1.6, tvoří
dialplan dva důležité soubory. První z nich je extensions.conf, který používá originální doporučený
model od firmy Digium. Druhým je extensions.ael, který používá novější jazyk tzv. Asterisk
Extensions Language - AEL, o kterém pojednává samostatná kapitola. V této kapitole probereme
tradiční model priorit, jelikož jak ve verzi 1.4, tek i ve verzi 1.6 je extensions.ael při startu Asterisku
převeden na tradiční formát priorit a přidán do extensions.conf .
3.4.1
Kontexty - Contexts
Již jsme se zmínili o kontextech, pomocí kterých můžeme definovat práva pro jednotlivé telefony na
daném Asterisk serveru. Pokud je danému zařízení přidělen kontext, Asterisk hledá v dialplánu, zda
existují pro tento kontext pravidla – extensions. Pokud máme například v /etc/asterisk/sip.conf
následující zápis:
[2000]
type=friend
context=test
secret=1234
host=dynamic
tak telefon s číslem 2000 bude vždy iniciovat hovory v kontextu test. Pokud bude například chtít
vytočit nějaké číslo, Asterisk projde kontext test v dialplánu /etc/asterisk/extensions.conf a bude
hledat pravidlo pro dané číslo. Pokud pravidlo nenajde nic se nestane. Kontexty jsou ohraničeny
závorkami, pod kterými následují pravidla.
3.4.2
Pravidla - Extensions
Již bylo řečeno, že jednotlivé položky v souboru extensions.conf se nazývají extensions – pravidla.
Jednotlivé extensions jsou prováděny pokaždé, když je vytvořeno volání pro tuto extension, ale
soubor extensions.conf je Asteriskem načítán pouze jednou při startu. Proto je nutné po každé
72
změně dialplánu, restartovat Asterisk,nebo dialplán. Bylo také uvedeno, že každá extension se
skládá z názvu extension, priority a aplikace.
Základní aplikace :
•
•
•
•
•
•
•
3.4.3
Answer ( ) – tato aplikace je popsána svým názvem. Pouze vyzvedává hovory. Otevírá kanál
pro hovor.
Hangup ( ) – jedná se o protiklad k Answer. Aktivní spojení je zrušeno a kanál je uzavřen.
Playback (zvukový soubor) – tato aplikace přehrává definovaný zvukový soubor. Nepřidává
se žádná přípona souboru, jelikož adresář může obsahovat soubor ve více formátech.
Asterisk vybere ten nejvhodnější.
Wait (number) – definuje pauzu v sekundach.
NoOp (řetězec) – tato aplikace nedělá nic. Doslova znamená No Operation. Používá se pro
testování, či při hledání chyb v dialplánech. Namísto řetězce se vyplňuje text,který se
zobrazuje v CLI, ale pouze tehdy,pokud je verbosity úroveň nastavena na 3 a více.
VoiceMail (mailováschránka,u) – volající zanechá hlasovou zprávu pro nastavenou
schránku. Více v kapitole 1.8.
VoiceMailMain () – vstupní aplikace do hlasové schránky. Maijitel schránky využivá tuto
aplikaci pro přístup ke svým hlasovým zprávám.
Priority - Priorities
Klasická extension je tvořena několika řádky. Každý řádek má nastavenou prioritu a Asterisk
podle této priority vykonává jednotlivé extensions. Uveďme příklad. Následující extensions se
provedou pokud uživatel s kontextem test zavolá na číslo 8888. Asterisk vyzvedne hovor, přehraje
zvukový soubor hello-world a hovor ukončí:
[test]
exten => 8888,1, Answer()
exten => 8888,2, Playback(hello-world)
exten => 8888,3, Hangup()
Pokud bychom měli extensions na několik řádků, můžeme využít vlastnosti,které Asterisk nabízí
a to automatické číslování priorit. Namísto čísla priority zadáme písmeno – n. Asterisk bude
postupovat po jednotlivých řádcích extensions a vždy přidá k n+1. V našem případě by to vypadalo
následovně:
[test]
exten => 8888,1, Answer()
exten => 8888,n, Playback(hello-world)
exten => 8888,n, Hangup()
Písmeno n můžeme dosadit v libovolném řádku:
[test]
exten => 8888,1, Answer()
exten => 8888,2, Playback(hello-world)
exten => 8888,n, Hangup()
73
3.4.4
Vzory – Pattern Matching
V extensions.conf nám vzory pomáhají definovat kombinace několika čísel do jednoho zápisu.
Pokud bychom pracovali se stávajícími znalostmi řešili bychom následující problém následovně.
Pokud někdo zavolá na číslo 100-109 přehraje se mu zpráva hello-world:
[general]
[test]
exten => 100,1,Answer()
exten => 100,2,Playback(hello-world)
exten => 100,3,Hangup()
exten => 101,1,Answer()
exten => 101,2,Playback(hello-world)
exten => 101,3,Hangup()
exten => 102,1,Answer()
exten => 102,2,Playback(hello-world)
exten => 102,3,Hangup()
A tak bychom pokračovali dále až po 109. Pokud použijeme vzor, bude zápis vypadat přehledněji
a lépe:
[general]
[test]
exten => _10X,1,Answer()
exten => _10X,2,Playback(hello-world)
exten => _10X,3,Hangup()
Extension _10X definuje rozsah čísel od 100 do 109.
Základní vzory :
Diaplánové vzory vždy začínají podtržítkem.
•
[abc] – znaky a,b,c. Na příklad mohou být nahrazeny čísly 1,2,3. Ve výsledku 31,32,33:
exten => _3[123],1,NoOp(Test)
•
[a-b] – jakékoliv znak mezi a-b. Na příklad mohou být nahrazeny čísly 1-5. Ve výsledku 3135. Může být také ve tvaru [25-8] pro 32,35-38:
exten => _3[1-5],1,NoOp(Test)
•
[X] – jakákoliv číslice od 0-9. Například pro jakékoliv číslo od 300 do 399:
exten => _3XX,1,NoOp(Test)
•
[Z] – jakákoliv číslice od 1-9. Například pro jakékoliv číslo od 31 do 39:
exten => _3Z,1,NoOp(Test)
•
[N] – jakákoliv číslice od 2-9. Například pro jakékoliv číslo od 32 do 39:
exten => _3N,1,NoOp(Test)
74
•
* – stisk tlačítka s hvězdičkou:
exten => _*7,1,NoOp(Test)
•
# – stisk tlačítka s křížkem:
exten => _#7,1,NoOp(Test)
•
. – jakékoliv číslo či číslice. Na příklad pro všechna čísla, která začínají 420:
exten => _420.,1,NoOp(Test)
Nepoužívejte vzor _. ! Pokud tento vzor použijete extension vloží speciální pravidlo i,t a h , které
by mohlo vyvolat neočekávané chování. Pro označení celého rozsahu používejte raději _X. Nebo _X.
3.4.5
Vložené kontexty – Include Statements
Vložené kontexty (dále jen includes) jsou velice silným nástrojem pro zjednodušení a organizaci
velkých dialplánů. Vložrním příkazu include , můžeme vkládat kontexty do stávajících kontextů.
Uveďme příklad:
include => název vloženého kontextu
A v dialplánu:
[general]
[prodej]
include => interni
include => externi
[interni]
exten => 2000,1,Dial(SIP/2000)
[externi]
exten => 17005551212,1,Dial(SIP/5551212)
Máme kontext prodej a v něm vložené další kontexty interni a externi.
3.4.6
Časové Vložené kontexty
Pomocí časových vložených kontextů (Time-Conditional Included Statements) můžeme definovat
například dobu, po kterou bude číslo dostupné, a kdy bude například volající odkázán do hlasové
schránky. Příkaz má nasledující syntaxi:
include => kontext|<čas>|<den>|<den v měsíci>|<měsíc>
Názvy dnů a měsíců reprezentují vždy třípismenné zkratky anglických názvů a čas je zadáván ve
24 hodinovém tvaru. Pokud bychom chtěli mít například pracovní číslo dostupné od pondělí do pátku
od 9:00 hodin do 18:00 a v sobotu od 9:00 do 13:00, zápis v dialplánu by vypadal následovně:
75
;Den
include => otevreno|09:00-18:00|mon-fri|*|*
include => otevreno|09:00-13:00|sat|*|*
include => zavreno
[otevreno]
exten => 2000,1,Dial(SIP/2000)
[zavreno]
exten => 2000,1,VoiceMail(2000,u)
3.4.7
Proměnná ${EXTEN} a funkce ${CALLERID(num)}
Dříve než bude popsáno dialplánové programování a funkce, je dobré zmínit ještě dva základní a
velice používané prvky: systémovou proměnnou ${EXTEN} a funkci ${CALLERID(num)}.
${EXTEN} – Asterisk automaticky za tuto proměnnou vkládá vytáčené číslo. Narozdíl od:
exten => 2000,1,Dial(SIP/2000)
Použijeme:
exten => 2000,1,Dial(SIP/${EXTEN})
Výsledek je stejný.
${CALLERID(num)} – Tato funkce vrací číslo volajícího. Využívá se převážně ve spojení
s aplikací VoiceMailMain (), kde se přidává jako parametr. Po zavolaní na číslo 99 se volající
dostane do své hlasové schránky:
exten => 99,1,VoiceMailMain(${CALLERID(num)})
V Asterisku mohou být funkce a programy implementovány buď externě pomoci Asterisk Gateway
Interface (AGI) skriptu nebo interně přes funkce a aplikace v dialplánu. Další kapitoly budou
pojednávat převážně o interním programování. AGI není součástí tohoto textu. Dialplán je definován
v extensions.conf a administrátor Asterisku do něj může implementovat funkce, tak jako by se
jednalo o skriptovací jazyk. K pochopení následujících kapitol je potřeba mít alespoň základy
programování v libovolném programovacím jazyce.
3.4.8
Programová struktura
Každá extension pro dané číslo je v podstatě krátký program, který definuje, jak bude hovor probíhat.
Proto, když jsme například definovali přehrání hello-world pro číslo 1001, psali jsme v podstatě
program:
exten => 1001,1,Answer()
exten => 1001,n,Playback( hello-world)
exten => 1001,n,Hangup()
76
3.4.9
Aplikace Set ( )
Aplikace Set ( ) se využívá k vytvoření a změně proměnných:
exten => 1002,1,Set(Oblibenezvire = "Tygr")
exten => 1002,n,Set(Oblibenecislo = 23)
Pro čtení a tisk proměnných na obrazovku se používá funkce ${VARIABLENAME}. Pro
zobrazení proměnných v CLI Asterisku zadáme například:
exten => 1003,1,NoOp(${Oblibenezvire})
exten => 1003,n,NoOp(${Oblibenecislo})
Definujeme několik typů proměnných:
•
Globální proměnné – Platná kdekoliv v dialplánu, vytváří se či edituje pomocí:
Set(<proměnná>=<obsah>,g):
exten => 1004,1,Set(READABLEANYWHERE = 23,g)
exten => 1004,n,NoOp(${READABLEANYWHERE})
•
Kanálové proměnné – Platná pouze v daném kanálu (kanál je například spojení mezi
dvěma volajícími), vytváří se či edituje pomocí:
Set(<proměnná>=<obsah>) (bez g):
exten => 1005,1,Set(READABLEANYWHERE = 42)
exten => 1005,n,NoOp(${READABLEANYWHERE})
•
Systémové proměnné – Jedná se o dynamické proměnné, které jsou definovány
Asteriskem a mohou být použity v dialplánu bez předchozího vytvoření. Nejčastěji
používaná systémová proměnná je:
${EXTEN}:
exten => 1006,n,NoOp(Vytáčené číslo: ${EXTEN})
3.4.10 Štítky a Goto ( )
Goto ( ) umožňuje přeskočit z jedné řádky dialplánu na jinou. Toto může být problematické, pokud
používáme n priority. Řešením je použití štítků k označení specifického řádku a poté volání tohoto
názvu štítku za pomocí Goto ( ) . Aplikace Goto ( ) může být využit uvnitř extension, mezi extensions
nebo mezi kontexty.
Uvnitř extension:
exten => 1007,1,Answer()
exten => 1007,n(Start),Wait(1)
exten => 1007,n,Playback(hello-world)
exten => 1007,n,Goto(Start)
77
Mezi extensions:
exten => 1008,1,Answer()
exten => 1008,n,Goto(1009,Ping)
exten => 1009,1(Ping),Playback(hello-world)
exten => 1009,n,Wait(2)
exten => 1009,n,Goto(1010,Pong)
exten => 1010,1(Pong),Playback(tt-weasels)
exten => 1010,n,Wait(2)
exten => 1010,n,Goto(1009,Ping)
Mezi kontexty:
[vedeni]
exten => 1011,1,Answer()
exten => 1011,n,Playback(hello-world)
exten => 1011,n,Goto(prodej,1012,1)
[prodej]
exten => 1012,1,Playback(hello-world)
exten => 1012,n,Hangup()
3.4.11 Smyčky a While ( )
Smyčky umožňují provádět operace v dialplánu opakovaně. K použití smyček v dialplánu se používá
aplikace While ( ) :
exten => 1013,1,Answer()
exten => 1013,n,Set(i=1)
exten => 1013,n,While($[${i} < 10])
exten => 1013,n,SayNumber(${i})
exten => 1013,n,Wait(1)
exten => 1013,n,Set(i=$[${i} + 1])
exten => 1013,n,EndWhile()
exten => 1013,n,Hangup()
3.4.12 Podmínka a Gotoif ( )
Pomocí aplikace Gotoif ( ) můžeme skočit do jiné části dialplánu, pokud je splněna definovaná
podmínka:
exten => 1014,1,Answer()
exten => 1014,n,Set(Favoritestation = 0815)
exten => 1014,n,NoOp(ověření zda se volá ${Favoritestation})
exten => 1014,n,GotoIf($[${CALLERID(num) = ${Favoritestation}]?yes,no)
exten => 1014,n(yes),Playback(hello-world)
exten => 1014,n,Hangup()
78
exten => 1014,n(no),Playback(tt-monkeys)
exten => 1014,n,Hangup()
3.4.13 Podprogramy a Gosub ( )
Pomocí aplikace Gosub ( ) je hovor přesměrován do podprogramu, může být navrácen do původní
priority pomocí aplikace Return ( ):
exten => 1015,1,Gosub(cid-set)
exten => 1015,n,Dial(SIP/${EXTEN})
exten => 1015,n(cid-set),Set(CALLERID(all) = Firma s.r.o <8005551212>)
exten => 1015,n,Return()
3.4.14 Proměnné
Pomocí proměnných můžeme ukládat aktuální hodnoty. V Asterisku můžeme ukládat čísla,
písmena a celé řetězce. Proměnné jsou důležité jelikož nám umožňují definovat lépe pravidla podle,
kterých je poté prováděn specifický hovor. Proměnné v Asterisku také nejsou závislé na velikosti
písma. Mohou být definovány malými písmeny či velkými (${BARVA}, ${barva}), jediná výjimka je u
systémových proměnných, ty jsou vždy zadávány velkými písmeny (${EXTEN}). Pokud definujeme
pomocí aplikace Set ( ) proměnnou tvořenou slovem, z pravidla se toto slovo dává do uvozovek,ale
není to nutná podmínka.
Pokud bychom chtěli do názvu proměnné volit znaky, které mají v syntaxi Asterisku jiný význam,
je nutné před ně vložit oddělovač. V extensions.conf se používá oddělovač \ . Znaky, které je potřeba
takto oddělit jsou například:
[]$“\_
Uveďme příklad:
exten => 1234,1,Set(castka="\$10.00")
Pokud budeme chtít použít samotný znak \ , musíme opět použít oddělovač:
exten => 1234,1,Set(cislopokoje="48\\10")
Co se týče omezení velikosti proměnné, maximální délka je 18 znaků. Při větším zadání je
generována chyba.
Následující seznam obsahuje nejpoužívanější systémové proměnné:
•
•
•
•
•
$ {ANSWEREDTIME} – celkový čas aktivního spojení v sekundách
${BLINDTRANSFER} – název kanálu na druhé straně spojení
${CHANNEL} – název aktuálního kanálu
${CONTEXT} - název aktuálního kontextu
${EPOCH} - aktuální UNIX čas (počet sekund, které uběhly od startu UNIX epochy – půlnoc,
1. Ledna, 1970)
79
•
•
•
•
•
•
•
$ EXTEN} – akutálně volané číslo
${HANGUPCAUSE} - důvod ukončení hovoru
${INVALID_EXTEN} - používá se v i extension a obsahuje volané číslo
${PRIORITY} – aktuální priorita aktuální extension
${TRANSFER_CONTEXT} – kontext přenášeného hovoru
${UNIQUEID} – jedinečné ID číslo pro dané spojení
${SYSTEMNAME} - název systému. Je definován v /etc/asterisk/asterisk.conf
Speciální proměnné:
•
Proměnná h – h je standardní extension pro ukončení hovoru. Pokud je definovaná, je
volána jakmile colající ukončí hovor. Představme si, že chceme například definovat globální
proměnnou SPOJENI, která bude reflektovat počet aktuálních spojení. Pokud se spojení
naváže zvýší se hodnota, pokud ukončí,zase se sníží:
[global]
SPOJENI=0
[from-internal]
exten => _X.,1,Set(SPOJENI=$[${SPOJENI} + 1]|g)
exten => _X.,2,Dial(SIP/${EXTEN})
exten => h,1,Set(SPOJENI=$[${SPOJENI} - 1]|g)
•
Proměnná i – abychom v dialplánu resp. v kontextu dokázali vždy řešit i nečekáné situace,
využiváme proměnnou i. Tato proměnná spravuje včechny vytáčená čísla, která nejsou
explicitně zadány v kontextu. V souvislosti s proměnnou i se používá systémová proměnná
${INVALID_EXTEN}. V konkrétním případě mohou zaměstnanci Firmy s.r.o. volat pouze čísla
100-199. Pokud zavolají na jiné, přehraje se jim zvuková informace o neplatném čísle:
[firmasro]
exten => _1XX,1,Dial(${EXTEN})
exten => i,1,NoOp(Nesprávné číslo ${INVALID_EXTEN} bylo vytočeno.)
exten => i,2,Answer( )
exten => i,3,Playback(invalid)
exten => i,4,Hangup( )
•
Proměnná o a a – pokud v souboru pro nastavení hlasové schránky voicemail.conf povolíme
volbu operator=yes , bude hovor směrován na extension o(abort) jakmile stiskne volající
nulu. Po stisknutí hvězdičky, bude hovor směrován na extension a (abort).
[firmasro]
exten => _1XX,1,Dial(${EXTEN})
exten => i,1,NoOp(Nesprávné číslo ${INVALID_EXTEN} bylo vytočeno.)
exten => i,2,Answer( )
exten => i,3,Playback(invalid)
exten => i,4,Hangup( )
80
•
Proměnná t a T – jedná se o proměnné pro srpávu časových intervalů v kontextech. Pokud
například využíváme IVR (kapitola 1.10) a od volajícího nepříjde žádný vstup pomocí DTMF
volby, je hovor ukončen:
[hlavnimenu]
exten => 10,1,Answer()
exten => 10,n,Background(marryme)
;"vezmeš si mě? Stiskni 1 pro
ano, 2 pro ne.”
exten => 1,1,Playback(thank-you-cooperation) ;1 => "Díky."
exten => 1,n,Hangup( )
exten => 2,1,Playback(hangup-try-again)
exten => 2,n,Hangup( )
exten => t,1,Hangup( )
;2 => "Ukončete a zkuste znovu.“
;žádná odpověď => zavěs.
Velké T se volá tehdy, kdy byl překročen maximální definovaný čas. Ten se dá nastavit pomocí:
Set(TIMEOUT(absolute)=<sekundy>)
•
Proměnná s – prvním údajem každé extension je volané číslo či jméno. Pokud však přichází
hovor na Asterisk například ze sítě PSTN, Asterisk nemá informace, jaké číslo bylo voláno, či
na koho se chce volající dovolat. V tomto případě se používá proměnné s, která nahrazuje
volaé číslo v extension. V následujícím příkladě se všem volajícím z PSTN na Asterisk
přehraje zvuk opic.
exten => s,1,Answer()
exten => s,2,Wait(1)
exten => s,3,Play(tt-monkeys)
exten => s,4,Wait(1)
exten => s,5,Hangup()
3.4.15 Makra
Makra jsou druhem podprogramu. Mohou obsahovat kompletní programy a funkce,ale jsou
volány skrze jednoduchý řádek. To umožňuje zachovávat přehledný dialplán. Jednoduchý příklad
makra vypadá následovně:
[macro-prichozi]
exten => s,1,Dial(SIP/${MACRO_EXTEN},10)
exten => s,n,VoiceMail(${MACRO_EXTEN})
Toto makro může být voláno:
[prodej]
exten => _2XXX,1,Macro(prichozi)
[building-mgr]
exten => _2XXX,1,Macro(prichozi)
81
3.5
Asterisk Extension Language (AEL)
Již jsme se zmínili, že existují dvě cesty jak sestavovat dialplán. První, kterou jsme si již popsali,
tzn. pomocí extension.conf a novější metoda pomocí rozšířeného jazyka Asterisku tzv. AEL jazyka.
V tomto případě pracujeme se souborem extensions.ael , který je umístěn opět v adresáři
/etc/asterisk. AEL může být užitečný pro ty, kterým dělá problémy orientace v rozsáhlých dialplánech
psaných klasickou metodou a jsou spíše zastánci vzhledu skriptovacího programu. AEL totiž velice
skriptovací jazyk připomíná. Lze používat i obě metody dohromady, čili i klasickou i AEL.
3.5.1
CLI příkazy pro AEL
Nejdůležitějším příkazem v CLI pro AEL je příkaz ael reload . Znovu načte extensions.ael do
paměti a po každé změně konfiguračního souboru, je nutné tento příkaz provést pro aktualizaci.
*CLI> ael reload
3.5.2
Aelparse
Od verze 1.4 obsahuje Asterisk nástroj pro konvertování extensions.ael skriptů do klasické podoby
extensions.conf. Tento nástroj je využíván hlavně pro odstraňování chyb a pro ověření validity kódu
napsaného v extensions.ael. Aelparse obsahuje několik parametrů, v následujícím příkladě je
uveden parametr –w , který ukládá překonvertovaný obsah do souboru extensions.conf.aeldump a
parametr-q pro výstup na obrazovku, který oznamuje pouze varování a chyby.
asterisk: /etc/asterisk# aelparse -q -w
LOG: lev: 4 file: ael2_parse line: 543 func: main 19 contexts, 25 extensions,
62 priorities
3.5.3
Srovnání extensions.conf s extensions.ael
Následující příklad znázorňuje stejný zápis extensions, v prvním příkladě v extensions.conf v druhém
případě v extensions.ael. Jak již bylo řečeno, zápis v AEL jazyce připomíná spíše klasický skriptovací
jazyk. Nejprve zápis v extensions.conf:
[my-phones]
exten => 20,1,Answer()
exten => 20,n,Playback(beep)
exten => 20,n,Hangup()
Podobně jako v jiných programovacích jazycích je nutné každý AEL příkaz ukončit středníkem.
Funkčně totožný zápis v extensions.ael:
context my-phones {
20 => {
Answer();
Playback(beep);
82
Hangup();
}
}
3.5.4
Kontexty, extensions a priority v AEL
Na dalším příkladu si uvedeme, jak jsou v případě AEL definovány kontexty, extensions a
priority. Číslování priorit již není v AEL podporováno, kontext je definován před složenými závorkami,
které uzavírají samotné extensions a aplikace. Opět klasický zápis:
[internal-users]
exten => 21,1,Dial(SIP/anna)
exten => 21,n,VoiceMail(anna)
exten => 22,1,Dial(SIP/lisa)
exten => 22,n,VoiceMail(lisa)
exten => _3X,1,Dial(SIP/${EXTEN})
A AEL zápis:
context internal-users {
21 => {
Dial(SIP/anna);
VoiceMail(anna);
}
22 => {
Dial(SIP/lisa);
VoiceMail(lisa);
}
_3X => {
Dial(SIP/${ EXTEN});
}
}
3.5.5
Vložené kontexty – Include Statements v AEL
Vložené kontexty se zapisují v AEL následovně. Opět klasický zápis:
[sales]
exten => 2001,1,Dial(SIP/anna)
exten => 2002,1,Dial(SIP/brock)
[warehouse]
exten => 3001,1,Dial(SIP/lisa)
[day]
include => sales
include => warehouse
83
A AEL zápis:
context sales {
2001 => {
Dial(SIP/anna);
}
2002 => {
Dial(SIP/brock);
}
}
context warehouse {
3001 => {
Dial(SIP/lisa);
}
}
context day {
includes {
sales;
warehouse;
}
}
3.5.6
Štítky, goto a přeskakování v AEL
V rozsáhlejších diaplánech je programátor nucen přeskakovat jednotlivé řádky v dialplánech
pomocí aplikací Goto (), Gotoif (), Gosub () a Gosubif ():
[priklad]
; skoky v extension
;
exten => 10,1(begin),NoOp()
exten => 10,n,Wait(1)
exten => 10,n,SayNumber(1)
exten => 10,n,NoOp(endlessloop)
exten => 10,n,Goto(begin)
; skoky mezi extensions
; se stejnym kontextem
exten => 20,1,SayNumber(20)
exten => 20,n,Goto(10,begin)
; skoky mezi ruznymi kontexty
exten => 30,1,SayNumber(30)
exten => 30,n,Goto(cntxt2,40,forty)
[cntxt2]
exten => 40,1(forty),NoOp()
exten => 40,n,SayNumber(40)
exten => 50,1,Goto(40,1)
exten => 60,1,Goto(example,10,1)
84
V AEL jazyce je štítek vždy uvnitř extension a na svém řádku:
context priklad {
// skoky v extension
//
10 => {
begin:
Wait(1);
SayNumber(10);
NoOp(endlessloop);
goto begin;
}
//skoky mezi extensions
//se stejnym kontextem
//
20 => {
SayNumber(20);
goto 10|begin;
}
// skoky mezi ruznymi kontexty
//
30 => {
SayNumber(30);
goto cntxt2|40|forty;
}
}
context cntxt2 {
40 => {
forty:
SayNumber(40);
}
50 => jump 40;
60 => jump 10@example;
}
V uvedeném příkladě můžeme vidět rozdílnou syntaxi aplikace „goto“:
extensions.conf Goto([[kontext,]extension,]štítek)
extensions.ael goto[[kontext|]extension|]štítek
3.5.7
Podmínky v AEL
Podmínky jsou struktury, které nám umožňují kontrolovat průběh programu. AEL jazyk obsahuje
oba příkazy – if i switch. To je velká výhoda, jelikož se tím stává AEL dialplán daleko více čitelným.
•
IF - V extensions.conf musíme štítkovat cíle explicitně:
exten => 90,1,Dial(SIP/anna)
exten => 90,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?b:n)
85
exten => 90,10(b),Answer()
exten => 90,11,Playback(hello-world)
exten => 90,12,Voicemail(anna,b)
exten => 90,13,Goto(end)
exten => 90,20(n),Dial(SIP/lisa)
exten => 90,21,Playback(beeperr)
exten => 90,22,Goto(end)
exten => 90,30(end),NoOp(done)
V extensions.ael má příkaz if jednodušší strukturu:
90 => {
Dial(SIP/anna);
if ("${DIALSTATUS}" = " BUSY") {
Answer();
Playback(hello-world)
Voicemail(anna,b);
}
else {
Dial(SIP/lisa);
Playback(beeperr);
}
NoOp(done);
}
•
SWITCH - V AEL jazyce nám umožňuje příkaz switch jednoduše tvořit kód, který
dokáže pracovat s více možnostmi. Pokud bychom chtěli napodobit funkcionalitu příkazu
switch v extensions.conf vznikne nepřehledný zmatek:
exten => 70,1,Dial(SIP/anna)
exten => 70,n,Goto(70-${DIALSTATUS},10)
exten => 70 n(end),NoOp(done)
exten => 70-BUSY,10,NoOp(busy)
exten => 70-BUSY,11,Goto(end)
exten => 70-NOANSWER,10,NoOp(no answer)
exten => 70-NOANSWER,11,Goto(end)
exten => _70-.,10,NoOp(something else)
exten => _70-.,11,Goto(end)
V extensions.ael je výsledek snadno čitelný a elegantní:
70 => {
Dial(SIP/anna);
switch ("${DIALSTATUS}") {
case "BUSY":
NoOp(busy);
break;
case "NOANSWER":
NoOp(no answer) ;
break;
86
default:
NoOp(something else) ;
}
NoOp(done) ;
}
•
IFTIME - V AEL jazyce tato funkce nahrazuje aplikaci GotoIfTime () v extensions.conf:
20 => {
ifTime (08:00-18:00|mon-fri|*|*) {
Dial(SIP/20);
} else {
Playback(announcement-closed);
Voicemail( 20,s);
}
}
•
RANDOM - Tato funkce může dosahovat hodnot 1-99. Jedná se o vyjádření procentní
šance, že bude daný blok kódu proveden:
20 => {
random (42) {
NoOp(42 % Chance);
} else {
NoOp(58 % Chance);
}
}
3.5.8
Smyčky v AEL
Stejně jako podmínky, smyčky umožňují spravovat struktury. AEL obsahuje klasické smyčky for a
while.
•
WHILE - Příkaz while v AEL jazyce se používá podobně jako aplikace While () a
EndWhile () v extensions.conf :
exten => 40,1,Set(x=5)
exten => 40,n,While($[${x} <= 9])
exten => 40,n,NoOp(x is ${x})
exten => 40,n,ExecIf($[${x} > 5] , ExitWhile)
exten => 40,n,Playback(beep)
exten => 40,n,Set(x=$[${x} + 1])
exten => 40,n,EndWhile()
exten => 40,n,NoOp(done)
V extensions.ael jsou použity příkazy break a continue. Příkaz break skáče na konec bloku
smyčky, continue naopak na začátek. V následujícím příkladě je použit break:
30 => {
x=0;
while (${x} <= 9) {
87
NoOp(x is ${x} );
if (${x} > 5) {
break;
}
Playback(beep);
y=${x} + 1;
}
NoOp(done);
}
•
FOR - AEL jazyk nabízí také vytváření smyček pomocí příkazu for. Tento příkaz nemá
ekvivalent v extensions.conf , jelikož každá smyčka pomocí for lze realizovat pomocí
while:
exten => 40,1,Set(x=5)
exten => 40,n,While($[${x} <= 5])
exten => 40,n,NoOp(x is ${x})
exten => 40,n,Playback(beep)
exten => 40,n,Set(x=$[${x} + 1])
exten => 40,n,EndWhile()
exten => 40,n,NoOp(done)
Stejná funkce pomocí for v extensions.ael:
40 => {
for (x=0; ${x}<=5; x=${x}+1) {
NoOp( x is ${x} ) ;
Playback(beep) ;
}
NoOp(done) ;
}
3.5.9
Makra
V extensions.conf jsou makra realizována pomocí aplikací Macro () nebo Gosub (). Příklad ukazuje
použití Macro ():
[macro-countdown]
exten => s,1,Set(c=${ARG1})
exten => s,n,While($[ ${c} > 0])
exten => s,n,SayNumber(${ c})
exten => s,n,Set(c=$[ ${c} - 1 ])
exten => s,n,EndWhile()
[default]
exten => 123,1,Macro(countdown,3)
exten => 124,1,Macro(countdown,5)
Kompilátor AEL jazyka konvertuje automaticky příkaz macro do Gosub (). V AEL jazyce nemáme
na výběr. AEL používáme pro práci s makry příkaz macro:
88
macro countdown( count ) {
for (c=${count}; ${c} >0; c=${c} -1) {
SayNumber(${c});
}
}
context default {
123 => {
&countdown(3);
}
124 => &countdown(5);
}
3.5.10 Filtrování na základě ID volajícího
V extensions.conf tato velice populární tzv. funkce „ex-přítelkyně“ vypadá následovně:
exten => 10/6135303122,1,NoOp(ex-girlfriend)
exten => 10/6135303122,n,Busy()
exten => 10,1,Dial(SIP/david)
exten => 10,n,Voicemail(david)
V extensions.ael by výše uvedená funkce vypadala takto:
10/6135303122 => {
NoOp(ex-girlfriend);
Busy();
}
10 => {
Dial(SIP/david);
Voicemail(david);
}
Pokud přichází telefonní hovor od osoby s ID 6135303122, je mu automaticky přehrán
obsazovací tón, všechny ostatní příchozí hovor jsou směrovány na telefon Davida.
3.6
Voicemail
Hlasová schánka (dále jen voicemail) je jednou ze základních služeb, která je Asteriskem
poskytována. Asterisk již v základní instalaci obsahuje funkční voicemail module. Potřebujeme ho jen
nakonfigurovat skrze soubor etc/asterisk/voicemail.conf. Nejprve opět přeneseme ukázkový soubor
do našeho záložního adresáře:
debian: /etc/asterisk# mv voicemail. conf /var/tmp/asterisk-etc-backup/
Nyní vytvoříme nový soubor etc/asterisk/voicemail.conf a vložíme do něj následující:
[general]
format = wav
89
[default]
2000 => 1234,Filip Rezac,[email protected]
2001 => 5678,Miroslav Voznak,[email protected]
Nyní jsou schránky nakonfigurovány. Každý záznam začíná číslem hlasové schránky (2000,
2001), dále pak pokračuje heslem účtu (1234, 5678), poté jmény uživatelů voicemailu (Filip,
Miroslav) a končí jejich e-mailovou adresou ( [email protected], [email protected]).
Posledním krokem je přidat několik řádek i do extensions.conf , tak, aby byly voicemaily plně funkční:
[default]
exten => 1001,1,Answer()
exten => 1001,2,Playback(hello-world)
exten => 1001,3,Hangup()
exten => 2000,1,Dial(SIP/2000,20)
exten => 2000,2,VoiceMail(2000,u)
exten => 2001,1,Dial(SIP/2001,20)
exten => 2001,2,VoiceMail(2001,u)
exten => 2999,1,VoiceMailMain(${CALLERID(num)},s)
V následujícím zápise se v aplikaci Dial () objevuje hodnota 20. Jedná se o dobu vyzvánění v
sekundách, než je uživatel volající přesměrován do hlasové schránky. V aplikaci Voicemail () je dále
uvedena proměnná u, která určuje, jaká hláška se má volajícímu přehrát při vstupu do voicemailu.
Proměnná u reprezentuje hlášku „unavaible“ (nedostupný). Dále ze může být použita proměnná b
„busy“ (obsazeno) a proměnná s, po které se pouze ozve tón ohlašující začátek nahrávání.
Poslední řádek v extensions.conf slouží k přístupu do voicemailu. Pokud si Filip nebo Miroslav
nepřečtou zprávu ve své e-mailové schránce, mohou si jí posledchnout pokud zavolají na číslo 2999.
Funkce ${CALLERID(num)} doplní automaticky číslo volajícícho,ten je přesměrován do své hlasové
schránky. Proměnná s zakazuje použitá hesla pro voicemail.
Nyní máme nakonfigurován základní voicemail a přístup k němu. Rozšířená řešení voicemailu,
jako například podpora hesel, či využití STT (Speech-to-text) modulu není součástí tohoto materiálu.
3.7
IVR – Interactive Voice Response
Hlasové menu (dále jen IVR) je další velice používaná služba v Asterisku. IVR (Interactive Voice
Response) umožňuje hlasovou interakci Vašeho systému s volajícími, kteří se systémem komunikují
pomocí tlačítek a tzv. DTMF volby, nebo klasicky hlasovou interakcí. Mnoho IVR poskytuje výběrové
menu pro směrování hovorů bez potřeby zásahu operátora, moderní IVR však dokážou plnit funkce
kompletních systémů a řídících součástí.
90
3.7.1
Jednoduché IVR
Asterisk obsahuje několik přednahraných hlasových zpráv. Soubor s názvem marryme.gsm obsahuje
hlášku: „Will you marry me? Press 1 for yes or 2 for no.“ (Vezmeš si mě? Stiskni 1 pro ano, nebo 2
pro ne). Pokud bychom chtěli následující zprávu využít jako IVR vypadalo by to následovně:
exten => 30,1,Answer()
exten => 30,2,Background(marryme)
exten => 30,3,Hangup()
exten => 1,1,Playback(thank-you-cooperation)
exten => 1,2,Hangup()
exten => 2,1,Playback(sorry)
exten => 2,2,Hangup()
Pokud volající zavolá na 30, Asterisk přehraje zprávu marryme.gsm. Pro IVR se používá aplikace
Backround () , kde systém čeká na odpověď od volajícího. Pokud zvolí volající číslo 1 je mu přehrána
hláška „Thank you for your cooperation“ (Děkujeme za spolupráci), pokud stiskne 2,Asterisk přehraje
hlášku „Sorry“ (Promiňte) a zavěsí.
3.7.2
Neplatný vstup (extension i)
Neplatný údaj (každý vstup, pro který není v dialplánu záznam) může být spravován pomocí
extension i. V následujícím příkladu, IVR přehraje omluvu volajícímu a zavěsí. (Skutečný IVR by měl
přesměrovat volajícího zpět do hlavního menu v případě neplatného vstupu.)
exten => 30,1,Answer()
exten => 30,2,Background(marryme)
exten => 30,3,Hangup()
exten => 1,1,Playback(thank-you-cooperation)
exten => 1,2,Hangup()
exten => 2,1,Playback(sorry)
exten => 2,2,Hangup()
; Pokud je vloženo jiné než platné číslo
exten => i,1,Background(sorry)
exten => i,2,Hangup()
3.7.3
Pauzy
Nejjednodušší způsob, jak vytvořit pauzy je přehrání prázdných zvukových souborů. Série
tichých zvukových souborů s délkou mezi 1 a 9 sekundami lze nalézt v /var/lib/asterisk/sounds/silenc
eV následujícím příkladě je použita pauza 5 sekund:
exten => 30,1,Answer()
91
exten => 30,2,Background(marryme)
exten => 30,3,Background(silence/5)
exten => 30,4,Hangup()
exten => 1,1,Playback(thank-you-cooperation)
exten => 1,2,Hangup()
exten => 2,1,Playback(sorry)
exten => 2,2,Hangup()
exten => i,1,Background(marryme)
exten => i,2,Hangup()
3.7.4
Víceúrovňové IVR
Problém víceúrovňových IVR systémů spočívá v tom, že volající může zadat vstupní jednoduché
číslice několikrát za sebou, ale dostane vždy jinou odpověď v závislosti na úrovni menu. V Asterisku
mohou být čísla v daném kontextu použita pouze jednou, proto pokud chceme využívat víceúrovňové
menu, je nutné vytvořit nový kontext pro další úroveň. V následujícím příkladě přeskakujeme mezi
kontexty pomocí aplikace Goto (). Využijeme následujících fiktivních zvukových souborů, které byly
pro příklad nahrány:
•
•
•
•
hlavni-menu.gsm – „Stiskněte 1 pro prodej, 2 pro služby, 3 pro přístup do restaurace.“
restaurace.gsm - „Stiskněte 1 pro přehrání nabídky pro tento týden nebo 2 pro přehrání
nabídky na příští týden.“
restaurace-nabidka-tento-tyden.gsm – „Pondělí: Nudle se sýrovou omáčkou.Úterý:
Kuře na paprice.......“
restaurace-nabidka-pristi-tyden.gsm – „Pondělí: Domácí bramborák.Úterý: Smažený
sýr s hranolkama.......“
Pokud bude IVR na čísle 30, prodej na čísle 100 , služby na čísle 150 a restaurace na čísle 200 bude
IVR systém vypadat následovně:
[ivr]
; Menu je přehráváno stále dokola, dokud volající nevloží vstup.
;
exten => 30,1,Answer()
exten => 30,2,Background(hlavni-menu)
exten => 30,3,Background(silence/3)
exten => 30,4,Goto(2)
exten => 1,1,Dial(SIP/100)
exten => 2,1,Dial(SIP/150)
; Goto() skočí do dalšího kontextu ([restaurace])
;
exten => 3,1,Goto(restaurace,200,1)
exten => i,1,Goto(30,2)
92
[restaurace]
exten => 200,1,Background(restaurace)
exten => 200,2,Background(silence/3)
exten => 200,3,Goto(1)
exten => 1,1,Playback(restaurace-nabidka-tento-tyden)
exten => 1,2,Wait(2)
exten => 1,3,Goto(1)
exten => 2,1,Playback(restaurace-nabidka-pristi-tyden)
exten => 2,2,Wait(2)
exten => 2,3,Goto(1)
; Špatné zadání pošle volajícího zpět do hlavního menu
exten => i,1,Goto(ivr,30,2)¨
Teoreticky je možné vytvářet nekonečný počet úrovní menu,ale z praktické zkušenosti volající
většinou hovor ukončí po třetím menu.
3.8
Databáze Asterisku
Problém užívání proměnných v dialplánu Asterisku spočívá v jejich zranitelnosti vůči nečekaným
restartům či haváriím systému, kde je Asterisk nainstalován. Pokud taková situace nastane, jsou data
ztracena,nebo nastavena do výchozích hodnot. Navíc služby jako přesměrovaní hovorů vyžadují
uložení dat pro další použití například po restartu Asterisku. K uložení dat a proměnných se
v Asterisku využívá tzv. AstDB – Asterisk databáze.
Naskýtá se otázka, kdy je vhodné Asterisk databázi využít? Pro malé systémy, kde systém
nepracuje s velkým množstvím dat, je využití databáze zbytečně složité, naopak pro velké a
komplexní systémy je vhodnější využít externí databáze, například SQL serveru. Pokud však
chceme znát co nejvíce možností, které nám Asterisk nabízí, je dobré vědět, jak Asterisk databázi
použít.
V základní instalaci obsahuje Asterisk databázi založenou Berkley databázi – BDB. BDB je
jednoduchá, výkonná databáze. Nepodporuje SQL či jiný dotazovací jazyk a povoluje přístup pouze
skrze procesové API volání. Data jsou uložena ve formě klíč/hodnota, kde klíče jsou sdružovány do
rodin.
3.8.1
Zápis hodnot do databáze
Funkce DB () se volá skrze aplikaci Set (). Vložení zápisu jablko do rodiny ovoce s hodnotou 20 se
provede následujícím zápisem extension:
exten => 1234,1,Set(DB(ovoce/jablko)=20)
93
3.8.2
Čtení hodnot z databáze
Hodnoty z databáze mohou být volány opět funkcí DB () ve formátu ${DB(rodina/klíč)}. K výpisu
obsahu jablko v rodině ovoce do konzole zadejte následující příkaz:
exten => 1234,1,NoOp(ovoce/jablko má hodnotu ${DB(ovoce/jablko)})
Hodnotu z databáze můžeme vložit do extensions následujícím způsobem:
exten => 1234,1,Set(pocetjablek=${DB(ovoce/jablko)})
3.8.3
Mazání hodnot z databáze
Aplikace DBdel () a DBdeltree () se využívají k mazání záznamů v databázi.
•
DBdel() a ${DB_DELETE()} – v Asterisku verze 1.2 se jednotlivé záznamu v databázi
mazaly pomocí DBdel (). Smazání klíče jablko z rodiny ovoce se provede následovně:
exten => 1234,1,DBdel(ovoce/jablko)
V Asterisku verze 1.4 a vyšší je již DBdel () zastaralá. K smazání stejného záznamu jako
v předchozím případě využijeme funkci DB_DELETE ():
exten => 1234,1,NoOp(${DB_DELETE(ovoce/jablko)})
•
DBdeltree() – pokud potřebujeme smazat celou rodinu využijeme aplikace DBdeltree().
Rodina ovoce se smaže následujícím způsobem:
exten => 1234,1,DBdeltree(fruit)
3.8.4
Přístup do databáze z CLI
Systémový administrátor může přistupovat k databázi Asterisku skrze CLI. Pokud zadáváme do
databáze hodnotu oddělenou mezerou, musí být vždy v uvozovkách („Hello world“).
3.8.5
Zápis hodnot do databáze pomocí CLI
K zápisu do databáze slouží příkaz database put rodina klíč hodnota:
*CLI> database put ovoce jablko 20
Updated database successfully
3.8.6
Čtení hodnot z databáze pomocí CLI
Pro načtení hodnoty slouží příkaz database get rodina klíč:
94
*CLI> database get ovoce jablko
Value: 20
3.8.7
Mazání hodnot z databáze pomocí CLI
Příkazy database del rodina klíč a database deltree rodina mažou záznamy z databáze.
•
database del – Pro smazání klíče jablko z rodiny ovoce použijeme:
*CLI> database del ovoce jablko
Database entry removed.
•
database del tree – Pro smazání celé rodiny ovoce použijeme:
*CLI> database deltree ovoce
Database entrie removed.
3.8.8
Zobrazení obsahu databáze v CLI
Příkazy database show a database showkey zobrazují obsah databáze v CLI:
*CLI> database put nakupniseznam vejce 2
Updated database successfully
*CLI> database put nakupniseznam maslo 250
Updated database successfully
*CLI> database put nakupniseznam cukr 500
Updated database successfully
*CLI> database show
/nakupniseznam/cukr
: 500
/nakupniseznam/maslo
: 250
/nakupniseznam/vejce
:2
*CLI> database showkey maslo
/nakupniseznam/maslo
: 250
*CLI> database deltree nakupniseznam
Database entries removed.
3.8.9
Přístup do databáze z příkazové řádky
Příkazem asterisk –rx ‘příkaz’ můžeme provádět CLI příkazy přímo z příkazové řádky našeho OS:
asterisk -rx ’database put test hodnota1 23’
Updated database successfully
asterisk -rx ’database put test hodnota2 42’
Updated database successfully
asterisk -rx ’database show test’
/test/hodnota1
: 23
/test/hodnota2
: 42
asterisk -rx ’database get test hodnota2’
Value: 42
95
asterisk -rx ’database deltree test’
Database entries removed.
3.8.10 Záloha databáze
Databáze Asterisku je nativně uložena v /var/lib/asterisk/astdb. Tento soubor lze zkopírovat poté, co
je Asterisk zastaven. Pomocí příkazu v příkazovém řádku lze databázi zálohovat například takto:
asterisk -rx "database show" > /tmp/backup-asterisk-database.txt
3.8.11 Příklad přesměrování
V následujícím příkladě bude v Asterisku nastaveno přesměrování hovorů na jiné číslo uvnitř firmy.
Pro aktivaci přesměrování je využito interní číslo 44 následované číslem, kam má být hovor
směrován. Pro deaktivaci přesměrování je opět zadána 44, tentokrát již bez čísla:
[from-internal]
; aktivace
exten => _44X.,1,Answer()
exten => _44X.,n,Set(DB(CF/${CALLERID(num)})=${EXTEN:2})
exten => _44X.,n,SayDigits(${EXTEN:2})
exten => _44X.,n,NoOp(Přesměrování z ${CALLERID(num)} na ${EXTEN:2}
> aktivováno.)
exten => _44X.,n,Hangup()
; deaktivace
exten => 44,1,Answer()
exten => 44,n,DBdel(CF/${CALLERID(num)})
exten => 44,n,Playback(auth-thankyou)
exten => 44,n,NoOp(Přesměrování čísla ${CALLERID(num)} deaktivováno.)
exten => 44,n,Hangup()
[from-external]
exten => _X.,1,NoOp(Hovor z ${CALLERID(num)} na ${EXTEN})
exten => _X.,n,GotoIf($[foo${DB(CF/${EXTEN})} != foo]?normal:forward)
exten => _X.,n(normal),Dial(SIP/${EXTEN})
exten => _X.,n(forward),NoOp(Hovor pro ${EXTEN} bude spojen s
˃ ${DB(CF/${EXTEN})})
exten => _X.,n,Dial(local/${DB(CF/${EXTEN})})
96
3.9
Služby Asterisku
Asterisk nabízí veliké množství doplňkových služeb, jak klasických, tak i pokročilých, které jsou
obvykle poskytovány pouze špičkovými firemními PBX. Jako doplňkové služby a funkce si uvedeme
následující příklady, výčet nemusí být úplný, ale i tak je docela obsáhlý:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
ACCOUNT CODE, používá se pro účely tarifování.Volající před volbou čísla vloží svůj kód.
Do CDR (Call Detail Recording) se zaznamenávají údaje o délce hovoru, volaném čísle, ceně,
atd...
AUTOMATED ATTENDANT, volající je přepojen na požadovanou pobočku bez účasti
spojovatelky.
AUTOMATIC HOLD, pokud chceme provést hovor druhý hovor, tak můžeme inicializovat bez
zavěšení předchozího a Asterisk první hovor automaticky podrží, přičemž se k němu můžeme
zpětně vrátit.
CALL TRANSFER, jedná se o předání hovoru.
BLACKLIST, seznam nežádoucích čísel, které jsou jako příchozí hovory odmítnuty.
BLIND TRANSFER, je předání hovoru na jinou pobočku bez sledování toho, zda hovor někdo
přijme, hovor je předán i s vyzváněním.
CALL DETAIL RECORD, záznam hovorů uskutečněných v PBX, který obsahuje volající číslo,
volané číslo, datum, délku hovoru a případně další informace.
CALL FORWARDING ON BUSY, příchozí hovor je automaticky přesměrován za podmínky,
že je volané číslo obsazeno.
CALL FORWARDING ON NO ANSWER, příchozí hovor je automaticky přesměrován jen
tehdy, pokud volané číslo neodpovídá, tzn. po určitém čase.
CALL FORWARDING UNCONDITIONALLY, jedná se o okamžité přesměrování bez
podmínek. CALL MONITORING, evidence příchozích, odchozích a zmeškaných volání,
přístup přes web, uživatel po autentizaci vidí seznam volání, které se týkají jeho účtu.
CALL PARKING, odložení hovoru do virtuálního úložiště s možností jeho vyzvednutí stejnou
nebo jinou pobočkou.
CALL QUEUING, umožňuje řadit příchozí hovory do fronty a vyzvedávat je dalším volným
účastníkem konkrétní skupiny.
CALL RECORDING, umožňuje zaznamenávat hovory, zaznamenané hovory jsou uloženy v
požadovaném formátu (např. PCM či GSM) a nabídnuty k přehrání oprávněnému uživateli,
přihlášení probíhá přes https a po zadání hesla jsou nabídnuty pouze hovory týkající se
konkrétní pobočky autentizovaného uživatele.
CALL RETRIEVAL, funkce vyvolá osobu, která může převzít volání.
CALL ROUTING, je provolení na pobočku (DDI – Direct Dialing In, provolba).
CALL SNOOPING, umožňuje odposlouchávat určenou skupinu telefonů.
CALLER ID, je funkce zobrazení čísla volajícího a jména volajícího.
CALLER ID BLOCKING, hovor je odmítnut na základě identifikace volajícího.
CALL WAITING, je upozornění na čekající volání během sestaveného spojení, po jeho přijetí
je možné střídání mezi oběma hovory.
CALL ID ON CALL WAITING, je identifikace dalšího volajícího při probíhajícím hovoru.
CONFERENCE BRIDGING. vytvoří konferenci mezi terminály různých typů jako lokální
pobočkou, vzdálenou linkou, mobilním účastníkem, VoIP spojením, apod...
DATABASE STORE / RETRIEVAL, ukládá informace o hovorech do DB pro pozdější využití.
DATABASE INTEGRATION, Asterisk umožňuje poskytování informací o volajícím účastníkovi
volanému před přijmutím volání nebo během hovoru.
97
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
DIAL BY NAME, namísto čísla je možné volit i jméno (jako alias).
DISTINCTIVE RING, jedná se o rozdílný typ vyzvánění založený na identifikaci volajícího.
DUNDI (Distributed Universal Number Discovery), je distribuovaný systém směrování, který
v síti Asterisků umožní jednak rozložení zátěže mezi různé servery a jednak zvýšení odolnosti
při výpadku některého z Asterisk serverů (cluster – několik Asterisků, které se navenek tváří
jako jeden velký softswitch).
DO NOT DISTURB, aktivací funkce nerušit je volání přesměrováno na ohlášení, spojovatelku
nebo jinou pobočku, apod...
ENUM, Asterisk podporuje vyhledávání telefonních čísel přes DNS, kde je realizováno
mapování telefonních čísel na jmenné identifikátory (URI), pokud je spojení na vyhledanou
URI adresu nedostupné, tak se použije další pravidlo (např. směrování přes PSTN).
INTERACTIVE DIRECTORY LISTING, umožňuje volajícímu účastníkovi interaktivní vyhledání
volaného podle jeho jména v korporátním adresáři.
INTERACTIVE VOICE RESPONSE, IVR je pokročilý systém pro obsluhu příchozích
volání,volající prochází hlasovým menu a pomocí volby čísel volí možnosti spojení.
LOCAL AND REMOTE CALL AGENTS, účastník se může pomocí své identifikace přihlásit na
kterékoliv telefonu a používat ho jako svůj vlastní (tzn. s vlastním číslem, nastavením služeb,
atd.)
MUSIC ON HOLD, hudba na přidržené lince, přičemž audio soubory lze vytvářet
jednoduchým způsobem.
PREDICTIVE DIALER, funkce je používaná odchozími centry volání, spojení se sestavuje na
základě statistického modelu, který určuje, kdy bude volaná strana dostupná.
PRIVACY MANAGER, jestliže je kód pro vzdálený přístup zablokován (viz. LOCAL AND
REMOTE CALL AGENTS), potom ručním zadáním čísla Privacy Manager zkontroluje, zda je
číslo na Black listu nebo White listu a podle toho volbu povolí nebo zamítne.
PROTOCOL CONVERSION, umožňuje spojení mezi sítěmi používajícími rozdílné protokoly.
REMOTE CALL PICKUP, umožňuje vyzvednout hovor, který vyzvání na jiné pobočce.
REMOTE OFFICE SUPPORT, umožňuje přihlásit telefon z jiné PBX tak, že má vlastnosti
lokální pobočky.
ROAMING EXTENSIONS, jednotlivé osoby jsou vybaveny číslem pobočky a kódem, pomocí
kterého se mohou přihlásit na kterémkoliv pobočkovém telefonu, tato služba je odlišná od
LOCAL AND REMOTE CALL AGENTS tím, že číslo pobočky, pokud se zrovna nepoužívá,
neexistuje v Dialplan.
ROUTE BY CALLER ID, hovor je směrován na základě čísla volajícího na pobočku, do fronty
nebo do skupiny účastníků (Ring Group). SMS MESSAGING, Asterisk umožňuje pomocí
SMS upozorňovat např. zmeškaná volání a zanechané vzkazy, SMS se posílají přes SMS
bránu (může to být GSM modem lokálně připojený k Asterisku).
SPELL/SAY, funkce umožňuje přečíst text, např. email.
SUPERVISED TRANSFER, je předání volání řízené automatickým zařízením (např. Voice
Response Unit), které vyhodnotí výsledek předání – přijato, obsazeno, nevyzvednuto.
TALK DETECTION, funkce umí detekovat hovor (rozezná záznamník od osoby).
THREE-WAY CALLING, je konference tří účastníků, je možné ovšem dělat i konference o
několika desítkách účastníků (na Asterisku otestováno do 30-ti) s využitím konferenční
místnosti (Meet-Me).
TIME AND DATE, funkce čte čas a datum volajícímu.
TRANSCODING, Asterisk umožňuje konverzi mezi různými kodeky.
TRUNKING, je funkce připojení do klasické telefonní sítě pomocí interní karty v Asterisku.
VOICEMAIL, umožňuje nahrát vzkaz pro volaného, zpřístupnit nahrané vzkazy z
telefonu,přes web anebo odeslat vzkaz do poštovní schránky uživatele jako email.
98
4
Asterisk v praktických příkladech
Pro instalaci Asterisku využijeme samoinstalačních balíčků. Je potřeba být přihlášen pod
uživatelem s právy správce systému. Samotná instalace se provede:
# apt-get install asterisk
4.1
Nastavení SIP účtů
Veškerá konfigurace v oblasti SIP protokolu a registrace SIP účtů se provádí v souboru sip.conf
umístěném v hlavním adresáři systému Asterisk (/etc/asterisk/). V následující ukázce je znázorněna
základní SIP konfigurace, včetně vygenerování dvou účtů.
[general]
context=Asterisk1
;Default context pro příchozí volání
port=5060
;Použitý port pro SIP signalizaci
udpbindaddr=0.0.0.0 ;IP adresa pro navázání spojení (0.0.0.0 ;pro všechny IP adresy)
srvlookup=yes ;Povolení DNS SRV lookup pro odchozí ;volání
disallow=all
allow=alaw
allow=gsm
allow=ulaw
;Implicitní zakázání všech kodeků
;Povolení kodeku PCM A-law
;Povolení kodeku GSM
;Povolení kodeku PCM µ-law
[101] ;Definování účtu s číslem 101
type=friend
context=Asterisk1
;Vyjadřuje skupinu v dialplanu ;(/etc/asterisk/extensions.conf), kde ;hledat
v případě volání tohoto čísla
language=cz
host=dynamic ;Povolení registrace účtu na všech IP ;adresách
username=101
;Přihlašovací jméno při registraci účtu
secret=101
;Přihlašovací heslo při registraci účtu
callerid=101 <101>
[102]
type=friend
context=Asterisk1
language=cz
99
host=dynamic
username=102
secret=102
callerid=102 <102>
4.2
Nastavení IAX účtů
Definice IAX účtů používá téměř stejnou syntaxi, jako definice SIP účtů, s jediným rozdílem, že se
provádí v souboru iax.conf, opět umístěném v hlavním adresáři s aplikací.
[general]
bindport=4569
bindaddr=0.0.0.0
;Nastavení portu IAX signalizace
;Stejná funkcionalita jako udpbindaddr u ;SIP protokolu
disallow=all
allow=alaw
allow=ulaw
allow=gsm
jitterbuffer=no
forcejitterbuffer=no
[1001] ;Definice účtu s číslem 1001
type=friend
context=Asterisk1
language=cz
host=dynamic
username=1001
secret=1001
callerid=IAX1 <1001>
4.3
Dialplan a jeho nastavení
Veškeré nastavení číslovacího plánu se provádí v konfiguračním souboru extensions.conf. Jedná se
de-facto o základní soubor systému Asterisk a právě zde je definováno, jakým způsobem budou
ovládána jednotlivá volání. Následující ukázka zobrazuje příklad číslování pro námi výše definované
účty.
[general]
static=yes
writeprotect=no
;Zamezení přepisování dialplanu z CLI
[macro-hovor] ;Definování makra „hovor“, který nám ;usnadní vytváření dialplanu a vyhneme ;se tak
neustálému přepisování stejných ;příkazů
exten => s,1,Dial(${ARG1}) ;Začne výstavbu spojení za ;pomocí protokolu a na číslo ;uvedeného
v proměnné ARG1, ;která je do makra předána ;jako argument
exten => s,2,Congestion
;V případě nedostupnosti ;koncového terminálu ;poskytne signalizaci
;obsazení
exten => s,3,Hangup
;Ukončení hovoru
100
[Asterisk1]
;Context (skupina), která byla nastavena ;u SIP a IAX účtů
exten => _101,1,Macro(hovor,SIP/101)
;V případě volání ;čísla 101 se použije ;naše makro
„hovor“ ;s argumentem SIP/101, ;tedy je použita SIP ;signalizace a je ;volán účet definovaný
;v sip.conf jako [101]
exten => _102,1,Macro(hovor,SIP/102)
exten => _1001,1,Macro(hovor,IAX2/1001)
Nyní by již měla být zajištěna základní nastavení postačující pro registraci účtů např. na
některém ze SIP softwarových klientů a možnost zavoláním mezi těmito účastníky.
4.4
Další užitečná nastavení pro Asterisk
V dalších podkapitolách budou uvedeny příklady pro použití videa, propojování Asterisků a jejich
zabezpečení.
4.4.1
Rozšířené nastavení SIP – povolení videopřenosu
Pro zajištění přenosu videa je nutné toto nastavení povolit přidáním příkazu videosupport do
obecného nastavení ([general]) v souboru sip.conf a také povolit podporu kodeků sloužících pro
přenos videa, jako H.261, H.263, H.263+ nebo H.264 nebo jen některé z nich.
[general]
videosupport=yes
allow=h261
allow=h263
allow=h263p
allow=h264
4.4.2
Peering mezi dvěma Asterisky
Peering slouží k logickému propojení dvou ústředen stejného typu. V případě, že volám na číslo,
které se nenachází v mé databázi (není registrované na moji ústřednu a není definováno v sip.conf
nebo iax.conf), ale vím, že se nachází na ústředně sousední, mohu využít této funkce a vyvolat
patřičný extension z této ústředny sousední. Jako první ústřednu použijeme tu, kterou jsme si
vytvořili v prvních bodech, včetně nastavení SIP protokolu. U druhé budeme postupovat podobně,
akorát zvolíme jiná čísla účtů. Tedy nastavení sip.conf druhé ústředny:
[general]
context=Asterisk2
port=5060
udpbindaddr=0.0.0.0
srvlookup=yes
disallow=all
101
allow=alaw
allow=gsm
allow=ulaw
allow=h261
allow=h263
allow=h263p
allow=h264
[201]
type=friend
context=Asterisk2
language=cz
host=dynamic
username=201
secret=201
callerid=201 <201>
[202]
type=friend
context=Asterisk2
language=cz
host=dynamic
username=202
secret=202
callerid=202 <202>
Podobným způsobem, jako u první ústředny, také potřebujeme vytvořit (resp. upravit) soubor
extensions.conf, abychom zajistili základní spojení v rámci ústředny:
[general]
static=yes
writeprotect=no
[macro-hovor]
exten => s,1,Dial(${ARG1})
exten => s,2,Congestion
exten => s,3,Hangup
[Asterisk2]
exten => _201,1,Macro(hovor,SIP/201)
exten => _202,1,Macro(hovor,SIP/202)
Ke spojení ústředen bude využit protokol IAX. Nyní je potřeba na každé z ústředen vytvořit účet
ústředny sousední. Parametry tohoto účtu se definují opět v souboru iax.conf. Pro lepší představu je
použitá topologie, včetně o adresování ústředen uvedena na obrázku č. 34.
102
Obr. 34. Logická topologie zapojení
Do konfigurace souboru iax.conf první ústředny (Asterisk1) je tedy potřeba vytvořit účet pro
protější ústřednu (Asterisk2):
[Asterisk2]
;Definice účtu druhé ústředny (Asterisk2)
type=friend
username=Asterisk1
secret=peer
auth=plaintext ;Použité šifrování při autentizaci (také ;podpora MD5)
host=10.0.0.2 ;Přidělení pevné adresy, která bude účet ;využívat – předpokládá se, že PBX svoji ;IP
adresu nemění (nebo alespoň ne často)
context=IAXpeer
peercontext=IAXpeer
qualify=yes
trunk=yes
;Nastavení, že se nejedná o běžný účet, ;nýbrž o peer (trunk) na jinou ústřednu
Podobnou konfiguraci je také potřeba provést i u ústředny druhé (Asterisk2):
[Asterisk1]
type=friend
username=Asterisk2
secret=peer
auth=plaintext
host=10.0.0.1
context=IAXpeer
peercontext=IAXpeer
qualify=yes
trunk=yes
Nyní je ovšem také potřeba upravit číslovací plány na jednotlivých ústřednách, aby v případě
„neznámého“ čísla došlo k přeposlání žádosti k výstavbě spojení na ústřednu druhou. Tedy v případě
Asterisk1:
[general]
static=yes
writeprotect=no
103
[macro-hovor]
exten => s,1,Dial(${ARG1})
exten => s,2,Congestion
exten => s,3,Hangup
[Asterisk1]
exten => _101,1,Macro(hovor,SIP/101)
exten => _102,1,Macro(hovor,SIP/102)
exten => _201,1,Macro(hovor,IAX2/Asterisk2/${EXTEN}) ;Rozšíření ;našeho defaultního ;contextu,
v případě, ;že volám na čísla ;registrované na druhé ;ústředně, kde ;prostřednictvím našho ;IAX účtu
vyvolám ;patřičný EXTEN na ;ústředně Asterisk2
exten => _202,1,Macro(hovor,IAX2/Asterisk2/${EXTEN})
[IAXpeer]
;Vytvoření contextu pro příchozí volání ;z druhé ústředny
exten => _101,1,Macro(hovor,SIP/101)
exten => _102,1,Macro(hovor,SIP/102)
Samozřejmě podobnou úpravu je nutné také provést na straně ústředny Asterisk2:
[general]
static=yes
writeprotect=no
[macro-hovor]
exten => s,1,Dial(${ARG1})
exten => s,2,Congestion
exten => s,3,Hangup
[Asterisk2]
exten => _201,1,Macro(hovor,SIP/201)
exten => _202,1,Macro(hovor,SIP/202)
exten => _101,1,Macro(hovor,IAX2/Asterisk1/${EXTEN})
exten => _102,1,Macro(hovor,IAX2/Asterisk1/${EXTEN})
[IAXpeer]
exten => _201,1,Macro(hovor,SIP/201)
exten => _202,1,Macro(hovor,SIP/202)
4.4.3
Zabezpečení médií v Asterisku pomocí SRTP
Od verze 1.8 je obsaženo v základní distribuci a SRTP je možné využívat, v dřívějších verzích je
nutné doinstalovat zvlášť. V /etc/asterisk/sip.conf dodáme do konfigurace příslušných účtů povolení
srtpcapable=yes anebo můžeme dát přímo do sekce [general] a nastavení bude platit pro všechny.
[201]
type=friend
context=Asterisk2
language=cz
srtpcapable=yes
host=dynamic
*** atd ***
104
Dále upravíme dialplan v /etc/asterisk/extensions.conf tak, že nastavíme použití SRTP jak pro
příchozí, tak pro odchozí volání.
exten => 201,1,NoOp()
exten => 201,n,Set(_SIPSRTP=${SIPPEER(${EXTEN},srtpcapable)})
exten => 201,n,Set(_SIPSRTP_CRYPTO=enable)
exten => 201,n,Set(_SIP_SRTP_SDES=enable)
exten => 201,n,Answer()
*** atd ***
exten => _1XX,1,NoOp()
exten => _1XX,n,Set(_SIPSRTP=${SIPPEER(${EXTEN},srtpcapable)})
exten => _1XX,n,Set(_SIPSRTP_CRYPTO=enable)
exten => _1XX,n,Set(_SIP_SRTP_SDES=enable)
exten => _1XX,n,Dial(SIP/${EXTEN})
*** atd ***
4.4.4
Zabezpečení signalizace v Asterisku pomocí SIPS
K zabezpečení SIP protokolu využijeme open source SSL/TLS knihovny – openssl. V první řadě je
tedy potřeba ji nainstalovat, kde opět využijeme samoinstalačních balíčků:
root@Asterisk1:/# apt-get install openssl
Samotný postup lze rozdělit do několika kroků. V první řadě je potřeba si pomocí aplikace
openssl vygenerovat vlastní certifikační autoritu (CA). Začneme tedy vygenerováním 4096 bitového
klíče a vytvořením této CA. Tuto naši CA bude ve velkém množství případů potřeba nainstalovat na
naší pracovní stanici nebo telefonu.
root@Asterisk1:/etc/cert# openssl genrsa -des3 -out ca.key 4096
root@Asterisk1:/etc/cert# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Po vygenerování vlastní CA je potřeba vytvořit certifikát serveru a podepsat jej naší CA. Opět
začneme vygenerováním klíče, tentokrát však pouze 1024 bitového, pokračujeme vygenerováním
certifikátu a v poslední řadě jeho podpisem. Při generování certifikátu serveru je nutné zadat do
položky Common Name doménové jméno vašeho SIP serveru (Asterisku), popř. jeho IP adresu.
root@Asterisk1:/etc/cert# openssl genrsa -out key.pem 1024
root@Asterisk1:/etc/cert# openssl req -new -key key.pem -out asterisk.csr
root@Asterisk1:/etc/cert# openssl x509 -req -days 365 -in asterisk.csr -CA ca.crt -CAkey ca.key set_serial 01 -out asterisk.crt
Asterisk potřebuje ke správné funkcionalitě SIP zabezpečení mít, jak klíč (key.pem), tak samotný
certifikát serveru (asterisk.crt) v jednom souboru. Proto v kořenovém umístění aplikace Asterisk
vytvoříme adresář s názvem např. cert a v něm do souboru, který pojmenujeme, jako asterisk.pem
zkopírujeme náš klíč a certifikát serveru.
root@Asterisk1:/etc/asterisk# mkdir cert
105
root@Asterisk1:/etc/cert# cat key.pem > /etc/asterisk/cert/asterisk.pem
root@Asterisk1:/etc/cert# cat asterisk.crt >> /etc/asterisk/cert/asterisk.pem
Nyní na ústředně v konfiguračním souboru SIP protokolu (sip.conf) potřebujeme povolit TLS
šifrování a nastavit cestu k našemu souboru s klíčem a certifikátem serveru (asterisk.pem) a u
vytvořených účtů povolíme pouze šifrovaný přenos:
[global]
tlsenable=yes
tlsbindaddr=0.0.0.0
tlscertfile=/etc/asterisk/cert/asterisk.pem
[101]
transport=tls
[102]
transport=tls
106
5
Literatura
[cam]
Camp,K. IP Telephony Demistified, McGraw-Hill, 2003, New York, ISBN 0-07-140670-0.
[col]
Collins, D. Carrier Grade Voice Over IP. New York: McGraw-Hill, 2002. ISBN 00-714-0634-4.
[har]
W. Hardy.VoIP service quality, McGraw-Hill, 2003, New York, ISBN 0-07-141076-7.
[meg]
Meggelen, J. Asterisk The Future of Telephony, O REILLY, 2006, ISBN 0596009623.
[sin1]
H. Sinnreich. SIP Beyond VoIP. VON Publishing LLC, New York, 2005, ISBN: 0974813001.
[sin2]
H. Sinnreich.Internet Communications Using SIP, Wiley Computer Publishing, New York, 2001,
ISBN 0-471-41399-2 .
[voz70]
Voznak,M., Zukal,D. Assessment of VoIP Quality , p.641-645, 6th International Conference
RTT 2005, 12-14.9.2005, Hradec nad Moravici, FEI VSB-TUO, ISBN 80-248-0897-8.
[voz72]
Vozňák, M., Zukal, D., Wija,T. Asterisk a jeho použití, Technická zpráva 12/2005 , Cesnet
z.s.p.o., říjen 2005, URL: http://www.cesnet.cz/doc/techzpravy/
[voz73]
Vozňák, M., Zukal, D. Analýza VoIP aplikací Surveyor 7.0 Technická zpráva 13/2005 , Cesnet
z.s.p.o., listopad 2005, http://www.cesnet.cz/doc/techzpravy/
[voz90]
Vozňák, M.: Signalizace SIP, str. 35-75 ve sborníku Teorie a praxe IP telefonie, vyd. Sdělovací
[voz92]
Diviš, Z., Vozňák, M., Blunár, K., Vašinek, V., Mer, P., Šebesta, R.: Moderní Komunikační
[voz111]
Halas M., Kyrbashov B., Voznak M.: Factors influencing voice quality in VoIP technology, In:
technika, ČVUT a ProTel engineering, v Praze 8.11.2006
Technologie. VŠB-TUO. Ostrava. 2006. skripta 413 stran. ISBN 80-248-1111-1.
9th International Conference on Informatics‘ 2007, pp. 32-35, Bratislava, 21-22.June 2007,
ISBN 978-80-969243-7-0.
[voz120]
Nappa,A.-Bruschi,D.-Rozza,A.-Voznak,M. Analysis and implementation of secure and
unsecure Voice over IP environment and performance comparison using OpenSER. Technical
report, 84 pages, published at Universita degli studi di Milano, December, 2007.
[voz133]
Voznak,M.-Rozza,A.-Nappa,A.Performance comparision of secure and insecure VoIP
environments.TERENA Networking Conference 2008, TERENA, Brugge, Belgium, 19-22 May,
2008.
[voz138]
Voznak,M: Ipmact of openVPN on Speech Bandiwth. In proceedings TSP2008, 31th
International conference, 3-4.9 in Paradfurdo, Hungary. Publisher: Asszisztencia Szervező Kft.
Budapest, ISBN 978-963-06-5487-6.
[voz142]
Vozňák,M.Voice over IP. Vysokoškolská skripta, 176 stran. Vydavatel: VŠB-TU Ostrava, 1.
vydání, v Ostravě, září 2008, ISBN 978-80-248-1828-3.
[voz146]
Nappa,A.,Voznak,M.Scapy: the definitive tool to manage and troubleshoot your
network.Publisher: Piscopo Editore Srl.,Italy. In Magazine Linux&C, p.51-58, No.66 , issued in
November 2008, ISSN 1129-2296.
107
[voz159]
Voznak,M.,Rezac,F. The implementation of SPAM over Internet telephony and a defence
against this attack. Publisher: Asszisztencia Szervező Kft. Budapest, 32nd International
Conference TSP , August 26th-27th 2009, Dunakiliti, Hungary, ISBN 978-963-06-7716-5.
[voz166]
Voznak,M.,Rezac,F., Halás,M. Speech Quality Evaluation in IPsec Environment, p. 49-53, In
Proceedings of the 12th Inter. Conference on Networking, VLSI and Signal Processing - ICNVS
2010, University of Cambridge, ISBN 978-960-474-162- 5, ISSN 1790-5117, Cambridge,
February 20-22,2010.
[voz174]
Voznak,M.,Rezac,F. Zdralek,J. Danger Alert Communication System, The 17th International
Conference IWSSIP 2010 , p.231-234, June 17-19, 2010, Rio de Janeiro, Brazil, ISBN 978-85228-0565-5.
[voz180]
Voznak,M.,Rezac,F., Tomala, K. SIP Penetration Test System, In Conference Proceedings
TSP 2010 ,p.504-508, August 17th-20th 2010, Baden near Vienna, Austria, ISBN 978-96388981-0-4.
[voz188]
Voznak,M.,Rozhon,J. SIP Back to Back User Benchmarking, Proceedings The Sixth
International Conference on Wireless and Mobile Communications ICWMC 2010, pp. 92-96,
Published by IEEE Computer Society, September 20-25, 2010, University of Valencia ,
Valencia, Spain, ISBN 978-0-7695-4182-2.
[voz191]
Voznak,M.,Rozhon, J. Methodology for SIP Infrastructure Performance Testing , WSEAS
TRANSACTIONS on COMPUTERS, Issue 11, Volume 9, pp. 1012-1021, September 2010,
ISSN: 1109-2750.
[voz193]
Voznak,M.,Rezac, F. Threats Detection System, Advances in Data Networks, Communications,
Computers, pp. 125-130, University of Algarve, Faro, Portugal, November 2010,ISBN 978-960474-245-5, ISSN 1792-6157.
[voz194]
Voznak,M.,Tomes, M., Vaclavikova, Z., Halas,M. E-model Improvement for Speech Quality
Evaluation Including Codecs Tandeming, Advances in Data Networks, Communications,
Computers, pp. 119-124, University of Algarve, Faro, Portugal, November 2010,ISBN 978-960474-245-5, ISSN 1792-6157.
[zph]
Web Zphone project, online:http://zfoneproject.com/zrtp_ietf.html
108
6
Rejstřík
AES (Advanced Encryption Standard) - Metoda šifrování dat.
AH (Authentication Header Protocol) – Protokol využívaný v IPsec.
ARP (Address Resolution Protocol) – Protokol pro mapování MAC adres na IP adresy.
DES (Data Encryption Standard) - Metoda šifrování dat.
DHCP (Dynamic Host Control Protocol) – Protokol pro dynamické přidělování IP adres.
DNS (Domain Name Service) - Doménový systém jmen.
DdoS (Distributed Denial of Service) – Distribuované odmítnutí služby.
DoS (Denial of Service) - Odmítnutí služby.
ENUM (E.164 Number Mapping) – Mapování E.164 čísel na URI adresy.
ESP (Encapsulating Security Payload Protocol) – Protokol využívaný v IPsec.
GPL (GNU General Public Licence)- Všeobecná veřejná licence GNU.
H.225 - Protokol pro signalizaci volání a sestavení komunikace pro H.323.
H.235 - Protokol pro definici bezpečnostních profilů pro H.323.
H.245 - Protokol k řízení multimediálního přenosu pro H.323.
H.323 - Signalizační protokol používaný ve VoIP.
HTTP (Hypertext Transfer Protocol) - Internetový protokol používaný pro přenos informací.
HTTPS (Hypertext Transfer Protocol Security) – Zabezpečený Internetový protokol používaný pro přenos informací.
IPsec. (IP security) - bezpečnostní rozšíření IP protokolu.
ISDN (Integrated Services Digital Network) – Digitální síť integrovaných služeb.
ITU (International Telecommunications Union) – Mezinárodní telekomunikační unie
109
MD5 (Message-Digest algorithm 5) - Hashovací funkce
NAT (Network Address Translation) - Překlad síťových adres.
PBX (Private Branch eXchange)- Pobočková telefonní ústředna.
PSTN (Public Switched Telephone Network) - Veřejná telefonní síť.
RTP (Real-time Transport Protocol) - Protokol přenosu v reálném čase.
RTCP (RTP Control Protocol) - Řídící protokol pro RTP.
S/MIME (Secure / Multipurpose Internet Mail Extensions) - Bezpečnostní rozšíření pro odesílání e-maiových zpráv.
SAML (Security Assertion Markup Language) - Systém pro výměnu bezpečnostních informací.
SDP (Session Description Protocol) - Protokol k řízení multimediálního přenosu pro SIP.
SHA1 (Secure Hash Algorithm 1) - Hashovací funkce.
SIP (Session Initiation Protocol) - Signalizační protokol používaný ve VoIP.
SPIT (Spam over Internet Telephony) - Označení pro spam ve VoIP.
SRTP (Secure RTP) - Zabezpečený protokol přenosu v reálném čase.
SRTCP (Secure RTCP) - Zabezpečený řídící protokol pro RTP.
TLS (Transport Layer Security) - Protokol poskytující zabezpečenou komunikaci .
TTS (Text to Speech) – Technologie pro přenos textu na hlas.
UA (User Agent)- Koncové zařízení v SIP infrastruktuře.
UAC (User Agent Client) - Koncové zařízení v SIP infrastruktuře na straně klienta.
UAS (User Agent Server- Koncové zařízení v SIP infrastruktuře na straně server.
UDP (Unified Datagram Protocol) – datagramový protokol používaný pro přenos v IP sítích.
URI (Uniform Resource Identifier)- Řetězec znaků pro identifikování či pojmenování zdroje.
VLAN (Virtual Local Area Network) – Virtuální lokální síť.
VoGW (Voice GateWay) – Hlasová brána.
VoIP (Voice over Internet Protocol) - Technologie pro přenos digitalizovaného hlasu pomocí paketů v počítačové síti.
VPN (Virtual Private Network) – Virtuální privátní síť, propojení důvěryhodných sítí skrze nedůvěryhodnou.
ZRTP (Zimmermann RTP) - Nástavbový protokol pro SRTP.
110