![OpenSips構(gòu)建電話通信系統(tǒng)資料_第1頁](http://file4.renrendoc.com/view/025e2da50088e34ab1ddc5e5912f41e6/025e2da50088e34ab1ddc5e5912f41e61.gif)
![OpenSips構(gòu)建電話通信系統(tǒng)資料_第2頁](http://file4.renrendoc.com/view/025e2da50088e34ab1ddc5e5912f41e6/025e2da50088e34ab1ddc5e5912f41e62.gif)
![OpenSips構(gòu)建電話通信系統(tǒng)資料_第3頁](http://file4.renrendoc.com/view/025e2da50088e34ab1ddc5e5912f41e6/025e2da50088e34ab1ddc5e5912f41e63.gif)
![OpenSips構(gòu)建電話通信系統(tǒng)資料_第4頁](http://file4.renrendoc.com/view/025e2da50088e34ab1ddc5e5912f41e6/025e2da50088e34ab1ddc5e5912f41e64.gif)
![OpenSips構(gòu)建電話通信系統(tǒng)資料_第5頁](http://file4.renrendoc.com/view/025e2da50088e34ab1ddc5e5912f41e6/025e2da50088e34ab1ddc5e5912f41e65.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
目錄TOC\o"1-1"\h\z\u使用OpenSER構(gòu)建電話通信系統(tǒng) 1第一章:SIP介紹(IntroductiontoSIP) 1第二章:SIP快速路由器(TheSIPExpressRouter) 28第三章:OpenSER安裝(OpenSERInstallation) 42第四章:OpenSER標(biāo)準(zhǔn)配置(OpenSERStandardConfiguration) 58第五章:用MySQL添加認(rèn)證(AddingAuthenticationwithMySQL) 85第六章:使用SerMyAdmin構(gòu)建用戶入口 121第七章:與PSTN的連通(ConnectivitytothePSTN) 138第八章:通話前轉(zhuǎn)和語音郵件(callforwardandvoicemail) 177使用OpenSER構(gòu)建電話通信系統(tǒng)BuildingTelephonySystemswithOpenSER第一章:SIP介紹(IntroductiontoSIP)會話初始化協(xié)議是互聯(lián)網(wǎng)工程任務(wù)組(IETF)制定的協(xié)議標(biāo)準(zhǔn),在多個RFC(RequestforComments)文檔中被進(jìn)行了描述說明。RFC3261是最近的一個RFC,一般稱它為SIP版本2。SIP是一個應(yīng)用層的協(xié)議,用來建立,修改,終止會話(sessions)或是多媒體通話(multimediacalls)。這些會話可以會議(conferences),e-learning,網(wǎng)絡(luò)電話和一些相似的應(yīng)用。它是同HTTP協(xié)議相類似的文本協(xié)議并且被設(shè)計(jì)用來發(fā)起,保持,關(guān)閉用戶之間的交互會話。目前SIP已經(jīng)是VoIP領(lǐng)域被廣泛使用的協(xié)議之一了,市場上幾乎每一臺IP電話都會支持它。本章結(jié)束的時候你將能夠:
描述SIP是什么
描述SIP是干什么的
描述SIP的框架
解釋SIP主要部件的意義
理解并比較主要SIP消息
描述INVITE和REGISTER請求消息頭部的處理過程
在建立和關(guān)閉多媒體通話的過程中,SIP協(xié)議支持五種要素。
用戶定位(Userlocation)
用戶參數(shù)協(xié)商(Userparametersnegotiation)
用戶可用性(Useravailability)
通話建立(Callestablishment)
通話管理(Callmanagement)
SIP協(xié)議被設(shè)計(jì)成多媒體框架的一部分,而這種多媒體框架包括RVSP,RTP,RTSP還有SDP等其他協(xié)議。然而,SIP卻并不依靠其他這些協(xié)議工作。
SIP基礎(chǔ)(SIPBasics)SIP在工作的方式上與HTTP協(xié)議相類似。SIP的地址像是e-mail的地址。SIP代理中使用的一個比較有趣的特性就是“別名(alias)”,也就是說你可以有多個SIP地址,譬如:
johndoe@sipA.com
+554845678901@sipA.com
45678901@sipA.com在SIP的體系結(jié)構(gòu)中,有多個用戶代理和提供不同服務(wù)的服務(wù)器。SIP使用點(diǎn)對點(diǎn)(peer-to-peer)的分布模型來和服務(wù)器進(jìn)行消息的交互。服務(wù)器只進(jìn)行消息(signaling)的處理,而用戶代理的客戶端和服務(wù)端既可以處理消息也可以處理媒體。下面的圖描述了這樣的一個體系:在SIP模型中,用戶代理,通常是一臺SIP話機(jī)與它的SIP代理進(jìn)行交互,從上圖可以看到,外呼代理(outgoingproxy)將使用INVITE消息向外發(fā)出通話請求。外呼代理將觀察這通通話是否是被定向到外部的域名。然后它將向DNS服務(wù)器發(fā)出請求將目標(biāo)域名解析為對應(yīng)的IP地址。然后再將通話請求發(fā)送給DomainB對應(yīng)的SIP代理。呼入代理(incomingproxy)將在地址列表(locationtable)中查詢agentB的IP地址。如果在地址列表這個地址與之前在注冊過程中的IP地址對應(yīng),那么呼入代理就可以定位這個地址了?,F(xiàn)在就可以使用這個地址將通話請求發(fā)送到agentB了。agentB收到這個SIP消息后(INVITE),就擁有了可以與agentA建立RTP會話(通常是音頻方面的會話)所需要的信息。使用BYE消息可以終止這個會話。SIP代理在VoIP提供者里的作用/上下文(SIPProxyintheContextofaVoIPProvider)通常VoIP服務(wù)的提供者們并不會實(shí)現(xiàn)像上幅圖那樣的純粹的SIP四邊形結(jié)構(gòu),他們不會允許你向一個外部的域名發(fā)送通話請求,因?yàn)槿绻@樣,那么將影響他們的收入(revenuestream)。取而代之的是一個接近三角形的SIP網(wǎng)絡(luò)結(jié)構(gòu)。(如下圖所示)SIP工作原理(SIPOperationTheory)在上圖中,你可以看到SIP體系結(jié)構(gòu)中的主要的構(gòu)成部件。所有的SIP消息都會經(jīng)過SIP代理服務(wù)器。另一方面,由RTP協(xié)議承載的媒體流則是從一端直接流向另一端。我們將在下面的列表中簡要的對其中的一些構(gòu)成部件進(jìn)行解釋。
用戶代理客戶端(UACuseragentclient)——發(fā)起SIP消息的客戶端或終端
用戶代理服務(wù)端(UASuseragentserver)——對接收到的從用戶代理客戶端發(fā)起的SIP消息進(jìn)行相應(yīng)的服務(wù)端。
用戶代理(UAuseragent)——SIP終端(IP電話,電話適配器(ATA),軟電話(softphone))
代理服務(wù)器(ProxyServer)——從用戶代理接收請求,并且如果指定的被請求的終端不在其域中時,會將請求發(fā)送給另外的SIP代理。
重定向服務(wù)器(RedirectServer)——接收請求,但是不直接發(fā)送給被叫用戶,而是向主叫方發(fā)送目的地址的信息。
定位服務(wù)器(LocationServer)——向代理服務(wù)器和重定向服務(wù)器提供被叫者的聯(lián)系地址。通常,物理上,代理服務(wù)器,重定向服務(wù)器和定位服務(wù)器存在于同一臺電腦和軟件中。SIP注冊過程(SIPRegistrationProcess)SIP協(xié)議中使用了一個構(gòu)件叫做注冊服務(wù)器。它不僅能夠接收REGISTER消息請求,還能夠?qū)⑹盏降南械男畔⒈4娴焦芾韺?yīng)域名的定位服務(wù)器上面。SIP協(xié)議具有發(fā)現(xiàn)能力;換句話說,就是如果一個用戶要與另外一個用戶開始會話,那么SIP協(xié)議必須要發(fā)現(xiàn)這個用戶能夠到達(dá)的主機(jī)存在。由于定位服務(wù)器可以收到請求消息并找到向什么地方發(fā)送,所以這個發(fā)現(xiàn)過程由定位服務(wù)器來完成。而這則是基于管理每個域的定位服務(wù)器維護(hù)著一個定位數(shù)據(jù)庫的事實(shí)來實(shí)現(xiàn)的。注冊服務(wù)器不僅可以接收客戶端的IP地址,還能夠接收其他類型的消息。比如,能夠收到服務(wù)器上面的CPL(CallProcessingLanguage)腳本。在一臺話機(jī)能夠接收一通通話之前,它需要在定位數(shù)據(jù)庫中有注冊信息。在這個數(shù)據(jù)庫中我們要擁有所有電話的各自的相關(guān)的IP地址。在我們的例子中,你將看到SIP用戶8590@.br注冊到上面的過程。RFC3665定義實(shí)現(xiàn)了一個最小的功能集合,這是使得SIP進(jìn)行IP網(wǎng)絡(luò)交互時的最好實(shí)踐。下面的圖就是根據(jù)RFC3665中的描述所畫出的注冊事務(wù)處理流程。按照rfc3665中所說,與注冊一個用戶代理的過程相關(guān)的有五個基本的流程,如下所述:一個新的成功的注冊(Asuccessfulnewregistration)——用戶代理在發(fā)送Register請求后,將收到認(rèn)證過程的挑戰(zhàn)。我們將在闡述驗(yàn)證過程的章節(jié)中看到這個過程的細(xì)節(jié)。聯(lián)系列表的更新(Anupdateofthecontactlist)——由于不再是新的注冊,消息中已經(jīng)包含了摘要(digest),那么不會返回401消息。為了改變聯(lián)系列表,用戶代理僅僅需要發(fā)送一條在CONTACT頭中帶有新的聯(lián)系信息的注冊信息即可。請求獲得當(dāng)前的聯(lián)系列表——在這種情況下,用戶代理將把發(fā)送消息中的CONTACT頭置空,表明用戶希望向服務(wù)器詢問當(dāng)前的聯(lián)系列表。在回復(fù)的200OK消息中,SIP服務(wù)器將把當(dāng)前的聯(lián)系列表放在其CONTACT的頭中。取消注冊(Cancellationofaregistration)——用戶代理在發(fā)送的消息中將EXPIRES頭置成0,并且將CONTACT頭設(shè)置為“*”表示將此過程應(yīng)用到所有存在的聯(lián)系信息。不成功的注冊(UnsuccessfulRegistration)——用戶代理客戶端(UAC)發(fā)送一條Register請求消息,收到一條“401Unauthorized”消息,事實(shí)上,這個過程同成功注冊過程相同。但是接下來,它進(jìn)行哈希運(yùn)算嘗試進(jìn)行認(rèn)證。而服務(wù)器檢測到的是一個無效的密碼,繼續(xù)發(fā)送“401Unauthorized”消息。這個過程一直重復(fù)直到重復(fù)次數(shù)超過在UAC設(shè)置的最大值。
作為SIP代理運(yùn)轉(zhuǎn)的服務(wù)器(ServerOperatingasaSIPProxy)在SIP代理模式下,所有的IP消息都要經(jīng)過SIP代理。這種行為在向諸如計(jì)費(fèi)(billing)的過程中幫助很大,而且迄今為止,這也是一種最普遍的選擇。但是它的缺點(diǎn)就是在會話建立過程中的所有的SIP交互中,服務(wù)器造成的額外開銷也是客觀的。要記住的是,即使服務(wù)器作為SIP代理在工作時,RTP包也總是直接從一端傳送到另一端,而不會經(jīng)過服務(wù)器。作為SIP重定向運(yùn)轉(zhuǎn)的服務(wù)器(ServerOperatingasaSIPRedirect)SIP代理可以運(yùn)行在SIP重定向模式。在這種模式下,SIP服務(wù)器的處理量是相當(dāng)巨大的,因?yàn)樗恍枰3质聞?wù)處理的狀態(tài)。在對INVITE消息進(jìn)行初始化后,僅僅向UAC回復(fù)一條“302MovedTemporarily”消息就可以離開SIP對話(dialog)了。在這種模式下的SIP代理,即使只是利用非常少的資源也可以每小時傳送上百萬的通話。當(dāng)你需要的規(guī)模很大并且不需要對通話計(jì)費(fèi)的情況下,這種模式通常會被使用?;鞠ⅲ˙asicMessages)在SIP環(huán)境中會被發(fā)送的基本的消息有:大多數(shù)時間內(nèi),你會使用到REGISTER,INVITE,BYE還有CANCEL。而另外一些消息會被用在其他的特性當(dāng)中。舉例來說,INFO被用在DTMFrelay和通話中消息信息(mid-callsignalinginformation)。PUBLISH,NOTIFY和SUBSCRIBE則用來支持列席系統(tǒng)(presencesystems)。REFER用來進(jìn)行通話轉(zhuǎn)接(calltransfer)而MESSAGE則應(yīng)用于一些聊天應(yīng)用程序中。更新的消息也會隨著協(xié)議標(biāo)準(zhǔn)化進(jìn)程而隨之出現(xiàn)。像HTTP協(xié)議一樣,這些消息的響應(yīng)也會以文本形式出現(xiàn)。其中一些最終的響應(yīng)消息被列在下圖當(dāng)中:SIP對話流程(SIPDialogFlow)這一節(jié)將通過一個簡單的例子來介紹一些基本的SIP操作。先讓我們來診視下圖展示的兩個用戶代理之間的消息順序。你可以看到伴隨這RFC3665描述的會話建立過程還有幾個其它的流程。我們在這些消息上標(biāo)上了序號。在這個例子中用戶A使用IP電話向網(wǎng)絡(luò)上的另外一臺IP電話發(fā)出通話請求。為了完成通話,使用了兩個SIP代理。用戶A使用稱為SIPURI的SIP標(biāo)識向用戶發(fā)出通話。URI就像是一個電子郵件地址,比如sip:userA@。一種可靠安全的SIPURI也可以被使用,譬如sips:userA@。使用SIPS建立的通話將會在主叫和被叫之間使用安全可靠的傳輸機(jī)制(TLS-TransportLayerSecurity)事務(wù)(transaction)的建立始于用戶A向用戶B發(fā)送INVITE請求消息。INVITE請求中包含一些特定頭域。這些頭域被稱之為屬性,為消息提供了額外的一些信息。包括唯一的標(biāo)識,目的地,還有關(guān)于會話(session)的信息。第一行是消息的方法名(themethodname)。接下來是列出的頭域。這個例子包含了所需要的頭的最小集合。我們將在下面簡要的描述這些頭域。
VIA:它包含了用戶A等待發(fā)出請求對應(yīng)響應(yīng)的所在地址。還包含了一個叫做“branch”的參數(shù),這個參數(shù)用來唯一的標(biāo)識這個事務(wù)(transaction)。VIA頭將最近從“SIP跳”(SIPhop)定義為IP,傳輸,和指定事務(wù)參數(shù)(TheVIAheaderdefinesthelastSIPhopasIP,transport,andtransaction-specificparameters)。VIA專門用來路由響應(yīng)消息。請求經(jīng)過的每一個代理都會增加一個VIA頭。而對于響應(yīng)消息而言,相對于再次向定位服務(wù)器或是DNS服務(wù)器進(jìn)行定位請求,使用VIA頭進(jìn)行路由將更加容易。
TO
:它包含了名字(顯示名(displayname))和最初選擇的目的地的SIPURI(這里是sip:userB@)。TO頭域不被用來路由消息包。
FROM:它包含了名字和表明主叫ID(callerID)的SIPURI(這里是sip:userA@)。這個頭域有一個tag參數(shù),而這個參數(shù)包含了被IP電話添加進(jìn)URI的一個隨機(jī)字符串。是被用來進(jìn)行辨識唯一性的。tag參數(shù)被用在TO和FROM頭域中。作為一種普遍的機(jī)制用來標(biāo)識對話(dialog),對話是CALL-ID和兩個tag的結(jié)合,而這兩個tag分別來自參與對話的雙方。Tags在并行派生(parallelforking)中作用顯著。
CALL
-ID:它包含了一個作為這通通話全局性的唯一的標(biāo)識,而這個唯一標(biāo)識是有一個隨機(jī)字符串,來自IP電話的主機(jī)名或是IP地址結(jié)合而成的。TO,F(xiàn)ROM的tag和CALL-ID的結(jié)合完整的定義了一個端到端的SIP關(guān)系,這種關(guān)系就是我們所知道的SIP對話(SIPdialog)
CSEQ:CSEQ或者稱之為命令序列(commandsequence)包含了一個整數(shù)和一個方法名。CSEQ數(shù)對于每一個在SIP對話中的新請求都會遞增,是一個傳統(tǒng)的序列數(shù)。
CONTACT:它包含一個代表直接路由可以聯(lián)系到用戶A的SIPURI,通常是有一個用戶名和FQDN(fullyqualifieddomainname)。有時候域名沒有被注冊,所以,IP地址也是允許使用的。VIA頭告訴其他的組件向什么地方發(fā)送響應(yīng)消息,而CONTACT則告訴其他組件向什么地方發(fā)送將來的請求消息。
MAX-FORWARDS:它被用來限制請求在到達(dá)最終目的地的路徑中被允許的最大跳數(shù)(hops)。由一個整數(shù)構(gòu)成,而這個整數(shù)在每一跳中將會遞減。
CONTENT-TYPE:它包含了對內(nèi)容消息的描述。
CONTENT-LENGTH:它用來告知內(nèi)容消息的字節(jié)數(shù)。會話的一些細(xì)節(jié),像媒體類型和編碼方式并不是使用SIP進(jìn)行描述的。而是使用叫做會話描述協(xié)議(SDPRFC2327)來進(jìn)行描述。SDP消息由SIP消息承載,就像是一封電子郵件的附件一樣。
過程如下:
話機(jī)開始并不知道用戶B和負(fù)責(zé)域B的服務(wù)器的位置。因此,它向負(fù)責(zé)sipA域的服務(wù)器發(fā)送INVITE消息請求。發(fā)送地址在用戶A的話機(jī)中進(jìn)行設(shè)置或通過DHCP發(fā)現(xiàn)。服務(wù)器sipA.com也就是我們知道的域sipA.com的SIP代理服務(wù)器。
1.在這個例子中,代理服務(wù)器收到INVITE請求消息并發(fā)送“100trying”響應(yīng)消息給用戶A,表明代理服務(wù)器已經(jīng)收到了INVITE消息并正在轉(zhuǎn)發(fā)這個請求。SIP的響應(yīng)消息使用一個三個數(shù)字組成的數(shù)字碼和一條描述語句說明響應(yīng)的類型。并擁有和INVITE請求一樣的TO,F(xiàn)ROM,CALL-ID和CSEQ等頭域,以及VIA和其“branch”參數(shù)。這就使得用戶A的話機(jī)同發(fā)出的INVITE請求聯(lián)系在一起。
2.代理A定位代理B的方法是向DNS服務(wù)器(SRV記錄)進(jìn)行查詢以找到負(fù)責(zé)sipB的SIP域的服務(wù)器地址并將INVITE請求轉(zhuǎn)發(fā)給它。在向代理B(譯者注:這里作者寫的是proxyA,但是應(yīng)該是B)發(fā)送INVITE消息前,代理A將其自己的地址通過VIA頭添加進(jìn)INVITE,這就使得用戶A的話機(jī)同INVITE請求的響應(yīng)消息聯(lián)系在了一起。
3.代理B收到INVITE請求,返回“100Trying”消息響應(yīng),表明其正在處理這個請求。
4.代理B查詢自己的位置數(shù)據(jù)庫以找到用戶B的地址,然后將自己的地址也通過VIA頭域添加進(jìn)INVITE消息發(fā)送給用戶B的IP地址。
5.用戶B的話機(jī)收到INVITE消息后開始振鈴。話機(jī)為了要表明這種情況(振鈴),發(fā)送回“180Ringing”響應(yīng)消息。
6.這個消息以相反的方向路由通過那兩個代理服務(wù)器。每一個代理利用VIA頭域來決定向哪里發(fā)送響應(yīng)消息并從頂部將其自己的VIA頭去除。結(jié)果就是,180Ringing消息不需要任何的DNS查詢,不需要定位服務(wù)的響應(yīng),也不需要任何的狀態(tài)處理就能夠返回到用戶那里。這樣的話,每一個代理服務(wù)器都能夠看到由INVITE開始的所有消息。
7.當(dāng)用戶A的話機(jī)收到“180Ringing”響應(yīng)消息后開始“回鈴”,表明另一端的用戶正在振鈴。一些話機(jī)是通過顯示一些信息進(jìn)行表示的。
8.在這個例子中,用戶B對對方發(fā)起的通話進(jìn)行了響應(yīng)。當(dāng)用戶B響應(yīng)時,話機(jī)發(fā)送”200Ok“響應(yīng)消息以表明通話被接起?!?00Ok”的消息體中包含了會話的描述信息,這些信息包括指定了編碼方式,端口號,以及從屬于會話的所有事情。作這項(xiàng)工作的就是SDP協(xié)議。結(jié)果就是,在從A到B(INVITE)和從B到A(200OK)的兩個階段,雙方交換了一些信息,以一種簡單的“請求/響應(yīng)”的模式協(xié)商了在這通通話中所需的資源和所需要的能力要求。如果用戶B不想得到這通通話或是此刻處于忙線中,200Ok將不會發(fā)出,取代它的是描述這種狀況(這里是486BusyHere)的消息。第一行是響應(yīng)碼和描述信息(OK)。接下來是頭域行。VIA,TO,F(xiàn)ROM,CALL-ID和CSEQ是從INVITE請求中拷貝的。有三個VIA頭,一個是用戶A添加的,另一個是代理A添加的,最后一個則是代理B添加的。用戶B的SIP話機(jī)在對話的雙方加入了一個TAG參數(shù),這個參數(shù)在這通通話的以后的請求和響應(yīng)消息中都將出現(xiàn)。CONTACT頭域中包含了URI信息,這個URI信息是用戶B能夠直接被聯(lián)系到他們自己的IP話機(jī)的地址。CONTENT-TYPE和CONTENT-LENGTH頭域先給出了關(guān)于SDP頭的一些信息。而SDP頭則包含了用來建立RTP會話的媒體相關(guān)的參數(shù)。1.在這個例子中,“200Ok”消息通過兩個代理服務(wù)器被送回給用戶A,之后用華A的話機(jī)停止“回鈴”表明通話被接起。
2.最后用戶A向用戶B的話機(jī)發(fā)送ACK消息確認(rèn)收到了“200Ok”消息。在這里,ACK避開了兩個代理服務(wù)器直接發(fā)送給用戶B。ACK是SIP中唯一不需要進(jìn)行響應(yīng)的消息請求。兩端在INVITE的過程中從CONTACT消息中了解雙方的地址信息。也結(jié)束了INVITE/200OK/ACK的過程,這個過程也就是我們所熟知的SIP三次握手。
3.這個時候兩個用戶之間開始進(jìn)行會話,他們以用SDP協(xié)議協(xié)商好的方式來發(fā)送媒體包。通常這些包是端對端進(jìn)行傳送的。在會話中,通話方可以通過發(fā)送一個新的INVITE請求來改變會話的一些特性。這叫做re-invite。如果re-invite不被接受,那么“488NotAcceptableHere”響應(yīng)就會被發(fā)出,但是會話不會因此而失敗。
4.要結(jié)束會話的時候,用戶B產(chǎn)生BYE消息來中斷通話。這個消息繞過兩個代理服務(wù)器直接路由回用戶A的軟電話上。
5.用戶A發(fā)出“200OK”響應(yīng)消息以確認(rèn)收到了BYE消息請求,從而結(jié)束會話。這里,不會發(fā)出ACK。ACK只在INVITE請求過程中出現(xiàn)。
有些情況下,在整個會話過程中,對于代理服務(wù)器來說,能夠待在消息傳輸?shù)闹虚g位置來觀察兩端的所有消息交互是很重要的。如果代理服務(wù)器想在INVITE請求初始化完成后還待在此路徑中,可以在請求消息中添加RECORD-ROUTE頭。用戶B的話機(jī)得到了這個消息,之后在其消息中也會帶有這個頭,并且會將消息發(fā)送回代理。記錄路由(RecordRouting)在大多數(shù)的方案中都會被使用。
REGISTER請求是代理B用來定位用戶B的方法。當(dāng)話機(jī)初始化的時候或是在通常的時間間隔中,軟電話B向在域sipB中的一個服務(wù)器(SIPREGISTRAR)發(fā)送REGISTER請求。注冊服務(wù)器(REGISTER)將URI與一個IP地址聯(lián)系在一起,這種綁定被存儲在定位服務(wù)器上面的數(shù)據(jù)庫里。通常,注冊服務(wù)器,定位服務(wù)器,和代理服務(wù)器在同一臺物理機(jī)器上,并使用相同的軟件。OpenSER就能夠扮演這三種角色。一個URI只能夠在一個特定的時間內(nèi)由一個單獨(dú)的機(jī)器注冊。
SIP事務(wù)和對話(SIPTransactionsandDialogs)理解“事務(wù)”(transaction)和“對話”(dialog)的區(qū)別是非常重要的。事務(wù)發(fā)生在一個用戶代理客戶端和另一個用戶代理服務(wù)端之間,包含從第一請求到最后一個響應(yīng)的所有消息。中間的階段性的響應(yīng)消息可以是以1開頭的三位數(shù)字碼(比如180Ringing),最終的響應(yīng)消息則是以2開頭的三位數(shù)字碼(比如200OK)。事務(wù)包括的范圍由SIP消息中VIA頭形成“堆?!眮頉Q定。因此,用戶代理在初始化invite后才不需要依靠DNS或位置表進(jìn)行消息路由。對話(Dialog)通常是從INVITE事務(wù)開始,由BYE事務(wù)結(jié)束。一個對話由CALL-ID頭唯一標(biāo)識。TOtag,F(xiàn)ROMtag和CALL-ID的結(jié)合來完整的定義。按照rfc3665的描述,有11個基本的會話建立流程。其列出的并不一定是完整的,但是覆蓋了最好的例子。前兩個流程在這一章節(jié)中進(jìn)行了闡述——“成功建立會話SuccessfulSessionEstablishment”和“通過兩個代理建立會話SessionEstablishmentThroughTwoProxies”。其中的一些流程的描述你將在其他闡述呼叫前傳(callforwarding)(譬如:“不接聽導(dǎo)致沒能成功建立UnsuccessfulwithnoAnswer”和“忙音導(dǎo)致建立失敗UnsuccessfulBusy”)的章節(jié)中看到。
RTP協(xié)議(TheRTPProtocol)譯者注:應(yīng)為RealTimeTransportProtocol實(shí)時傳輸協(xié)議是負(fù)責(zé)諸如音頻和視頻等數(shù)據(jù)的實(shí)時傳輸?shù)?。它?biāo)準(zhǔn)化于RFC3550。使用UDP協(xié)議進(jìn)行傳輸承載。為了能夠被實(shí)時傳輸,音頻或視頻必須經(jīng)過一定的編碼打包。最基本的,該協(xié)議允許使用如下的一些特性對進(jìn)出的數(shù)據(jù)包的媒體傳輸?shù)臅r間和內(nèi)容要求進(jìn)行指定:
序號
時間戳
無重傳機(jī)制的包的前轉(zhuǎn)
源識別
內(nèi)容識別
同步與RTP相伴的協(xié)議叫做RTCP(RealTimeControlProtocol),被用作對RTP包進(jìn)行監(jiān)控。它可以度量延遲和抖動。
編碼(Codecs)RTP協(xié)議描述的內(nèi)容通常會由一種編碼方式進(jìn)行編碼。沒一種編碼方式都有一種指定的用途。一些有壓縮算法而另外一些則不需要。比較普遍的是使用不需要壓縮的G.711編碼方式。一個信道64Kbps的帶寬要求需要一個高速的網(wǎng)絡(luò),通常在局域網(wǎng)(LANs)中比較常見。但是在廣域網(wǎng)(WAN)中對于一個單獨(dú)的聲音信道來說,64Kbps的帶寬購買起來比較昂貴。這時候諸如G.729和GSM等可以將聲音包壓縮至8Kbps的編碼方法則可以節(jié)省很多的帶寬。由GlobalIPsound公司發(fā)明的iLBC編碼方式則可以掩蓋網(wǎng)絡(luò)中由丟包造成的影響。在丟包率帶到7%的情況下,使用iLBC仍然能夠維持一個比較好的聲音質(zhì)量。所以對于你的VoIP提供商支持的編碼方式你必須進(jìn)行明智的選擇。DTMF-Relay在一些情況下,RTP協(xié)議被用來承載諸如DTMF的信號信息。RFC2833中描述了一種方法,這種方法就是將DTMF作為RTP協(xié)議中的命名事件(namedevents)進(jìn)行傳輸。在用戶代理客戶端和用戶代理服務(wù)端之間使用同一種方法進(jìn)行DTMF傳輸是非常重要的。實(shí)時控制協(xié)議(RealTimeControlProtocol-RTCP)RTCP可以對接受的質(zhì)量進(jìn)行反饋。它為RTP媒體流提供帶外控制信息。諸如抖動(Jitter),往返時延(RTT-RoundTripTime),傳輸延遲(latency)和丟包等的數(shù)據(jù)可以使用RTCP進(jìn)行搜集。RTCP通常用來對聲音質(zhì)量進(jìn)行報(bào)告。會話描述協(xié)議(SessionDescriptionProtocol-SDP)SDP協(xié)議在RFC4566中被進(jìn)行了詳細(xì)的描述。它是在用戶代理之間進(jìn)行會話參數(shù)協(xié)商之用的。媒體的細(xì)節(jié),傳輸?shù)牡刂愤€有其他與媒體相關(guān)的一些信息都使用SDP協(xié)議在用戶代理之間進(jìn)行交互。通常,INVTIE消息中包含了SDP“供給消息”,而200Ok則包含了“回答消息”。這些消息會在下面的圖中進(jìn)行展示。在下圖中,你可以觀察到GSM編碼方式被“供給”,但是另外一臺話機(jī)卻并不支持該編碼,那么然后它將使用它本身支持的編碼方式進(jìn)行“回答”,在這個例子中它支持的是G.711ulaw(PCMU)和G.729編碼方式。會話的“rtpmap:101”就是在RFC2833中描述的DTMF-relay信息。INVITE(SDPOffer)200OK(SDPAnswer)SIP協(xié)議與OSI七層模型(TheSIPProtocolandtheOSIModel)理解聲音相關(guān)協(xié)議的每一個協(xié)議對于OSI模型是屬于哪一層也是相當(dāng)重要的。VoIP服務(wù)提供商的整體框圖(TheVoIPProvider“BigPicture”)在我們開始深入的挖掘SIP代理之前,了解VoIP提供商的解決方案中的所有部件是非常重要的。服務(wù)提供者通常由多個服務(wù)器(servers)和多個服務(wù)(services)組成。這里說的服務(wù)可以根據(jù)規(guī)模的大小來決定是被安裝在一臺單獨(dú)的服務(wù)器上還是安裝在多臺機(jī)器上面。本書將在前幾個章節(jié)中按照這張圖從左到右來描述每一個部件。所有的章節(jié)中都將使用這張圖來幫助你來了解你所處的位置何在。SIP代理(SIPProxy)SIP代理是我們解決方案中的核心部件。用來負(fù)責(zé)用戶的注冊和維護(hù)位置數(shù)據(jù)庫(映射IP和SIP地址)。所有的SIP路由和消息都會被SIP代理處理,它也負(fù)責(zé)一些用戶端級別的服務(wù)譬如呼叫前轉(zhuǎn),白/黑名單,快速撥號等。這個部件從不處理媒體(RTP包),所有與媒體相關(guān)的包都從用戶代理客戶端,服務(wù)器和PSDN網(wǎng)關(guān)直接路由。用戶,管理和供給入口(User,Administration,andProvisioningPortal)用戶管理和供給入口是一個重要的部件。在入口當(dāng)中,用戶訂閱服務(wù)并且應(yīng)該能夠購買信用量,修改密碼和驗(yàn)證他/她的賬號。另一方面,管理者應(yīng)該能夠刪除用戶,改變用戶信用級別,承認(rèn),刪除權(quán)限。對于管理員來說,“供給(Provisioning)”過程使得用戶代理如IP電話,模擬話機(jī)適配器還有軟電話的自動安裝過程更加容易。PSDN網(wǎng)關(guān)(PSDN網(wǎng)關(guān))為了能和公共的交換電話網(wǎng)絡(luò)交互,PSTN網(wǎng)關(guān)是需要的。通常,這個網(wǎng)關(guān)是使用E1或T1中繼線的PSTN的接口。在這個領(lǐng)域中使用最廣泛的是來自Cisco,AudoCodes和Quintum公司的網(wǎng)關(guān)。Asterisk也占據(jù)了一定的市場份額,因?yàn)樗拿總€端口的價格要比競爭對手們便宜75%。如何評估一個網(wǎng)關(guān)的好壞,要檢查它對SIP協(xié)議擴(kuò)展的支持程度,譬如對RFC3515(REFER),RFC3891(Replaces)還有RFC3892(Referredby)。這些協(xié)議使得我們能夠在SIP代理背后進(jìn)行呼叫轉(zhuǎn)移;如果網(wǎng)關(guān)中不支持他們,進(jìn)行呼叫轉(zhuǎn)移是不太可能的事。媒體服務(wù)器(MediaServer)因?yàn)镾IP代理從不處理媒體,所以如IVRs,語音郵箱,電話會議等和媒體相關(guān)的服務(wù)要能夠在媒體服務(wù)中得到實(shí)現(xiàn)。由iptel開發(fā)的SEMSSIPExpress媒體服務(wù)器具有一些很好的特性,如conference,voicemail和announcements等。我們要再一次提到Asterisk,因?yàn)樗材軌蛴脕硖峁┻@些服務(wù)。穿透NAT的媒體代理或RTP代理(MediaProxyorRTPProxyforNatTraversal)任何SIP服務(wù)提供者必須要為他的客戶提供NAT穿透的解決方案。媒體代理就是一座幫助處在對稱式防火墻(symmetricfirewall)之后的用戶能夠訪問SIP服務(wù)提供者進(jìn)行RTP連接的橋梁。如果沒有了這些代理,服務(wù)提供者可能會流失35%的用戶。你可以使用這些部件來實(shí)現(xiàn)一個通用的NAT穿透技術(shù)。媒體代理還可以幫助你進(jìn)行記帳糾錯,比如,因?yàn)槟撤N原因,沒有收到BYE消息而導(dǎo)致了SIP對話沒有結(jié)束,結(jié)果記帳發(fā)生了錯誤等情況。RADIUS記賬(RADIUSAccounting)擁有一臺安裝了RADIUS的服務(wù)器是對通話進(jìn)行記賬的基本條件。SIP服務(wù)提供者對賬單記錄是最關(guān)心的。OpenSER可以被配置將一些記賬信息發(fā)送到一臺RADIUS服務(wù)器(比如Radiator或FreeRADIUS)上。SIP通話賬單也可以被記錄到數(shù)據(jù)庫中。但是,這樣將產(chǎn)生兩條記錄,而這兩條記錄需要手工進(jìn)行核對。用CDRTool計(jì)費(fèi)(CDRToolRating)RADIUS服務(wù)器可以記錄關(guān)于通話時長的一些信息,但是卻不能記錄每通通話的資費(fèi)信息。將資費(fèi)信息應(yīng)用到通話上是需要技巧的。這里我們使用AG項(xiàng)目組()開發(fā)的被稱為CDRTool的GPL工具。它負(fù)責(zé)將資費(fèi)應(yīng)用到通話上面。監(jiān)控工具(MonitoringTools)最后我們需要一些監(jiān)控,故障檢修和測試的工具來幫助我們定位并解決在SIP服務(wù)器上發(fā)生的一些問題。首當(dāng)其沖的當(dāng)然是協(xié)議分析工具,在余下的章節(jié)中我們將能夠看到如何使用ngrep,ethereal和tethereal。OpenSER有一個被稱為SIPtrace的模塊,我們也將使用到。哪兒能夠找到更多信息SIP協(xié)議最好的參考資料就是RFC3261。閱讀RFC確實(shí)有點(diǎn)沉悶(不過如果你有點(diǎn)失眠這確實(shí)是一種好辦法)。你可以在/rfc/rfc3261.txt上找到它。也可以在哥倫比亞大學(xué)的網(wǎng)站上找到好的SIP教程如:/~coms6181/slides/11/sip_long.pdf。也可以在/sip/上找到許多關(guān)于SIP的信息。一個非常好的教程在iptel的網(wǎng)站上:/files/sip_tutorial.pdf。下面是一個叫做SIP應(yīng)用者(SIPimplementors)的郵件列表,你可以在上面就SIP的知識進(jìn)行提問:/mailman/listinfo/sip-implementors。概要(Summary)這一章你已經(jīng)學(xué)到了什么是SIP協(xié)議以及SIP協(xié)議的功能。也知道了諸如SIP代理,SIP注冊服務(wù)器,用戶代理客戶端,用戶代理服務(wù)端,PSTN網(wǎng)關(guān)等SIP協(xié)議中的部件。還看到了SIP的體系結(jié)構(gòu),主要的消息和處理過程。以及去什么地方可以找到更多相關(guān)的信息。第二章:SIP快速路由器(TheSIPExpressRouter)上一章節(jié)中我們討論了VoIP提供商的“整體框圖”(thebigpicture)。通常,一個VoIP提供商由幾個部件構(gòu)成。這些部件根據(jù)規(guī)模的大小或駐留在同一臺機(jī)器上或分布于多個機(jī)器上面。其中的一個部件就是SIP代理,在我們的例子中代理服務(wù)器運(yùn)行的是OpenSER軟件。就像它的名字一樣,描述SER的最好的東西就是SIP路由器(aSIPRouter)。它能夠?qū)IP的頭域進(jìn)行操作并能夠以極高的速度對SIP包進(jìn)行路由。第三方的模塊給了SER極高的靈活性來完成一些原本沒有的功能,諸如NAT穿透,IMS,負(fù)載均衡等其他功能。在這一章,我們將向你展示SIP快速路由器的能力和框架。在本章的末尾,你將能夠:
解釋SIP快速路由器(SER)到底是什么
在兩個開源項(xiàng)目SER和OpenSER中作出選擇
描述對它們的使用方案
辨別出openser.cfg文件中的不同的區(qū)段
描述SIP消息的處理過程
辨別松散路由和嚴(yán)格路由
辨別SIP和SDP我們在哪兒?(WhereAreWe?)VoIP提供商的解決有很多部件。為了能夠?qū)Ω鱾€部件的聯(lián)系保持一個整體的把握,我們將在每一個章節(jié)中展示下面這張圖片。在這一章中,我們的主要的討論圍繞SIP代理部件來進(jìn)行。SIP快速路由器是什么?(WhatistheSIPExpressRouter?)SIP快速路由器是一套兼容IETFRFC3261sip協(xié)議的開源的SIP代理服務(wù)器。它的目的是兼容并包盡可能多的應(yīng)用。只需要起一個單獨(dú)的服務(wù),SER就可以以它“短小精悍”的特點(diǎn)最快速的對請求進(jìn)行前轉(zhuǎn),并能夠處理成千上萬的用戶。它被大量的VoIP的提供商所使用,也被使用在處理能力相對較弱的嵌入式IPPBX上面。它和其他一些設(shè)備的互操作性也使得它成為實(shí)際的標(biāo)準(zhǔn)。用哪個軟件,SER還是OpenSER?(Whatsoftwaretouse,SERorOpenSER?)SER最開始是由德國柏林的FhGFokus研究院所開發(fā),發(fā)布的時候是遵從GPL許可的。它的核心開發(fā)人員是AndreiPelinescu-Onciul,Bogdan-AndreiIancu,DanielConstantinMierla,JanJanak,還有JiriKuthan。之后,其他的一些人也為此作出了貢獻(xiàn),他們是JuhaHeinamen(RADIUS,ENUM,DOMAIN,URI),GregFausak(POSTGRES),MaximSobolev(NATHELPER),AdrianGeorgescu(MEDIAPROXY),ElenaRamonaModroiu(XLOG,DIAMETER,AVPOPS,SPEEDDIAL),MiklosTirpak(Permissions),等其他人。OpenSER是SER項(xiàng)目的衍生品。2004年FhGFokus進(jìn)行了SER項(xiàng)目的副產(chǎn)品的開發(fā)創(chuàng)立了。2005IPtel的商業(yè)變種被賣給了TEKELEC。核心開發(fā)團(tuán)隊(duì)一分為二。他們中的三位成員去了(AndreiPelinescu-Onciul,JanJanak,andJiriKuthan),另外兩名成員則離開FhG,創(chuàng)建了一家叫做Voice-System的公司,他們也是2005年開始的OpenSER項(xiàng)目的主要維護(hù)人員。
這本書始于2005后半年,基于SER項(xiàng)目。那個時候,我對使用SER進(jìn)行NAT穿透的解決方案很感興趣。Asterisk的可伸縮性對于(host??)SIP提供商不是足夠的好,所以我轉(zhuǎn)而投向SER的研究中。它的文檔真的很難懂,于是乎我開始撰寫自己的文檔來對SIP提供商的管理者們進(jìn)行培訓(xùn)。在電子書完成后,我發(fā)現(xiàn)SER項(xiàng)目已經(jīng)停止維護(hù)了。大部分的代碼還停留在2003年。經(jīng)過一點(diǎn)研究我找到了OpenSER項(xiàng)目。它似乎更有活力,它有更加新的模塊,更頻繁發(fā)行的版本。我于是在非常短的時間內(nèi)將所有的東西轉(zhuǎn)向了OpenSER。我不想陷入SERVSOpenSER的爭論中。這樣的爭論是毫無意義的。現(xiàn)在的事實(shí)就是,這本書是為OpenSER而寫的。OpenSER為第三方應(yīng)用程序提供了一個靈活的可插入模型。應(yīng)用程序可以被很容易的創(chuàng)建并插入服務(wù)器中。這種可插入模型給予了一些新的模塊的開發(fā),譬如RADIUS,DIAMETER,ENUM,PRESENCE還有SMS。更新的模塊每個月都會被添加進(jìn)來。你可以在/docs/modules/1.2.x上查看OpenSER1.2.x支持的模塊。它的高效和健壯使得OpenSER能夠被用來為數(shù)百萬的用戶提供服務(wù)。在最近的20073月14號的性能報(bào)告中,OpenSER1.2.x能夠處理相當(dāng)于400萬用戶的注冊請求。TM(事務(wù)模塊)能夠每小時處理2800萬通通話。完整的報(bào)告可以在/docs/openser-performance-tests/上面找到。OpenSER不僅僅被服務(wù)提供商所使用。它還可以構(gòu)造SIP應(yīng)用。目前有一些SIP防火墻(SIPfirewall),會話邊緣處理器(SessionBorderController),和負(fù)載均衡的代碼都是從OpenSER項(xiàng)目中借鑒的。LINKSYS選擇OpenSER作為它的一款PBX的平臺,可能就是因?yàn)樗馁Y源耗用少但性能高的特性吧。OpenSER靈活,移植性好并且可以擴(kuò)展。用ANSIC開發(fā)的它能夠被輕易的移植到任何平臺上。使用C語言能夠很容易的創(chuàng)建出新的模塊用于擴(kuò)展。近來,編程中的一些新的層次被添加了進(jìn)來。使用呼叫處理語言(CallProcessingLanguage)簡化路由腳本,使用Perl實(shí)時的對請求進(jìn)行處理都成為可能。WeSIP是一種應(yīng)用程序的編程接口,它允許你使用Java和Servlets創(chuàng)建SIP應(yīng)用服務(wù)對OpenSER服務(wù)器進(jìn)行擴(kuò)展。可以在上查看WeSIP。使用方案(UsageScenarios)OpenSER主要用來作為SIP代理和注冊服務(wù)器。但是,它也可以被用于其他的一些應(yīng)用當(dāng)中,比如代理分發(fā)器(Proxydispatches),Jabber網(wǎng)關(guān)(JabberGateway),與媒體網(wǎng)關(guān)和RTP代理合作來進(jìn)行NAT穿透等。支持IPv4和IPv6并且能夠支持多域。OpenSER可以被應(yīng)用在Linux,Solaris,還有FreeBSD等平臺。OpenSER本身的創(chuàng)建是為了當(dāng)作SIP代理服務(wù)器使用的。然而,利用它的新的模塊,如今,OpenSER能夠被用在如下的一些方案中:ModulesFunctionalityDISPATCHER,PATHLoadbalancingMEDIAPROXY,RTPPROXY,NATHELPERNatTraversalPRESENCEPresenceServerIMCXMPPInstantMessaging讓我們看看OpenSER的大多的使用場景吧。在所有這些場景中,OpenSER就像膠水一樣,將所有的SIP部件粘在一起。
VoIP服務(wù)提供商
即時消息服務(wù)提供商
SIP負(fù)載均衡
嵌入式IPPBX
NAT穿透
SIP.EDUOpenSER框架(OpenSERArchitecture)核心和模塊(CoreandModules)OpenSER建造在一套核心之上,這套核心負(fù)責(zé)基本的功能實(shí)現(xiàn)以及對SIP消息進(jìn)行處理。模塊則負(fù)責(zé)OpenSER的大半的功能實(shí)現(xiàn)。模塊和在腳本中使用的命令和參數(shù)一起將他們的功能性曝露在OpenSER當(dāng)中。在一個叫做openser.cfg的文件中我們對OpenSER進(jìn)行配置。這個配置文件控制著哪個模塊被加載以及他們對應(yīng)的參數(shù)。所有的SIP流程也都在此文件中定義的一些流程塊中被控制。Openser.cfg是OpenSER的主要的配置文件。Openser.cfg文件中的各個區(qū)段(SectionsoftheFileopenser.cfg)Openser.cfg文件有七個區(qū)段:
全局定義(Globaldefinitions):文件的這一部分包含了OpenSER的幾個工作參數(shù),包括SIP服務(wù)的監(jiān)聽ip端口對和debug等級。
模塊(Modules):包含了外部庫的列表,這些外部庫是核心所沒有的但卻是能夠展現(xiàn)其功能的。模塊的加載使用loadmodule。
模塊配置(Modulesconfiguratio):模塊有一些參數(shù)是需要被合適的設(shè)置的。這些參數(shù)可以使用modparam(modulename,parametername,parametervale)進(jìn)行配置。
主路由塊(Mainroutingblock):主路由塊是進(jìn)行SIP消息處理的開始之處。它控制著所有收到的消息的處理。
次要路由塊(Secondaryroutingblocks):管理員可以使用route()命令來定義新的路由塊。這些路由塊就像是OpenSER腳本中的子程序一樣。
處理響應(yīng)路由塊(Replyroutingblocks):響應(yīng)路由塊白被用來處理響應(yīng)消息,通常是200ok。
處理出錯路由塊(Failureroutingblocks):處理出錯路由塊用來處理一些出錯情況如線路繁忙(busy)或是超時(timeout)。注:這個文件的細(xì)節(jié)將在4,5,6,7,8,9章節(jié)中詳細(xì)進(jìn)行描述。會話,對話和事務(wù)(Sessions,Dialogs,andTransactions)理解一些在OpenSER處理過程中使用的SIP概念是很重要的:
SIP事務(wù)(SIPtransaction):包括一條sip消息或任何重發(fā)的和對他們的直接響應(yīng)消息(如,REGISTER和200OK)
SIP對話(SIPdialog):兩個SIP實(shí)體之間存在一段時間的關(guān)系。如,兩個UAC之間由INVITE消息到BYE消息這段時間建立的對話)
SIP會話(SIPsession):在兩個SIP實(shí)體之間的一通媒體流(音頻/視頻/文本)openser.cfg消息處理openser.cfg是為了處理收到的sip消息而執(zhí)行的一段腳本。例如:如果用戶A想要和用戶B進(jìn)行通話,它就要向B發(fā)送INVITE消息。這個消息在主路由塊中被處理。這個處理過程一直要延續(xù)到它找到t_relay()(前轉(zhuǎn))或是s1_send_reply(發(fā)送出錯信息)或是最終在塊的末尾使用exit()命令丟棄該消息。billing
SIP代理——期望的行為(SIPProxy—ExpectedBehavior)按照RFC3261中描述的SIP代理的基本的處理過程是非常重要的。如果不能很好的理解,將很難去配置代理服務(wù)器。每一個代理在將請求消息發(fā)送到下一個部件時會進(jìn)行路由抉擇,并對請求消息作些修改。響應(yīng)消息將沿著請求消息走的路線原路路由回同樣的一組代理。代理服務(wù)器既可以運(yùn)作在有狀態(tài)模式下也可以以無狀態(tài)的模式運(yùn)行。當(dāng)SIP代理服務(wù)器只是被當(dāng)作一個簡單的SIP包前轉(zhuǎn)器(forwarder)工作時,它只是按照請求消息的要求將消息包前轉(zhuǎn)到一個單獨(dú)的部件上。無狀態(tài)模式工作的代理會丟棄它所前轉(zhuǎn)的消息的任何信息。而這個特性限制則限制了對錯誤的處理和對費(fèi)用的記錄。如果OpenSER知道200Ok是和一個特定的INVITE相對應(yīng),那么我們就說它此時工作在有狀態(tài)模式下。這意味和你現(xiàn)在可以在onreply_route()塊中來對響應(yīng)消息進(jìn)行管理。而無狀態(tài)下的消息處理過程不會有上下文的處理方式。無狀態(tài)處理過程通常被用在類似負(fù)載均衡的應(yīng)用中;在腳本中使用forward()命令來處理。當(dāng)你需要更加復(fù)雜的資源如計(jì)費(fèi),呼叫前轉(zhuǎn),voicemail等時,有狀態(tài)處理方式是你所需要的。每個事務(wù)都將在內(nèi)存中被維護(hù),并且出錯信息,響應(yīng)信息和重傳信息都將和這些事務(wù)有所聯(lián)系。有狀態(tài)事務(wù)由TM(transactionmodule)處理,通常使用t_relay()命令。一個經(jīng)常會被誤解的概念是:所謂處理過程的有狀態(tài)指的是事務(wù)而不是對話。因此,一條INVITE請求消息的有狀態(tài)處理過程的結(jié)束是到收到200OK響應(yīng)為止,而不是收到BYE。狀態(tài)操作(StatefulOperation)這只是對有狀態(tài)操作的簡單描述。你會在RFC3261中找到更加完整和詳盡的描述。openser.cfg和上圖有些相似的地方。有些過程是手工完成的,如檢查Max-forwards頭域,而其他一些過程則在一條命令中即可完成。更好的說明就是,當(dāng)你調(diào)用t_relay()時,所有的就像描述中的前轉(zhuǎn)請求處理過程都將自動完成。當(dāng)處在有狀態(tài)模式下是,代理只是一個簡單的SIP事務(wù)處理器而且下面的這些處理步驟都是需要的:
驗(yàn)證請求
預(yù)處理路由信息
決定請求的目的地
前轉(zhuǎn)請求到達(dá)目標(biāo)
處理所有響應(yīng)消息有狀態(tài)代理為每一個得到的請求創(chuàng)建一個新的服務(wù)器事務(wù)(servertransaction)。該請求的任何重傳都會被該服務(wù)器事務(wù)所處理。舉個例子:對于每一個經(jīng)過我們SIP代理服務(wù)器的請求,我們都會:第一步:請求驗(yàn)證
檢查消息大小,避免緩存溢出
檢查Max-forwards頭域以檢測出是否發(fā)生回環(huán)(loops)第二步:路由信息的預(yù)處理
如果有record-route頭,處理之第三步:決定請求的目的地
目的地在定位數(shù)據(jù)庫中么?(對于注冊用戶來說)
可以路由到目的地么?(網(wǎng)關(guān)目的地)
能夠到達(dá)外部的域么?(外部地址)第四步:請求前轉(zhuǎn)
調(diào)用t_relay()函數(shù),OpenSER將在有狀態(tài)的模式下處理所有的工作任務(wù)。第五步:響應(yīng)消息的處理過程
通常這個過程會被OpenSER自動完成。有時候你可以使用onreply_route[]區(qū)段對一些響應(yīng)作出處理。譬如:在“忙則呼叫前轉(zhuǎn)”(callforwardonbusy)的情形中,我們可以使用486響應(yīng)消息將通話轉(zhuǎn)向voicemail服務(wù)器。嚴(yán)格路由和松散路由之間的區(qū)別(DifferencesbetweenStrictRoutingandLooseRouting)在路由SIP消息的過程中,有松散和嚴(yán)格兩種不同的方法。松散路由是SIP版本2中的新方法。當(dāng)使用松散路由時,R-URI從來都不會被改變,這種方法和之前的舊方法保持向后兼容。(嚴(yán)格路由RFC2543)嚴(yán)格路由的問題是開始對話前的初始化請求消息時指定所有的代理集合的過程。這種處理過程拋棄了包含在得到的R-URI中的信息。帶有帶外代理(outbound-proxy)的UA的行為是不確定的。如果其中的一個部件發(fā)生錯誤那么整個系統(tǒng)都將會出錯。解決辦法就是松散路由。這種方法將目標(biāo)從路由信息中分離。允許每一個目的地來路由消息包,并且有機(jī)制能夠保證和嚴(yán)格路由向后兼容。參數(shù);lr的使用就是對松散路由的支持象征。當(dāng)SIP服務(wù)器收到一個消息,它可以決定它自己是否處在中間位置。也就是說,如果SIP服務(wù)器不愿意待在中間位置,那么它就將信息傳遞給用戶代理的UA讓他們能夠能夠連接起來。然后消息就將在兩個用戶代理間進(jìn)行處理。而如果它想要待在中間,那么就應(yīng)該使用函數(shù)record_route()插入ROUTE頭。理解SIP和RTP(UnderstandingSIPandRTP)在理解接下來的子區(qū)段之前,你應(yīng)該要懂得一些關(guān)于SIP和RTP的知識。首先,SIP是一個使用INVITE,BYE,和CANCEL方法來控制通話的信號協(xié)議。在INVITE請求消息中的關(guān)于會話(音頻/視頻/文本)消息包含在SIP協(xié)議中,使用的是叫做SDP(SessionDescriptionProtocol)的協(xié)議來包含的這些信息。包含在SDP中的信息描述了兩個用戶代理間的一個或是更多的媒體流的配置情況。代理服務(wù)器從不參與到媒體流中,因此他對于媒體是什么都不用了解的。換句話說,無論UA和網(wǎng)關(guān)指定的媒體是什么格式,它都支持。但是有時候,B2BUA(backtobackuseragent)如媒體代理,可以安裝在同一個服務(wù)器上來處理RTP音頻(也就是NAT穿透機(jī)制)。SDP協(xié)議是供給/應(yīng)答模型(Offer/Answermodel)。SDP供給信息嵌入在INVITE請求消息中而應(yīng)答信息在在200OK的響應(yīng)消息中。舉例:摘自Ethereal:上圖中的包是一個INVITE請求消息。該請求消息中嵌入了描述會話信息的SDP包。我們可以看到這是eyeBeam軟電話產(chǎn)生的INVITE消息。它提供使用G.729編碼格式,并使用UDP的8558端口(為了安全起見,我隱藏了IP地址)。屬性rtpmap:101telephone-event/8000描述了使用的DTMF前轉(zhuǎn)方法(RFC2833)。另一個設(shè)備,在這個例子中是一個網(wǎng)關(guān),在200Ok的回復(fù)中對“供給”進(jìn)行了應(yīng)答。概要(Summary)這一章中,我們學(xué)到了什么是OpenSER以及它的主要特性。現(xiàn)在,你可以識別出openser.cfg配置文件和它的一些配置塊,如全局定義(globaldefinitions),加載模塊(loadmodules),模塊的參數(shù),主路由塊,路由塊,響應(yīng)路由塊和出錯處理路由塊。每一個代理接收的請求都按照openser.cfg腳本中的配置來進(jìn)行處理。腳本的內(nèi)容的組織幾乎和SIP有狀態(tài)代理處理過程相一致。通常OpenSER作為松散路由器來運(yùn)行(SIP版本2)。最后我們介紹了SIP和SDP的概念。第三章:OpenSER安裝(OpenSERInstallation)安裝是所有工作的開始。能夠利用源代碼正確的安裝OpenSER是非常重要的。使用Debian包或apt-get工具安裝的速度能夠快很多。但是利用源代碼安裝可以更加靈活,能夠允許你對需要什么樣的模塊的編譯進(jìn)行選擇。你不可能用Debian包安裝對RADIUSaccounting的支持。這就是我們?yōu)槭裁床皇褂萌魏嗡^的捷徑來進(jìn)行安裝的原因。另外,我強(qiáng)烈建議安裝在Debian平臺上這是個什么平臺。這是個什么平臺如果你選擇安裝在其他的平臺上,那么你必須要對初始化腳本和其他包進(jìn)行修改和處理。在本章節(jié)結(jié)束的時候,你將能夠:安裝Linux,為OpenSER的安裝做準(zhǔn)備下載OpenSER源代碼和一些依賴編譯并安裝OpenSER和其對MySQL和RADIUS的支持啟動停止運(yùn)行OpenSER配置Linux系統(tǒng)使OpenSER在系統(tǒng)啟動時運(yùn)行所需硬件(HardwareRequirements)對于OpenSER來說沒有什么所謂的最低硬件配置問題。它可以運(yùn)行在普通的PC上面。我們最大的驚喜來源于始于1.2版進(jìn)行的性能測試。一臺擁有如下配置的PC能夠支持每小時28,000,000路的完整通話。測試服務(wù)器是一臺普通的臺式機(jī),IntelCore2CPU6300@1.86GHz,1GB的內(nèi)存,100Mbs的以太網(wǎng)卡。不幸的是,到目前為止,還沒有公式可以對OpenSER進(jìn)行測量。到底什么才是好的正確的硬件選擇是依靠經(jīng)驗(yàn)判斷的。所需軟件(SoftwareRequirements)OpenSER軟件可以運(yùn)行在各種不同的平臺上,Linux,BSD,Solaris等。有些包對于Linux和Solaris的一些變種也是需要的。這些包可以從上下載到。下面的包是編譯OpenSER所必須的。Gccbison或yacc(伯克利yacc)flexGNUmakeGNUtarGNUinstallMYSQL,POSTGRES,RADIUS等一些其他的模塊還需要一些附加的包才能進(jìn)行編譯。我們將在介紹這些模塊的章節(jié)中再分別介紹。實(shí)驗(yàn)(Lab)——安裝Linux為OpenSER作準(zhǔn)備所有的這些個實(shí)驗(yàn)使用的是VMware虛擬機(jī),安裝的是DebianEtch4.0。我們使用的Linux的分支DebianEtch可以在/debian-cd/4.0_r0/i386/下載到。|警告:||這里的實(shí)驗(yàn)對電腦進(jìn)行了格式化。請?jiān)谑褂肰Mware或||是XEN運(yùn)行之前對數(shù)據(jù)進(jìn)行備份。|步驟1:插入光盤CD,使用DebianEtch4.0的CD啟動計(jì)算機(jī)。按下ENTER鍵開始安裝。在屏幕顯示上面的圖示時,你也可以對啟動和安裝選項(xiàng)進(jìn)行配置。有時候,你需要為安裝選擇一些硬件參數(shù)。如果需要按下F1打開“幫助”。步驟2:選擇語言。選擇在安裝過程中你所偏好使用的語言。步驟3:選擇鍵盤布局(keyboardlayout)。在歐洲和亞洲的一些國家,選擇鍵盤布局是比較常見的事情。步驟4:選擇主機(jī)名(Hostname)。選擇服務(wù)器的名字。這一步很重要,因?yàn)橹竽阈枰褂眠@個名字來訪問服務(wù)器。步驟5:選擇域名。域名是顯而易見的,但確實(shí)很重要的,因?yàn)镺penSER需要使用域來對用戶進(jìn)行辨別。所以,請確定保證對這一屏的選擇作出正確的回答。步驟6:選擇分區(qū)方法。關(guān)于分區(qū)我們可以寫滿一整章的內(nèi)容。Linux的熟練使用者們當(dāng)然在這里會選擇手動選項(xiàng)。但是如果只是為了學(xué)習(xí)的目的,你也可以簡單的使用“entiredisk”。一定要為你的服務(wù)器去向一位Linux專家咨詢最好的分區(qū)方法。步驟7:選擇進(jìn)行分區(qū)的磁盤現(xiàn)在,只需要選擇用來安裝Linux的磁盤即可。放到一個分區(qū)中。你得再一次的選擇如何對系統(tǒng)進(jìn)行分區(qū)。我們?nèi)匀粓?jiān)持使用默認(rèn)安裝選項(xiàng)。高級用戶可以自己進(jìn)行一些改變。步驟9:完成磁盤分區(qū)。現(xiàn)在,才只是完成分區(qū)的步驟并將這些改變寫入磁盤。如果你想要保持你的磁盤不變,那么作上面這些。因?yàn)橥瓿闪朔謪^(qū),所有磁盤之前存在的內(nèi)容都將會被刪除。所以,小心點(diǎn)為妙。我使用的是VMWare來對OpenSER做的實(shí)驗(yàn);這樣操作起來就比較自步驟8:選擇將所有的文件不要由,。因?yàn)閯?chuàng)建的是一個虛擬的機(jī)器,這樣我可以在上面安全的來完成我的工作。步驟10:將這些改變寫入磁盤這個部分是比較“恐怖”的。一定要確定你想要刪除磁盤上的所有內(nèi)容。ok,在選擇YES之前還是請多思考兩遍吧。|警告:||磁盤上所有的數(shù)據(jù)都將被銷毀|步驟11:設(shè)置時區(qū)。選擇時區(qū)。擁有正確的時區(qū)是很重要的,主要是用來進(jìn)行報(bào)告。如果你沒有正確的選擇,那么最后voicemail信息的時間將是錯誤的。步驟12:給openser設(shè)置root用戶密碼。為你的root用戶選擇一個密碼。這是系統(tǒng)上最重要的密碼。步驟13:再次輸入密碼進(jìn)行確認(rèn)。請?jiān)俅屋斎朊艽a進(jìn)行確認(rèn)。盡量使用一個很難被破解的密碼(最少8個字符,字母,數(shù)字稱開始。步驟15:為openser用戶帳號輸入用戶名。和一些其他的特殊字符,如“*”或“?!保2襟E14:為openser用戶帳號輸入全名。有些系統(tǒng)需要你創(chuàng)建至少一個用戶。讓我們使用一個完整的用戶名這個名字是我們用來登錄系統(tǒng)的用戶名。步驟16:為openser用戶帳號輸入密碼并再次輸入以進(jìn)行確認(rèn)。選擇Yes使用鏡像。輸入密碼并進(jìn)行確認(rèn)。記住,要使用難以破解的密碼。步驟17:設(shè)置安裝包管理器。在安裝的過程中,我們將使用到由Debian發(fā)行的一些包。步驟18:選擇一個鏡像國。這一屏是讓你選擇到底從什么地方下載安裝包。步驟19:選擇或你所傾向的鏡像。選擇最近的一個下載地能夠加速這些包的下載。步驟20:將HTTP代理留空,或如果你有使用HTTP代理,那么填入合適的參數(shù)。數(shù)以流行度調(diào)查,那么選擇Yes,否則選擇No。如果你使用諸如Squid或MicrosoftISAServer等的HTTP代理,那么請?zhí)钊牒线m的參使得你能夠訪問到互聯(lián)網(wǎng)進(jìn)行下載安裝包。步驟21:如果你想要參與包的包的流行度調(diào)查將產(chǎn)生一些關(guān)于那些被下載最多的包的數(shù)據(jù)。步驟22:選擇標(biāo)準(zhǔn)版系統(tǒng)。Debian有一些預(yù)定義的安裝版如“桌面版”(Desktop)。以桌面版為例,它將為Linux安裝GNOME或KDE的GUI。我們的安裝不需要GUI,所以請選擇標(biāo)準(zhǔn)版系統(tǒng)(Standardsysts安裝GRUB引導(dǎo)程序。em)。之后我們將手動安裝WebServer,MailServer,和SQL數(shù)據(jù)庫。步驟23:選擇YeGRUB是你的服務(wù)器的引導(dǎo)程序管理器。允許你進(jìn)行雙系統(tǒng)引導(dǎo)并在引導(dǎo)的過程中作一些技巧性的操作。步驟24:完成安裝。完成安裝,引導(dǎo)系統(tǒng)。系下載并安裝OpenSER1.2版(DownloadingandInstalling統(tǒng)將自動重啟。步驟25:重啟后安裝SSH。sudoapt-getinstallsshOpenSERv1.2)容易,我們也會描述整個編譯過程。這個過程更加靈活,在這份材料中我們可能需要重新編譯OpenSER數(shù)次來包含其他的一些模塊。安裝過onflexmakeopenssllibmysqlclient-devlibrng-devmysql-server不是真正的依賴,但是我們在這里安裝它|將使事情變得容易些。|d/usr/srcwget/pub/openser/1.2.2/src/openser-1.2.2-tls_src.t“exclude_modules?=”行移除mysql和任何radius相關(guān)的模塊。這樣將是編譯過程包括Md/usr/src/openser-1.2.2-tls/iMakefile變前的文件內(nèi)容如下:xclude_modules?=jabbercpl-cmysqlpapostgresospunixodbc\avp_radiusauth_radius\即使使用Debian包安裝OpenSER更程將一步一步的列舉如下:步驟1:安裝依賴。apt-getinstallgccbisadiusclient-ng2libradiusclient-|MySqlserver|步驟2:下載源代碼包并解壓。car.gztar-xzvfopenser-1.2.2-tls_src.tar.gz步驟3:使用你最喜歡的Linux編輯器來編輯Makefile從ySQL和RADIUS。cv改egroup_radiusuri_radiusxmpp\presencepuapua_mipua_usrloc\mi_xmlrpcperlsnmpstats變后的文件內(nèi)容如下:xclude_modules?=jabbercpl-cpapostgresospunixodbc\xmpp\presencepuapua_mipua_usrloc\mi_xmlrpcperlsnmpstats驟4:編譯安裝核心和模塊實(shí)驗(yàn)(——在Linux引導(dǎo)時運(yùn)行OpenSER中包含openSERd/usr/src/openser-1.2.2-tls/packaging/debian改e步cdopenser-1.2.2-tlsmakeprefix=/allmakeprefix=/install步驟5:作出需要的調(diào)整:mkdir/var/run/openserLab)步驟1:在linux引導(dǎo)ccpopenser.default/etc/default/openserit.d/openser.cfg文件并移除fork=no行(即使有c風(fēng)格的注釋)初始nser.init有必要的權(quán)限。chmod755openser步驟4:編輯/etc/default/openser.cfg,將內(nèi)存參數(shù)改為128MB,并將RUN——OPENSER改為yes。步驟5:編輯初始化腳本確定守護(hù)進(jìn)程指向正確的文件夾vi/etc/init.d/openser編輯之前的文件內(nèi)容:DAEMON=/usr/sbin/openser編輯后的文件內(nèi)容:DAEMON=/sbin/openser步驟6:重啟計(jì)算機(jī)觀察OpenSER是否啟動,確認(rèn)剛才的改動是否成功。ps-ef|grepopenser|強(qiáng)烈推薦更改你的用戶名和密碼來使用/etc/init.d/openser文件||運(yùn)行openser。|c(diǎn)popenser.init/etc/inupdate-rc.dopenserdefaults99步驟2:編輯/etc/openser/openser化腳本將尋找fork=no,即使被注釋。步驟3:確保腳本opecd/etc/init.dOpenSERv1.2目錄結(jié)構(gòu)在安裝完成后,OpenSER將創(chuàng)建文件安放架構(gòu)。了解這個架構(gòu)對于定位系統(tǒng)存儲在哪一個主文件夾中是很重要的。你需要這些消息來更新或刪除軟件。配置文件(etc/openser)openser-1:/etc/openser#ls-ltotal12-rw-r--r--1rootroot18042007-09-1014:02dictionary.radius-rw-r--r--1rootroot40772007-09-1014:05openser.cfg-rw-r--r--1rootroot12032007-09-1014:02openserctlrccd
模塊(/lib/openser/modules)opens
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版數(shù)學(xué)七年級下冊第41課時《用加減法解二元一次方程組(三)》聽評課記錄
- 湘教版數(shù)學(xué)八年級上冊2.5《第6課時 全等三角形的性質(zhì)和判定的應(yīng)用》聽評課記錄1
- 聽評課記錄英語九年級
- 人教版(廣西版)九年級數(shù)學(xué)上冊聽評課記錄21.2 解一元二次方程
- 生態(tài)自然保護(hù)游合同
- 狂犬疫苗打完免責(zé)協(xié)議書(2篇)
- 蘇科版數(shù)學(xué)八年級下冊《10.2 分式的基本性質(zhì)》聽評課記錄
- 部編版道德與法治七年級上冊第三單元第七課《親情之愛第三框讓家更美好》聽課評課記錄
- 【2022年新課標(biāo)】部編版七年級上冊道德與法治第三單元師長情誼6-7課共5課時聽課評課記錄
- 五年級數(shù)學(xué)上冊蘇教版《認(rèn)識平方千米》聽評課記錄
- 2025年個人學(xué)習(xí)領(lǐng)導(dǎo)講話心得體會和工作措施例文(6篇)
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案解析
- 豇豆生產(chǎn)技術(shù)規(guī)程
- MES運(yùn)行管理辦法
- 奢侈品管理概論完整版教學(xué)課件全書電子講義(最新)
- 文藝美學(xué)課件
- 中藥炮制學(xué)教材
- 常見腫瘤AJCC分期手冊第八版(中文版)
- 電氣第一種第二種工作票講解pptx課件
- 工程監(jiān)理監(jiān)理工作流程圖(附表123)
- 《特種設(shè)備目錄》(2022年第114號)
評論
0/150
提交評論