sip協(xié)議詳細(xì)分析與實(shí)現(xiàn)
SIPSIP(Session IniTIaTIon Protocol)是一個(gè)應(yīng)用層的信令控制協(xié)議。用于創(chuàng)建、修改和釋放一個(gè)或多個(gè)參與者的會(huì)話。這些會(huì)話可以是Internet多媒體會(huì)議 、IP電話或多媒體分發(fā)。會(huì)話的參與者可以通過(guò)組播(mulTIcast)、網(wǎng)狀單播(unicast)或兩者的混合體進(jìn)行通信。
SIP與負(fù)責(zé)語(yǔ)音質(zhì)量的資源預(yù)留協(xié)議(RSVP) 互操作。它還與若干個(gè)其他協(xié)議進(jìn)行協(xié)作,包括負(fù)責(zé)定位的輕型目錄訪問(wèn)協(xié)議(LDAP)、負(fù)責(zé)身份驗(yàn)證的遠(yuǎn)程身份驗(yàn)證撥入用戶服務(wù) (RADIUS) 以及負(fù)責(zé)實(shí)時(shí)傳輸?shù)?RTP 等多個(gè)協(xié)議。
SIP 的一個(gè)重要特點(diǎn)是它不定義要建立的會(huì)話的類型,而只定義應(yīng)該如何管理會(huì)話。有了這種靈活性,也就意味著SIP可以用于眾多應(yīng)用和服務(wù)中,包括交互式游戲、音樂(lè)和視頻點(diǎn)播以及語(yǔ)音、視頻和 Web 會(huì)議。SIP消息是基于文本的,因而易于讀取和調(diào)試。新服務(wù)的編程更加簡(jiǎn)單,對(duì)于設(shè)計(jì)人員而言更加直觀。SIP如同電子郵件客戶機(jī)一樣重用 MIME 類型描述,因此與會(huì)話相關(guān)的應(yīng)用程序可以自動(dòng)啟動(dòng)。SIP 重用幾個(gè)現(xiàn)有的比較成熟的 Internet 服務(wù)和協(xié)議,如 DNS、RTP、RSVP 等。不必再引入新服務(wù)對(duì) SIP 基礎(chǔ)設(shè)施提供支持,因?yàn)樵摶A(chǔ)設(shè)施很多部分已經(jīng)到位或現(xiàn)成可用。
對(duì) SIP 的擴(kuò)充易于定義,可由服務(wù)提供商在新的應(yīng)用中添加,不會(huì)損壞網(wǎng)絡(luò)。網(wǎng)絡(luò)中基于 SIP 的舊設(shè)備不會(huì)妨礙基于 SIP 的新服務(wù)。例如,如果舊 SIP 實(shí)施不支持新的 SIP 應(yīng)用所用的方法/標(biāo)頭,則會(huì)將其忽略。
SIP 獨(dú)立于傳輸層。因此,底層傳輸可以是采用 ATM 的 IP。SIP 使用用戶數(shù)據(jù)報(bào)協(xié)議(UDP) 以及傳輸控制協(xié)議(TCP),將獨(dú)立于底層基礎(chǔ)設(shè)施的用戶靈活地連接起來(lái)。SIP 支持多設(shè)備功能調(diào)整和協(xié)商。如果服務(wù)或會(huì)話啟動(dòng)了視頻和語(yǔ)音,則仍然可以將語(yǔ)音傳輸?shù)讲恢С忠曨l的設(shè)備,也可以使用其他設(shè)備功能,如單向視頻流傳輸功能。
通信提供商及其合作伙伴和用戶越來(lái)越渴求新一代基于 IP 的服務(wù)。如今有了 SIP(The Session IniTIation Protocol 會(huì)話啟動(dòng)協(xié)議),一解燃眉之急。SIP 是不到十年前在計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室誕生的一個(gè)想法。它是第一個(gè)適合各種媒體內(nèi)容而實(shí)現(xiàn)多用戶會(huì)話的協(xié)議,如今已成了 Internet 工程任務(wù)組 (IETF) 的規(guī)范。
SIP協(xié)議解析與實(shí)現(xiàn)SIP協(xié)議是一個(gè)基于應(yīng)用層的會(huì)話控制協(xié)議。它可以創(chuàng)建、修改、終止多媒體會(huì)話(會(huì)議),也可以邀請(qǐng)參與者加入到一個(gè)現(xiàn)有的會(huì)話。
因?yàn)镾IP是一個(gè)基于應(yīng)用層的協(xié)議,所以它不是一套完整的通訊系統(tǒng)方案,它需要和其它的方案或者協(xié)議結(jié)合起來(lái)實(shí)現(xiàn)整套系統(tǒng)。例如,實(shí)時(shí)傳輸協(xié)議(RTP)(RFC1889)用來(lái)傳輸音視頻等實(shí)時(shí)的流媒體數(shù)據(jù)。實(shí)時(shí)流協(xié)議(RTSP)(RFC2326)用來(lái)控制媒體流的傳遞。媒體網(wǎng)關(guān)控制協(xié)議(MEGACO)(RFC3015)用來(lái)控制PSTN網(wǎng)關(guān)。
由此可見(jiàn),SIP協(xié)議應(yīng)該用來(lái)組合其它協(xié)議,從而實(shí)現(xiàn)完整的服務(wù)。但是,SIP基礎(chǔ)的功能和操作不依賴于其它協(xié)議。
SIP( Session Initiation Protocol ,RFC 3261)是由 IETF (國(guó)際互聯(lián)網(wǎng)標(biāo)準(zhǔn)制定組織)制定的面向 Internet 會(huì)議和電話的信令協(xié)議。SIP是一個(gè)應(yīng)用層的協(xié)議,可以建立,修改或者中止多媒體會(huì)話或者呼叫。它是一個(gè)基于ASCII的端到端的協(xié)議,它實(shí)際上是在因特網(wǎng)上提供“約會(huì)”服務(wù)。用來(lái)實(shí)現(xiàn)VoIP的開(kāi)放協(xié)議,最常用的有三種,SIP、MGCP(Media Gateway Control Protocol)和H.323。
SIP協(xié)議是專門為 IP 電話,尤其是結(jié)合 Internet 設(shè)計(jì)的協(xié)議,同傳統(tǒng)的 H.323 協(xié)議相比,SIP 擁有明顯的優(yōu)越性:優(yōu)異的可擴(kuò)展性--大大提高了系統(tǒng)的處理能力;與 Internet 緊密結(jié)合--使通訊更加輕松便捷的;卓越的開(kāi)放性--不僅能夠?qū)κ謾C(jī)、 PDA 等移動(dòng)設(shè)備提供良好的支持,對(duì)于在線即時(shí)交流、語(yǔ)音和視頻數(shù)據(jù)傳輸?shù)榷嗝襟w應(yīng)用也能夠很好地完成。
SIP協(xié)議的特性和優(yōu)勢(shì)
與SIP兼容的協(xié)議
SIP協(xié)議可以單獨(dú)地工作,也可以與下面的協(xié)議一起工作。
二第一個(gè)例子
下面引用RFC3261的例子來(lái)說(shuō)明sip的基本功能,包括:定位終端,發(fā)送通訊請(qǐng)求,協(xié)商會(huì)話參數(shù),建立會(huì)話和撤銷建立的會(huì)話。圖1顯示了用戶Alice和Bob使用SIP交換信息的一個(gè)典型的例子(每一個(gè)消息用字母F和一個(gè)數(shù)字來(lái)標(biāo)號(hào),標(biāo)號(hào)的前面有一個(gè)簡(jiǎn)短的消息類型說(shuō)明)。在這個(gè)例子中,Alice使用一個(gè)在她的PC機(jī)中的SIP應(yīng)用程序呼叫Bob,Bob使用他的SIP電話,這個(gè)SIP電話登錄了互聯(lián)網(wǎng)。同時(shí),請(qǐng)注意兩個(gè)SIP代理服務(wù)器在Alice和Bob的會(huì)話的建立中起到的作用。
Alice呼叫Bob是使用他的SIP標(biāo)識(shí)符。SIP標(biāo)識(shí)符是一種URI(Uniform Resource Identifier),稱之為SIP URI。SIP URI格式很象email地址,包含一個(gè)用戶名和一個(gè)主機(jī)名,如:sip:bob@biloxi.com。這里biloxi.com是Bob的SIP服務(wù)提供者的域名。Alice的SIP URI是:sip:alice@atlanta.com。SIP也支持安全URI,叫做SIPS URI,例如,sips:bob@biloxi.com。一個(gè)向SIPS URI的呼叫使用加密傳輸(也就是TLS)來(lái)攜帶從呼叫者到被呼叫者所有的SIP消息。
SIP是一個(gè)與HTTP協(xié)議很像的,請(qǐng)求/應(yīng)答式的事務(wù)模型。每一個(gè)事務(wù)最少由一個(gè)要完成特定方法或功能的請(qǐng)求,和服務(wù)器端的一個(gè)應(yīng)答組成。在這個(gè)例子中,這個(gè)事務(wù)從Alice的軟電話發(fā)送一個(gè)INVITE請(qǐng)求到Bob的SIP URI開(kāi)始。INVITE是一個(gè)SIP消息,它表示請(qǐng)求者Alice想與Bob通話。INVITE請(qǐng)求包含一些頭域。頭域被稱為屬性,可以提供關(guān)于這個(gè)消息的額外信息。關(guān)于頭域我們一會(huì)兒將會(huì)詳細(xì)說(shuō)明它們。圖1中的INVITE信息(F1)可能像這樣:
第一行文本是這個(gè)請(qǐng)求的方法名(INVITE)。后面的行是多個(gè)頭域。這里只列出了最少需要的頭域。先在這里對(duì)這些頭域做一個(gè)簡(jiǎn)要的介紹:
Via頭域包含Alice希望收到對(duì)于這個(gè)請(qǐng)求的應(yīng)答的地址。也就是她告訴請(qǐng)求的接收者,應(yīng)答應(yīng)該發(fā)送到 pc33.atlanta.com。后面的branch參數(shù)是這個(gè)事務(wù)的標(biāo)識(shí)符。
To頭域包含一個(gè)顯示名(Bob)和一個(gè)SIP URI或者SIPS URI,這里是使用的SIP URI(sip:bob@biloxi.com)。這個(gè)SIP URI就是這個(gè)請(qǐng)求要發(fā)送的目標(biāo)。
From頭域也包含一個(gè)顯示名(Alice)和一個(gè)SIP URI或者SIPS URI,這里是使用的SIP
URI(sip:alice@atlanta.com)來(lái)指出請(qǐng)求的發(fā)起人。這個(gè)頭域還包含了一個(gè)tag參數(shù),這個(gè)參數(shù)包含了一個(gè)隨機(jī)字符串(1928301774),這個(gè)字符串的數(shù)字會(huì)被軟電話自動(dòng)增加,它主要起到鑒別的作用,后面還會(huì)說(shuō)明它。
Call-ID頭域包含一個(gè)全局唯一標(biāo)識(shí)符來(lái)標(biāo)識(shí)這次呼叫。這個(gè)標(biāo)識(shí)符使用一個(gè)隨即字符串和軟電話所在的主機(jī)名(或者IP地址)一起生成。這樣,To頭域、From頭域和Call-ID這三個(gè)頭域就可以唯一的確定了Alice和Bob的這條點(diǎn)對(duì)點(diǎn)的通信關(guān)系,并且將這個(gè)通信關(guān)系交給一個(gè)對(duì)話(dialog)來(lái)處理了。
Cseq頭域(命令序列)包含一個(gè)整數(shù)和一個(gè)方法名字。在這個(gè)對(duì)話中每一個(gè)新的請(qǐng)求都會(huì)增加這個(gè)整數(shù)的值,保證這個(gè)數(shù)值是有序的。
Contact頭域包含一個(gè)SIP URI或者SIPS URI指出一個(gè)能夠接觸到Alice的直接路由,一般這個(gè)SIP URI由用戶名和一個(gè)完全限定域名(FQDN)構(gòu)成。因?yàn)樵S多終端系統(tǒng)沒(méi)有注冊(cè)域名,所以也可以使用IP地址代替FQDN。Via頭域向?qū)Ψ街赋隽诉@個(gè)請(qǐng)求的應(yīng)答應(yīng)該發(fā)送到哪里,而Contact頭域向?qū)Ψ街赋隽藢?lái)的請(qǐng)求應(yīng)該發(fā)送到哪里。
Max-Forwards頭域限制了在這個(gè)請(qǐng)求傳送到目的地的時(shí)候最多可以有多少跳。它包含一個(gè)整數(shù),在每一跳這個(gè)整數(shù)都會(huì)被減少。
Content-Type頭域描述消息體的類型(在這個(gè)例子里消息體采用了SDP描述,但是消息體內(nèi)容沒(méi)有給出)。
Content-Length頭域指出了消息體的字節(jié)數(shù)。
在后面我們將完整的介紹SIP頭域(RFC3261第20節(jié))。
在會(huì)話中像媒體類型、編碼方式、采樣率等信息都不使用SIP描述,而是在消息體中使用其它會(huì)話描述協(xié)議的格式。這個(gè)例子中采用了SDP描述(RFC2327)。
軟電話不知道Bob或者擁有biloxi.com域名的SIP服務(wù)器,它將INVITE請(qǐng)求發(fā)送給為Alice提供服務(wù)的域名為atlanta.com的SIP服務(wù)器。關(guān)于Alice如何獲得atlanta.com SIP服務(wù)器的地址,可以使用由Alice的軟電話指定,或者使用DHCP探測(cè)到等方式。
atlanta.com SIP服務(wù)器是一個(gè)SIP代理服務(wù)器。一個(gè)代理服務(wù)器接收SIP請(qǐng)求,為請(qǐng)求的發(fā)送者轉(zhuǎn)發(fā)請(qǐng)求。在這個(gè)例子中,代理服務(wù)器接收到INVITE請(qǐng)求后發(fā)送一個(gè)100應(yīng)答(Trying)給Alice的軟電話。100應(yīng)答(Trying)指出這個(gè)INVITE請(qǐng)求已經(jīng)被代理服務(wù)器接收到,并且已被經(jīng)進(jìn)一步向目的地路由。
SIP中的應(yīng)答使用3位數(shù)字表示,每一個(gè)編號(hào)都表示一個(gè)描述短語(yǔ)。這個(gè)100應(yīng)答(Trying)也同樣包含和INVITE請(qǐng)求一樣的To、From、Call-ID、CSeq和Via以及branch參數(shù),這樣可以使Alice的軟電話知道這個(gè)應(yīng)答是對(duì)應(yīng)發(fā)送的INVITE請(qǐng)求的。atlanta.com代理服務(wù)器定位出biloxi.com代理服務(wù)器(這可能需要通過(guò)域名解析服務(wù)器(DNS)等實(shí)現(xiàn),后面還會(huì)詳細(xì)講解)獲得了它的IP地址,并且準(zhǔn)備把INVITE請(qǐng)求轉(zhuǎn)發(fā)給biloxi.com代理服務(wù)器。在轉(zhuǎn)發(fā)請(qǐng)求之前,atlanta.com代理服務(wù)器增加了一個(gè)額外的Via頭域,這個(gè)Via頭域包含自己的地址(這時(shí)候這個(gè)INVITE請(qǐng)求的第一個(gè)Via頭域包含Alice的軟電話的地址)。
biloxi.com代理服務(wù)器接收到這個(gè)INVITE請(qǐng)求,并且也發(fā)送一個(gè)100(Trying)應(yīng)答給atlanta.com代理服務(wù)器指出它已經(jīng)接收到這個(gè)INVITE請(qǐng)求,并正在處理這個(gè)請(qǐng)求。biloxi.com代理服務(wù)器知道Bob的IP地址(這可能需要定位服務(wù)),它又在這個(gè)INVITE請(qǐng)求中加入了一個(gè)新的Via頭域,值為自己的地址,然后它把這個(gè)INVITE請(qǐng)求發(fā)送給Bob的SIP電話。
Bob的SIP電話接收到這個(gè)INVITE請(qǐng)求,發(fā)送一個(gè)180(Ringing)應(yīng)答,同時(shí)使用鈴聲通知Bob有一個(gè)來(lái)自Alice的呼叫,讓Bob決定是否接聽(tīng)。這個(gè)180(Ringing)應(yīng)答反向經(jīng)過(guò)這兩個(gè)代理服務(wù)器被發(fā)送到Alice。每一個(gè)代理服務(wù)器使用Via頭域決定向哪里發(fā)送這個(gè)應(yīng)答,并且把移除它自己添加的Via頭域。這樣,雖然只有初始的INVITE請(qǐng)求發(fā)送的時(shí)候使用了DNS服務(wù)和定位服務(wù),而這個(gè)180(Ringing)應(yīng)答沒(méi)有使用,同時(shí)代理服務(wù)器也不需要記錄整個(gè)通訊的狀態(tài),但是這個(gè)應(yīng)答還是能夠成功的發(fā)送給請(qǐng)求的發(fā)送者Alice。
當(dāng)alice的軟電話接收到180(Ringing)應(yīng)答后,它將這個(gè)消息告訴給Alice,也許使用一個(gè)聲音(彩鈴)或者在Alice的屏幕上顯示一個(gè)消息。
在這個(gè)例子中,Bob決定接聽(tīng)電話,當(dāng)他按下接聽(tīng)按鈕時(shí),他的SIP電話發(fā)送200(OK)應(yīng)答表示接受了這個(gè)呼叫。這個(gè)200(OK)應(yīng)答包含一個(gè)消息體,消息體使用SDP描述Bob準(zhǔn)備和Alice建立的會(huì)話的媒體類型等信息。這樣,Alice和Bob交換了一次SIP信息:Alice用INVITE請(qǐng)求發(fā)送一次給Bob,Bob用200(OK)應(yīng)答發(fā)送一次給Alice。這個(gè)交換實(shí)現(xiàn)了基本的協(xié)商能力和簡(jiǎn)單的offer/answer模型。如果Bob不希望接聽(tīng)電話,或者他現(xiàn)在正忙(接聽(tīng)其它電話),那么他會(huì)發(fā)送一個(gè)錯(cuò)誤應(yīng)答而不是200(OK)應(yīng)答。一個(gè)錯(cuò)誤應(yīng)答將不會(huì)建立會(huì)話。
Bob發(fā)送的200(OK)應(yīng)答可能是這樣的:
應(yīng)答的第一行包含一個(gè)應(yīng)答代碼(200)和一個(gè)解釋短語(yǔ)(OK)。其它行就是應(yīng)答的頭域。Via,To,F(xiàn)rom,Call-ID和CSeq頭域的值都從INVITE請(qǐng)求拷貝而來(lái)(這時(shí)候應(yīng)該有3個(gè)Via頭域,分別由Alice的SIP軟電話,atlanta.com代理服務(wù)器,和biloxi.com代理服務(wù)器添加)。Bob的SIP電話添加一個(gè)tag參數(shù)到To頭域。以后所有的屬于這個(gè)對(duì)話的請(qǐng)求和應(yīng)答都要包含這個(gè)tag參數(shù)。
當(dāng)Alice的軟電話接收到這個(gè)200(OK)應(yīng)答后,馬上停止響鈴并顯示呼叫已經(jīng)被接聽(tīng)了。最后,Alice發(fā)送一個(gè)確認(rèn)信息(ACK)給Bob的SIP電話,表示自己收到了最終應(yīng)答(200(OK))。這個(gè)例子中的最終應(yīng)答由Alice直接發(fā)送給了Bob,這是因?yàn)锳lice的軟電話從Contact頭域里面可以得到Bob的地址信息。通過(guò)INVITA/200/ACK的三步握手,SIP會(huì)話就建立起來(lái)了。關(guān)于SIP會(huì)話建立的詳細(xì)步驟請(qǐng)參看RFC3261第13節(jié)。
現(xiàn)在Alice和Bob的多媒體會(huì)話已經(jīng)建立起來(lái)了,他們可以發(fā)送通過(guò)SDP協(xié)商好的格式的媒體數(shù)據(jù)了。一般來(lái)說(shuō),媒體數(shù)據(jù)包的傳輸與SIP消息的傳輸采用不同的通信方式。SIP消息大多通過(guò)代理服務(wù)器轉(zhuǎn)發(fā),而媒體數(shù)據(jù)多使用點(diǎn)對(duì)點(diǎn)的傳輸。
在會(huì)話過(guò)程中,無(wú)論是Alice還是Bob決定改變這個(gè)媒體會(huì)話,都要通過(guò)發(fā)送一個(gè)re-INVITE請(qǐng)求。這個(gè)re-INVITE請(qǐng)求包含新的媒體描述(可能是SDP),它不會(huì)建立新的會(huì)話,而是修改當(dāng)前已經(jīng)存在的會(huì)話。對(duì)方接收到這個(gè)請(qǐng)求后,發(fā)送一個(gè)200(OK)同意這個(gè)改變,最后請(qǐng)求者發(fā)送ACK。如果對(duì)方不同意這個(gè)修改,可能會(huì)發(fā)送一個(gè)錯(cuò)誤應(yīng)答,比如488(不接受)。但是這個(gè)失敗應(yīng)答不會(huì)使已存在的會(huì)話退出,而是繼續(xù)使用以前協(xié)商的媒體進(jìn)行通信。關(guān)于修改一個(gè)會(huì)話的詳細(xì)說(shuō)明,請(qǐng)參看RFC3261第14節(jié)。
最后,Bob發(fā)送BYE消息掛斷電話。BYE消息直接發(fā)送到Alice的軟電話。Alice發(fā)送200(OK)確定接收到了BYE消息,并且終止這個(gè)會(huì)話。Bob不用發(fā)送ACK,因?yàn)锳CK只有在接收到對(duì)INVITE的應(yīng)答時(shí)才被發(fā)送。關(guān)于終止一個(gè)會(huì)話更詳細(xì)的說(shuō)明,請(qǐng)參看RFC3261第15節(jié)。還有一個(gè)問(wèn)題就是關(guān)于biloxi.com服務(wù)器如何獲得Bob的位置。Bob的SIP電話開(kāi)機(jī)的時(shí)候會(huì)向一個(gè)注冊(cè)服務(wù)器發(fā)送REGISTER消息。REGISTER消息的作用是將Bob的SIP URI或者SIPS URI與Bob當(dāng)前使用的電話地址進(jìn)行幫定,并將這個(gè)幫定信息保存到數(shù)據(jù)庫(kù)中,這被稱之為定位服務(wù)(location service)。biloxi.com代理服務(wù)器使用定位服務(wù)獲得Bob的地址。注冊(cè)服務(wù)器、代理服務(wù)器、定位服務(wù)器都是邏輯上的服務(wù)器,而不是物理上的服務(wù)器,所以他們可以位于同一臺(tái)服務(wù)器上。